处理从Invoke-Command收到的数据?

时间:2016-05-09 21:07:11

标签: powershell powershell-remoting invoke-command

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

我遇到的问题是Invoke-Command不允许我处理从每台机器收到的数据。这是一个问题,因为有5,000多个端点我在运行Invoke-Command的机器上遇到内存限制。

理想情况下,我希望每次收到来自计算机的响应时都能执行脚本块。与此类似的东西,例如:

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

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

这是否已经可以,我忽略了什么?或者是将计算机列表拆分为块并逐个扫描每个块(导致运行时间更长)的最佳解决方案?

1 个答案:

答案 0 :(得分:1)

您可以使用作业,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

如果性能至关重要,请使用运行空间。查看Invoke-Parallel以获得易于使用的运行空间实现