运行 在所有遥控器上执行命令并使用 powershell 在本地计算机上获取结果

Run command on all remotes and get results on local machine with powershell

我想 运行 在所有远程服务器(大约 100 台服务器)上远程执行一个命令。此命令收集所有 iis 并保存在一个 txt 文件中。

(C:\Windows\System32\inetsrv\appcmd.exe list app >C:\Temp\list.txt)

当然我的问题是如何在我的本地获取所有遥控器的列表machine.I不想收集遥控器服务器上的每个列表。

$Servers = @("remotemachine1", "remotemachine2", "remotemachine3" )


foreach ($server in $Servers) {

    $PSSession=New-PsSession -ComputerName $server

    Invoke-command -Session $PSSession -ScriptBlock {

        Write-Verbose -Message "Server: $env:ComputerName" -Verbose


        C:\Windows\System32\inetsrv\appcmd.exe list app >C:\Temp\list.txt

    }
}
Get-PSSession | Remove-PSSession

您可以 return 此文件的内容如下:

$Servers = @("remotemachine1", "remotemachine2", "remotemachine3" )


foreach ($server in $Servers) {

    $PSSession=New-PsSession -ComputerName $server

    $result = Invoke-command -Session $PSSession -ScriptBlock {

        Write-Verbose -Message "Server: $env:ComputerName" -Verbose


        return (C:\Windows\System32\inetsrv\appcmd.exe list app)
    }

    $result > C:\Temp\list.txt
}
Get-PSSession | Remove-PSSession
  1. 创建一个数组来保存结果
  2. 而不是输出它 C:\Temp\list.txt 使用,Write-Output 并将它保存到一个变量
  3. 提示,为 ServerName 创建一个带有列的自定义对象,以便您可以在结果中识别它。
  4. 将每个结​​果添加到数组
  5. 也不需要每次都新建session,只需要使用-ComputerName参数

所以:

$Array = New-Object System.Collections.ArrayList
$Servers = @("remotemachine1", "remotemachine2", "remotemachine3" )

foreach ($server in $Servers) {

$Results = Invoke-command -ComputerName -ScriptBlock {
    Write-Verbose -Message "Server: $env:ComputerName" -Verbose
    Write-Output (C:\Windows\System32\inetsrv\appcmd.exe list app)
}

$Row = "" | Select Server,Results
$Row.Server = $Server
$Row.Results = $Results
[void]$Array.Add($Row)

}

最后 $Array 应该能撑得住。

您还可以将调用命令通过管道传输到文件中

invoke-command -session $pssession -scriptblock { commands on remote machine } | out-file -literalpath "c:\temp$server-results.txt"