Powershell 在调用命令时处理从调用命令返回的数据';收到了什么?

Powershell 在调用命令时处理从调用命令返回的数据';收到了什么?,powershell,powershell-remoting,invoke-command,Powershell,Powershell Remoting,Invoke Command,我有一个PowerShell脚本,希望在5000多个端点上运行。该脚本列举了关于每个主机的一组信息,然后我希望能够将这些信息吸收到另一个程序中进行分析 我遇到的问题是,Invoke命令不允许我在接收到从每台机器返回的数据时处理这些数据。这是一个问题,因为对于5000多个端点,我在运行Invoke命令的机器上遇到了内存限制 理想情况下,我希望每次收到机器的响应时都能执行一个脚本块。类似于此,例如: $ProcessOutput = { # $_ = Data returned from o

我有一个PowerShell脚本,希望在5000多个端点上运行。该脚本列举了关于每个主机的一组信息,然后我希望能够将这些信息吸收到另一个程序中进行分析

我遇到的问题是,Invoke命令不允许我在接收到从每台机器返回的数据时处理这些数据。这是一个问题,因为对于5000多个端点,我在运行Invoke命令的机器上遇到了内存限制

理想情况下,我希望每次收到机器的响应时都能执行一个脚本块。类似于此,例如:

$ProcessOutput = {
    # $_ = Data returned from one machine    
    $_ | Out-File ($_.PSComputerName)
}

Invoke-Command -FilePath $ScriptPath -ComputerName $Computers -ProcessingScriptBlock $ProcessOutput

这已经有可能了,而我却忽略了什么?或者,最好的解决方案是将我的计算机列表分割成块,然后逐个扫描每个块(导致更长的运行时间)?

您可以使用作业、
foreach-parallel
(在工作流中)或运行空间(比作业更快,但更复杂)来运行并行工作负载。下面是一个使用作业的示例,这是最容易阅读的

$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

如果性能至关重要,请使用运行空间。查看一个易于使用的运行空间实现,它可以让您以类似于PSJobs的方式使用运行空间,但效果更好。我们将查看它。在我的回答中添加了
Invoke Parallel
,作为运行空间解决方案。我通常用我自己自制的运行空间脚本模板手动完成(我有几个使用不同超时系统):-)