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

时间:2018-07-04 12:01:45

标签: powershell iis powershell-v4.0 powershell-remoting

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

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

自然地,我的问题是如何获取本地计算机中所有远程服务器的列表。我不想在远程服务器上收集每个列表。

$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

3 个答案:

答案 0 :(得分:0)

您可以这样返回此文件的内容:

$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 :(得分:0)

  1. 创建一个数组以保存结果
  2. C:\Temp\list.txt使用Write-Output而不是输出并将其保存到变量中
  3. 提示,为ServerName创建带有列的自定义对象,以便您可以在结果中识别它。
  4. 将每个结果添加到数组
  5. 此外,您无需每次都创建一个新会话,只需使用-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应该拥有所有内容。

答案 2 :(得分:0)

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

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