我有一个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
这是否已经可以,我忽略了什么?或者是将计算机列表拆分为块并逐个扫描每个块(导致运行时间更长)的最佳解决方案?
答案 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
以获得易于使用的运行空间实现