从“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的CLI(powershell.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
放在脚本块内会包含它。
我想在 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的CLI(powershell.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
输出也被捕获。
- 注意:从 PowerShell 7.2 开始,PowerShell 的 CLI,当命令 string 传递给
或者,为了 更好 - 但不完整 - 键入保真度,传递一个 脚本块 (
{ ... }
) 到-c
(-Command
) 而不是字符串,您可以使用-args
向其传递来自调用者的值。请注意,当还调用 from Powershell 时,使用脚本块只是一个选项,这样做会在每个假设输出后插入一个 空行 留言。- 注意:脚本块方法将映射到调用者成功流(通过标准输出)的输出限制为直接到控制台的输出(例如来自
-WhatIf
)和命令的 成功-流输出。任何其他流的输出都映射到调用者的相应流,尽管您可以在脚本块中使用重定向 将流合并到成功输出流中。
在本例中,默认情况下-Verbose
输出将传递给调用者的详细流,因此 不会 被捕获在捕获命令输出的变量中。但是,将4>&1
放在脚本块内会包含它。
- 注意:脚本块方法将映射到调用者成功流(通过标准输出)的输出限制为直接到控制台的输出(例如来自