Powershell:尝试从服务器列表中查找多个驱动器中的文件

时间:2017-09-14 18:37:34

标签: powershell

我正在尝试(并且失败):

  1. 通过遍历列表连接到服务器。
  2. 确认文件所在的位置(3个位置中的1个)。
  3. 替换该文件中的字符串。
  4. 我试过多种方式。我有两个可以做我想做的事情的一部分。

    有人可以帮我理解是否有什么东西我效率低下或者如何将所有这些放在一起?

    这个可以遍历服务器并找到文件

    $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
    

1 个答案:

答案 0 :(得分:1)

你已经拥有了所有的东西。只需在Get-Content

中为每个文件循环遍历Invoke-Command命令
$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