处理从 Invoke-Command 收到的返回数据?
Processing data returned from Invoke-Command as it's received?
我有一个 PowerShell 脚本,我想在 5,000 多个端点上 运行。该脚本列举了关于每个主机的一堆信息,然后我希望能够将这些信息提取到另一个程序中进行分析。
我遇到的问题是 Invoke-Command 不允许我处理从每台机器收到的返回数据。这是一个问题,因为有 5,000 多个端点,我 运行 进入我正在 运行 调用命令的机器上的内存限制。
理想情况下,我希望每次收到机器的响应时都能执行一个脚本块。类似这样的东西,例如:
$ProcessOutput = {
# $_ = Data returned from one machine
$_ | Out-File ($_.PSComputerName)
}
Invoke-Command -FilePath $ScriptPath -ComputerName $Computers -ProcessingScriptBlock $ProcessOutput
这已经可行了吗?我忽略了什么?或者最好的解决方案是将我的计算机列表分成块并逐个扫描每个块(导致更长的 运行 次)?
您可以使用作业、foreach -parallel
(在工作流中)或 运行spaces(比作业更快,但更复杂)来 运行 并行工作负载。这是一个使用最容易阅读的作业的示例。
$ProcessOutput = {
# $_ = Data returned from one machine
$_ | Out-File "$($_.PSComputerName).txt"
}
$Computers = "localhost", "frode-pc"
#Start job
$mainjob = Invoke-Command -FilePath $ScriptPath -ComputerName $Computers -AsJob
#Process results as they complete
while ($mainjob.State -eq "Running") {
$mainjob.ChildJobs | Where-Object { $_.State -eq 'Completed' } | Receive-Job | ForEach-Object $ProcessOutput
}
#Process last job(s)
$mainjob.ChildJobs | Where-Object { $_.State -eq 'Completed' } | Receive-Job | ForEach-Object $ProcessOutput
如果性能很重要,请使用 运行空格。查看 Invoke-Parallel
以获得 运行spaces
的易于使用的实现
我有一个 PowerShell 脚本,我想在 5,000 多个端点上 运行。该脚本列举了关于每个主机的一堆信息,然后我希望能够将这些信息提取到另一个程序中进行分析。
我遇到的问题是 Invoke-Command 不允许我处理从每台机器收到的返回数据。这是一个问题,因为有 5,000 多个端点,我 运行 进入我正在 运行 调用命令的机器上的内存限制。
理想情况下,我希望每次收到机器的响应时都能执行一个脚本块。类似这样的东西,例如:
$ProcessOutput = {
# $_ = Data returned from one machine
$_ | Out-File ($_.PSComputerName)
}
Invoke-Command -FilePath $ScriptPath -ComputerName $Computers -ProcessingScriptBlock $ProcessOutput
这已经可行了吗?我忽略了什么?或者最好的解决方案是将我的计算机列表分成块并逐个扫描每个块(导致更长的 运行 次)?
您可以使用作业、foreach -parallel
(在工作流中)或 运行spaces(比作业更快,但更复杂)来 运行 并行工作负载。这是一个使用最容易阅读的作业的示例。
$ProcessOutput = {
# $_ = Data returned from one machine
$_ | Out-File "$($_.PSComputerName).txt"
}
$Computers = "localhost", "frode-pc"
#Start job
$mainjob = Invoke-Command -FilePath $ScriptPath -ComputerName $Computers -AsJob
#Process results as they complete
while ($mainjob.State -eq "Running") {
$mainjob.ChildJobs | Where-Object { $_.State -eq 'Completed' } | Receive-Job | ForEach-Object $ProcessOutput
}
#Process last job(s)
$mainjob.ChildJobs | Where-Object { $_.State -eq 'Completed' } | Receive-Job | ForEach-Object $ProcessOutput
如果性能很重要,请使用 运行空格。查看 Invoke-Parallel
以获得 运行spaces