【问题标题】:Get output from `New-AzResourceGroupDeployment` including `WhatIf`从 `New-AzResourceGroupDeployment` 获取输出,包括 `WhatIf`
【发布时间】:2022-01-11 02:15:35
【问题描述】:

我想在 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 的输出?

【问题讨论】:

  • 你的意思是如何捕获WhatIf的输出?
  • @SantiagoSquarzon 是的。我更新了问题。
  • 我不认为你可以,-WhatIf 不会去任何类似于$testVar = [console]::WriteLine('hello') *>&1 的PowerShell output Streams 也无法捕获。
  • Start-Transcript 可以实际捕获它,但我认为这不是您的意图,您希望它在变量上吗?
  • @SantiagoSquarzon 感谢您的建议。我想我不能以干净的方式做到这一点。但很高兴知道一些解决方法;)

标签: powershell azure-powershell


【解决方案1】:

使用common -WhatIf parameter 产生的输出很遗憾不能被捕获在会话中 - 它直接打印到 控制台(主机)。

唯一的解决方法使用 PowerShell 的 CLIpowershell.exe 用于 Windows PowerShell,pwsh 用于 PowerShell (Core) 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>'@) 以避免需要转义嵌入的引号字符。

注意事项

  • 这样的电话很昂贵。

  • 由于创建了一个在进程中运行的新的独立会话,它对调用者的状态一无所知(除了它继承了环境变量)。

    • 假设参数数据类型足够简单,您可以使用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 放在脚本块中会包含它。

【讨论】:

  • 我会将其标记为答案,尽管它并不适合我。仍然很高兴知道有什么可能。谢谢!
  • 谢谢,@AlexanderSchmidt。它在哪些方面不能解决您的问题?
  • 我想在 powershell 模块中使用它。问题是用户不会接受你提到的警告,而且我很确定在 Linux 下运行它会吓坏系统。我觉得它太不稳定了。
  • @AlexanderSchmidt,主机操作系统不应该有所作为;只要您知道要提交的命令具有所有必要的输入并且可以在新会话中自动加载它所依赖的模块,该调用就很健壮。但是,当涉及到常规的 non-WhatIf success 输出时,您将失去类型保真度 - 但您可以将 CLI 调用限制为 -WhatIf 场景.但是,当然,如果 CLI 调用过于昂贵,则不能选择此解决方案。出于好奇:您的模块将如何公开此功能,为什么模块本身需要捕获-WhatIf 输出?
  • 谢谢。我想要这个有两个原因:1)用户应该得到至少与普通命令相同的输出 2)我想解析输出以使我的模块能够选择性地警告创建和委托。也许我会试一试。 Inwill 在这里发布我的经验作为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2013-02-07
  • 1970-01-01
相关资源
最近更新 更多