我有一个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

这已经可能了,我正在忽略一些东西吗?还是将我的计算机列表分成多个块并逐个扫描每个块(导致运行时间更长)的最佳解决方案?

最佳答案

您可以使用作业,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 以获取易于使用的运行空间实现

关于powershell - 正在处理从Invoke-Command返回的数据吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37125463/

10-13 06:05