首页 > 解决方案 > 使用流水线命令同步写入 foreach 内的命令行

问题描述

我有以下代码:

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 循环之前等待管道完成。

PS 我能够确定问题出在管道上,因为当我移除 for each 内部的管道时,我得到了我所期望的。

我尝试了 PPS 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/

在此处输入图像描述

在末尾添加暂停: 在此处输入图像描述

最后添加 pause 和 Out-Host : 在此处输入图像描述

标签: powershellpowercli

解决方案


如何在执行下一个 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
}

推荐阅读