powershell - 使用流水线命令同步写入 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/
解决方案
如何在执行下一个 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
}
推荐阅读
- node.js - 如何从 NodeJS 服务器下载 React 中的文件?(获取文件损坏)
- php - Laravel 在 created_at 等所有模型上添加列值的方法
- dart - dart pub 全局包在 Windows 10 上运行两次
- android - 我使用 Buildbox 制作了一款 Android 游戏,但无法使用 Android Studio 导出它。我有两个软件的最新版本
- android - Cordova 发布应用程序库 - 由于应用程序安装失败而被拒绝
- python - 如何让 pygame 显示我的精灵?
- arrays - 获取 NgFor 项目 Angular 的总数
- angular - ASP.NET Core 和 Angular:提交表单时出现无效操作错误
- javascript - 如何将此消息更改为嵌入消息?
- sql - SSRS-上个月的参数