Синхронная запись в командную строку внутри foreach с помощью конвейерной команды - PullRequest
1 голос
/ 01 июля 2019

У меня есть следующий код:

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 Мне удалосьопределите, что проблема связана с конвейером, потому что, когда я удаляю канал внутри для каждого, я получаю то, что ожидаю.

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

ADDENDUM : добавление скриншотов с некоторыми предложениями - к сожалению, ни одно из нихработа: enter image description here

Предложение от Reddit также не работает: https://www.reddit.com/r/PowerShell/comments/8hvjyn/output_delay/

enter image description here

Добавлениепауза в конце: enter image description here

Добавление паузы и Out-Host в конце: enter image description here

Ответы [ 2 ]

1 голос
/ 01 июля 2019

как дождаться завершения конвейера перед выполнением следующего цикла 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
}
0 голосов
/ 02 июля 2019

Решил проблему: это была моя личная ошибка. Я тестировал пулы ресурсов, где единственным пулом ресурсов, в котором были виртуальные машины, был последний. После того, как я изменил его на пул ресурсов, содержащий несколько виртуальных машин, и проверил его, я смог убедиться, что он работает нормально.

...