运行 在所有遥控器上执行命令并使用 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
- 创建一个数组来保存结果
- 而不是输出它
C:\Temp\list.txt
使用,Write-Output
并将它保存到一个变量
- 提示,为 ServerName 创建一个带有列的自定义对象,以便您可以在结果中识别它。
- 将每个结果添加到数组
- 也不需要每次都新建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"
我想 运行 在所有远程服务器(大约 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
- 创建一个数组来保存结果
- 而不是输出它
C:\Temp\list.txt
使用,Write-Output
并将它保存到一个变量 - 提示,为 ServerName 创建一个带有列的自定义对象,以便您可以在结果中识别它。
- 将每个结果添加到数组
- 也不需要每次都新建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"