从“New-AzResourceGroupDeployment”获取输出,包括“WhatIf”

Get output from `New-AzResourceGroupDeployment` including `WhatIf`

我想在 PowerShell 中围绕 New-AzResourceGroupDeployment 编写包装器。因此,让我们假设以下脚本:

New-AzResourceGroupDeployment `
    -Name 'test' `
    -ResourceGroupName 'rg-test' `
    -TemplateFile .\main.bicep `
    -TemplateParameterFile .\parameters\parameters.json `
    -Verbose `
    -WhatIf

这将输出如下内容:

VERBOSE: Using Bicep v0.4.1008
...
What if: Performing the operation "Creating Deployment" on target "rg-test".

所以这里的问题是我不会从 WhatIf 中得到任何结果。我猜是因为 WhatIf 在后台运行了一个不同的进程。

那么有没有办法捕获 WhatIf 的输出?

不幸的是,使用 common -WhatIf parameter 生成的 输出 无法 在会话中 - 它直接打印到 控制台 (主机)。

唯一的解决方法使用PowerShell的CLIpowershell.exe for Windows PowerShell , pwsh 对于 PowerShell(核心)7+)

$whatIfAndVerboseOutput = powershell.exe -c @'
  New-AzResourceGroupDeployment `
    -Name 'test' `
    -ResourceGroupName 'rg-test' `
    -TemplateFile .\main.bicep `
    -TemplateParameterFile .\parameters\parameters.json `
    -Verbose `
    -WhatIf
'@

不使用逐字 here-string (@'<newline>...<newline>'@) 以避免需要转义嵌入的引号字符。

注意事项

  • 这样的电话很贵

  • 由于创建了一个在 child 进程中运行的新的独立会话,因此它对 caller[ 的状态一无所知=79=](除了它继承了环境变量)。

    • 假设参数数据类型足够简单,您可以使用 expandable string ("...") 在命令文本中嵌入来自调用者的值。

      • 注意:从 PowerShell 7.2 开始,PowerShell 的 CLI,当命令 string 传递给 -c (-Command) - 这是唯一的选择从 PowerShell 外部调用 时 - 不仅将直接到控制台的输出发送到标准输出,而且还将其输出流的 all 发送到那里 - 包括 error - 这是有问题的:详见 this answer 的底部;在这里,这意味着 -Verbose 输出也被捕获。
    • 或者,为了 更好 - 但不完整 - 键入保真度,传递一个 脚本块 ({ ... }) 到 -c (-Command) 而不是字符串,您可以使用 -args 向其传递来自调用者的值。请注意,当还调用 from Powershell 时,使用脚本块只是一个选项,这样做会在每个假设输出后插入一个 空行 留言。

      • 注意:脚本块方法将映射到调用者成功流(通过标准输出)的输出限制为直接到控制台的输出(例如来自 -WhatIf)和命令的 成功-流输出。任何其他流的输出都映射到调用者的相应流,尽管您可以在脚本块中使用重定向 将流合并到成功输出流中。
        在本例中,默认情况下 -Verbose 输出将传递给调用者的详细流,因此 不会 被捕获在捕获命令输出的变量中。但是,将 4>&1 放在脚本块内会包含它。