簡體   English   中英

PowerShell中的錯誤處理-檢查外部程序的錯誤輸出

[英]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$? 如果$LASTEXITCODE0 ,則設置為$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM