我有以下代码:
Get-ResourcePool -Server 1.1.1.1 | Where-Object {$_.Name -like 'XX*'} | foreach {
Write-Host $_.Name -ForegroundColor Red
Get-ResourcePool -Name $_.Name | Get-VM
}
由于管道的原因,异步执行-所有的Write-Host输出都出现在控制台上,然后才从Get-ResourcePool获得结果。
问题:如何使其同步-如何在执行下一个foreach周期之前等待管道完成。
P.S。我能够确定问题出在管道上,因为当我删除每个管道中的管道时,都能得到期望的结果。
P.P.S我尝试了Start-Job -ScriptBlock { Get-ResourcePool -Name $Input | Get-VM } -InputObject "$_.Name"
,然后等待作业完成-但这不起作用,原因是在此命令运行时我需要连接到vCenter,所以我得到:
7/1/2019 6:37:49 PM Get-ResourcePool You are not currently connected to any servers. Please connect first using a Connect cmdlet.
+ CategoryInfo : ResourceUnavailable: (:) [Get-ResourcePool], ViServerConnectionException
+ FullyQualifiedErrorId : Core_BaseCmdlet_NotConnectedError,VMware.VimAutomation.ViCore.Cmdlets.Commands.GetResourcePool
+ PSComputerName : localhost
附录: 添加带有一些建议的屏幕截图-不幸的是,它们都不起作用:
reddit的建议也不起作用:https://www.reddit.com/r/PowerShell/comments/8hvjyn/output_delay/
答案 0 :(得分:1)
在执行下一个foreach周期之前,我如何等待管道完成。
您可以使用Out-Default
强制向主机应用程序同步输出:
Get-ResourcePool -Server 1.1.1.1 | Where-Object {$_.Name -like 'XX*'} | ForEach-Object {
Write-Host $_.Name -ForegroundColor Red
Get-ResourcePool -Name $_.Name | Get-VM | Out-Default
}
答案 1 :(得分:0)
解决了这个问题:这是我个人的错误。我正在使用资源池进行测试,其中具有任何VM的唯一资源池是最后一个。将其更改为包含多个VM的资源池并对其进行测试之后,我能够看到它运行正常。