Powershell:尝试从服务器列表中的多个驱动器中查找文件
我正试图(但失败)做到:Powershell:尝试从服务器列表中的多个驱动器中查找文件,powershell,Powershell,我正试图(但失败)做到: 通过遍历列表连接到服务器 确认文件存在的位置(3个位置中的1个) 替换该文件中的字符串 我尝试了多种方法。我有两个可以做我想做的事情 有没有人能帮我理解一下,如果我做的事情效率低下,或者如何把这些放在一起 这一个可以循环通过服务器并找到文件 $ErrorActionPreference = 'SilentlyContinue' $nope=$null $servers= Get-Content C:\Servers.txt foreach ($server in $s
$ErrorActionPreference = 'SilentlyContinue'
$nope=$null
$servers= Get-Content C:\Servers.txt
foreach ($server in $servers)
{
If (Test-Connection -ComputerName $server -Quiet)
{Invoke-Command -ComputerName $server -ScriptBlock {$file=(Get-Childitem -Path C:\DiskSpace.ps1, D:\DiskSpace.ps1, Y:\DiskSpace.ps1); Write-Host "Found $file on $env:computername."}}
Else {
Write-Host ">> Could not connect to $server."; $nope += $server}
}
Write-Host $nope
…这一个至少可以找到一个本地文件
$valid=@('')
$paths = @("C:\Users\user_name\Desktop\DiskSpace.ps1","C:\DiskSpace.ps1","D:\DiskSpace.ps1","Y:\DiskSpace.ps1")
Foreach ($path in $paths)
{
if (Test-Path $path)
{$valid += $path}
}
write-host $valid
下面是我打算如何替换字符串:
$ErrorActionPreference = 'SilentlyContinue'
$find=(Get-Childitem -Path C:\, D:\, Y:\ -include DiskSpace.ps1 -Recurse)
Write-Host $find
$ErrorActionPreference = 'Stop'
try {
(Get-Content $find).replace('bad_email@domain.com', 'good_email@domain.com') | Set-Content $find
}
catch {
}
Get-Content $find
你已经拥有了所有的作品。只需在
Invoke命令
中为每个文件循环执行Get Content
命令
$ErrorActionPreference = 'SilentlyContinue'
$servers = Get-Content C:\Servers.txt
$files = @('C:\DiskSpace.ps1', 'D:\DiskSpace.ps1', 'Y:\DiskSpace.ps1')
$report = foreach ($server in $servers) {
if (Test-Connection -ComputerName $server -Quiet) {
$response = Invoke-Command -ComputerName $server -ScriptBlock {
Get-Childitem -Path $using:files | ForEach-Object {
(Get-Content $_).replace('bad_email@domain.com', 'good_email@domain.com') | Set-Content $_
[PSCustomObject]@{
Name = $env:COMPUTERNAME
Message = "$($_.fullname) updated."
}
}
}
if ($response -eq $null) {
[PSCustomObject]@{
Name = $env:COMPUTERNAME
Message = "No files found"
}
} else {
$response
}
} else {
[PSCustomObject]@{
Name = $env:COMPUTERNAME
Message = "Unreachable"
}
}
}
$report
你在挣扎哪一步?加载服务器列表、连接到服务器或在服务器上查找文件?您也可以远程使用
测试路径
(如果您有凭据),例如:if(测试路径\\$server\c$\DiskSpace.ps1){Get Content[…]| Set Content[…]}
@Avshalom-我确实有凭据。我现在就试试你的建议,看看我能走多远。@Persistent13-我有几件事要做。。。1) 找到第一个目录后,如何离开Get-Childitem/Test-Path循环?2) 写信给我想要的主人。3) 第一个脚本中的$nope+=$server将所有服务器名称连接在一起,而不是像我希望的那样创建数组/换行符。