Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell:尝试从服务器列表中的多个驱动器中查找文件_Powershell - Fatal编程技术网

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

Powershell:尝试从服务器列表中的多个驱动器中查找文件,powershell,Powershell,我正试图(但失败)做到: 通过遍历列表连接到服务器 确认文件存在的位置(3个位置中的1个) 替换该文件中的字符串 我尝试了多种方法。我有两个可以做我想做的事情 有没有人能帮我理解一下,如果我做的事情效率低下,或者如何把这些放在一起 这一个可以循环通过服务器并找到文件 $ErrorActionPreference = 'SilentlyContinue' $nope=$null $servers= Get-Content C:\Servers.txt foreach ($server in $s

我正试图(但失败)做到:

  • 通过遍历列表连接到服务器
  • 确认文件存在的位置(3个位置中的1个)
  • 替换该文件中的字符串
  • 我尝试了多种方法。我有两个可以做我想做的事情

    有没有人能帮我理解一下,如果我做的事情效率低下,或者如何把这些放在一起

    这一个可以循环通过服务器并找到文件

    $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将所有服务器名称连接在一起,而不是像我希望的那样创建数组/换行符。