使用流水线命令同步写入foreach内部的命令行

时间:2019-07-01 15:44:58

标签: powershell powercli

我有以下代码:

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

附录: 添加带有一些建议的屏幕截图-不幸的是,它们都不起作用: enter image description here

reddit的建议也不起作用:https://www.reddit.com/r/PowerShell/comments/8hvjyn/output_delay/

enter image description here

在末尾添加一个暂停: enter image description here

在末尾添加暂停和外主机: enter image description here

2 个答案:

答案 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的资源池并对其进行测试之后,我能够看到它运行正常。