PowerShell 5工作流中foreach -parallel结合Invoke-AzVMRunCommand如何提取结果?
提取Azure RunCommand执行脚本的实际输出结果
核心方法
Microsoft.Azure.Commands.Compute.Automation.Models.PSRunCommandResult的实际脚本输出嵌套在对象的层级属性中,只需针对性提取即可。
具体操作步骤
先确认结果结构
执行以下命令查看返回对象的详细属性,明确输出所在字段:$out | Select-Object -ExpandProperty Value | Format-List *通常会返回包含
Target(VM名称)、Output(脚本标准输出)、Message(可能包含错误或额外输出)、ExitCode(执行状态码)的对象集合。提取脚本输出
根据结构提取目标内容,示例如下:# 提取每个VM的脚本输出并整理为易读格式 $scriptResults = $out | Select-Object -ExpandProperty Value | ForEach-Object { [PSCustomObject]@{ VM名称 = $_.Target 脚本输出 = $_.Output -join "`n" # 合并多行输出为单字符串 执行状态码 = $_.ExitCode } } # 查看最终提取结果 $scriptResults如果
Output字段为空,替换为Message字段尝试:$scriptResults = $out | Select-Object -ExpandProperty Value | ForEach-Object { [PSCustomObject]@{ VM名称 = $_.Target 脚本输出 = $_.Message -join "`n" 执行状态码 = $_.ExitCode } }工作流中直接集成提取逻辑
在你的并行工作流里,执行Invoke-AzVMRunCommand后直接处理结果,示例片段:workflow 批量执行VM脚本 { param( [string[]]$VM列表, [string]$资源组名称, [string]$脚本路径 ) $脚本内容 = Get-Content -Path $脚本路径 -Raw foreach -parallel ($vm in $VM列表) { $执行结果 = Invoke-AzVMRunCommand -ResourceGroupName $资源组名称 -Name $vm -CommandId 'RunPowerShellScript' -ScriptString $脚本内容 # 提取输出并返回 $执行结果 | Select-Object -ExpandProperty Value | ForEach-Object { [PSCustomObject]@{ VM名称 = $_.Target 脚本输出 = $_.Output -join "`n" 执行状态码 = $_.ExitCode } } } } # 调用工作流并获取结果 $最终结果 = 批量执行VM脚本 -VM列表 $你的VM列表 -资源组名称 $rg名称 -脚本路径 '.\测试脚本.ps1' $最终结果
额外提示
- 如果脚本输出是JSON格式,可对
脚本输出字段执行ConvertFrom-Json进一步解析。 - 非0的
执行状态码通常表示脚本执行出错,错误信息可从Message或Error属性中提取。
内容的提问来源于stack exchange,提问作者mbourgon
相关产品推荐
相关产品推荐

