【发布时间】:2019-07-01 15:44:58
【问题描述】:
我有以下代码:
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 循环之前等待管道完成。
附:我能够确定问题出在管道上,因为当我移除 for each 内部的管道时,我得到了我期望的结果。
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/
【问题讨论】:
-
您看到的是在 psv3 中添加的
output stream to host delay。 [sigh ...] 每当您将直接和间接输出混合到屏幕上时,间接输出都会延迟 [约 300 毫秒],以允许 PoSh 对“相似”的事物进行分组。通常的解决方法是 [A] 不要这样做 [混合直接主机输出和间接输出流输出] ...或 ... [B] 使用-Hostcmdlet 之一强制直接输出。 ///// 我怀疑您可以将Out-Host添加到要添加到即时主机显示的任何行中。 -
写输出而不是写主机?写主机 6>&1?
-
我不确定我是否听懂了你所说的。如果我复制您的代码,减去服务器参数,我看不到相同的输出。示例:``` PS /Users/kruddy> Get-ResourcePool | Where-Object {$_.Name -notlike 'Resources'} | foreach { >> 写入主机 $_.Name -ForegroundColor Red >> Get-ResourcePool -Name $_.Name | Get-VM >> } Development Name PowerState Num CPUs MemoryGB ---- ---------- -------- -------- aaaaaa PoweredOff 4 7.859 Management zzzzzzz PoweredOn 4 16.000 ```
-
今天将尝试
Out-Host后者并让您知道! -
@MindaugasBernatavičius - 现在,尝试在
| Get-VM之后添加| Out-Host,看看是输出流延迟还是其他什么... [grin]跨度>
标签: powershell powercli