[英]Error Handling in PowerShell - inspect error output from external programs
我有一個運行批處理文件的腳本。 批處理文件引發一些錯誤,但運行成功。 但是,當批處理文件引發錯誤時,powershell腳本將引發錯誤。
輸出中包括“ 0失敗”。 有沒有一種方法可以檢查代碼中是否包含此消息,是否忽略所有錯誤?
這是一些偽代碼,可能能夠描述我要完成的工作。
$output = ./testrunner.bat
if ($output -Like "(0 failed)") {
# ignore errors
} else {
# don't ignore errors
}
不幸的是, 在變量中選擇性地從外部實用程序(控制台應用程序)捕獲stderr輸出並不容易。
最簡潔(雖然有些晦澀)的方法是(PSv4 +):
# First, make sure that $ErrorActionPreference is at its default,
# 'Continue'
$stdout, $stderr = (./testrunner.bat 2>&1).Where({
$_ -isnot [System.Management.Automation.ErrorRecord]
}, 'Split')
注意:如果您願意將組合的 stdout / stderr輸出收集到單個變量中,則該任務可簡化為:
$output = ./testrunner.bat 2>&1
請注意,在這兩種情況下,變量都將包含一個對象數組 ,這些對象代表各個輸出行的集合 :stdout行成為(如onw所期望的) [string]
數組元素,而PS將stderr行轉換為[System.Management.Automation.ErrorRecord]
實例。
然后,您可以檢查$stderr
(或$output
)變量中的成功/失敗指示符子字符串 -注意使用封閉的通配符*
,因為-like
總是匹配整個字符串(與regex-matching -match
運算符不同):
if ($stderr -like '*(0 failed)*') {
# ignore errors
} else {
# don't ignore errors
}
至於您所經歷的 :
當批處理文件引發錯誤時,powershell腳本將引發錯誤。
外部程序(包括批處理文件)在PowerShell的意義上不能引發錯誤; 它們集成如下:
他們的退出代碼記錄在$LASTEXITCODE
和$?
如果$LASTEXITCODE
為0
,則設置為$True
,否則$False
。
在常規控制台 ,stderr輸出通過控制台通過-紅色不着色-在沒有登錄$Error
(在內存中的日志錯誤)。 換句話說:stdout和stderr行的格式相同。
不幸的是, ISE的行為有所不同, 並且將 stderr行顯示為PowerShell錯誤,並確實將它們記錄在$Error
-請參見此GitHub問題 。
因此,聽起來好像您正在從ISE運行。
此外,如果從ISE運行代碼時$ErrorActionPreference = 'Stop'
有效,則第一條stderr行不僅會作為PowerShell錯誤出現,還會觸發整個PowerShell腳本的終止。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.