我想New-AzResourceGroupDeployment在 PowerShell 中撰寫一個包裝器。因此,讓我們假設以下腳本:
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?
uj5u.com熱心網友回復:
遺憾的是,無法在會話中捕獲使用公共-WhatIf引數生成的輸出- 它直接列印到控制臺(主機)。
唯一的解決方法是使用 PowerShell 的CLI(powershell.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>'@) 來避免轉義嵌入的引號字符的需要。
注意事項:
這樣的電話是昂貴的。
由于創建了一個在子行程中運行的新的、獨立的會話,它對呼叫者的狀態一無所知(除了它繼承了環境變數)。
假設引數資料型別足夠簡單,您可以使用可擴展字串(
"...") 將來自呼叫者的值嵌入命令文本中。- 注意:從 PowerShell 7.2 開始,PowerShell 的 CLI,當命令字串被傳遞到
-c(-Command) 時——這是從 PowerShell 外部呼叫時的唯一選項——不僅將直接到控制臺的輸出發送到 stdout,而且它的所有輸出流都在那里以及 - 包括錯誤- 這是有問題的:有關詳細資訊,請參閱此答案的底部部分;在這里,這意味著-Verbose輸出也被捕獲。
- 注意:從 PowerShell 7.2 開始,PowerShell 的 CLI,當命令字串被傳遞到
或者,為了更好但不完整的型別保真度,將腳本塊(
{ ... })傳遞給-c(-Command) 而不是字串,您可以使用-args. 請注意,使用腳本塊只是從Powershell呼叫時的一種選擇,這樣做會在每個假設輸出訊息后插入一個空行。- 注意:腳本塊方法將映射到呼叫者的成功流(通過標準輸出)的輸出限制為直接到控制臺的輸出(例如 from
-WhatIf)和命令的成功流輸出。任何其他流的輸出都映射到呼叫者的相應流,但您可以在腳本塊內使用重定向將流合并到成功輸出流中。
在手頭的情況下,-Verbose默認情況下,輸出將傳遞到呼叫者的詳細流,因此不會在捕獲命令輸出的變數中捕獲。但是,放置4>&1在腳本塊內將包括它。
- 注意:腳本塊方法將映射到呼叫者的成功流(通過標準輸出)的輸出限制為直接到控制臺的輸出(例如 from
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/374219.html
