我有一個 PowerShell 腳本,它是 Windows Sandbox 的啟動腳本,因此它以靜默方式運行。
是否可以在 PowerShell 腳本中放置某種宣告,比如在腳本的開頭,告訴靜默運行的腳本將其所有錯誤輸出到文本檔案?
編輯(對于 Fitzgery 的評論):我無法對腳本使用重定向,因為它作為 Windows 沙盒啟動的一部分靜默運行。我希望腳本本身中的某些內容指示正在運行的腳本將所有錯誤輸出到文本檔案。
uj5u.com熱心網友回復:
嘗試以下操作,這取決于會話中發生的所有錯誤都記錄在自動$Error變數中的事實:
$Error.Clear() # Reset the session's error log so far
try {
# ... your script
} finally {
# Save all errors that occurred in this script to a file.
$Error > errors.txt
}
警告:
使用
try陳述句有一個副作用:- 您的腳本可能會提前終止,因為任何通常只有陳述句終止的錯誤都會變成腳本終止錯誤,因此會立即觸發該
finally子句;也就是說,陳述句終止錯誤并不常見,并且當它們發生(意外)時中止執行可以說更好。
- 您的腳本可能會提前終止,因為任何通常只有陳述句終止的錯誤都會變成腳本終止錯誤,因此會立即觸發該
如果您要省略該
try陳述句并簡單地放在$Error > errors.txt腳本的末尾,則(非終止和)陳述句終止錯誤將照常處理,但如果發生腳本終止錯誤,則該$Error > errors.txt陳述句將永遠不會執行。
僅當您知道腳本不會產生腳本終止錯誤時,使用的替代解決方案trap才不會產生副作用 :
腳本終止錯誤是使用或隱式創建的錯誤
throw-ErrorAction Stop$ErrorActionPreference = 'Stop'(不再使用)陳述句允許您在不停止執行
trap的情況下 對錯誤采取行動,即如果您不在傳遞給它的腳本塊中使用。break雖然它因此在非終止和陳述句終止錯誤之后繼續,就像在正常執行期間一樣,它也在腳本終止錯誤之后繼續。
因此,副作用——如果你的腳本確實創建了腳本終止錯誤,它可能不會在你期望的時候停止你的腳本。
# Create or truncate the target file.
$errLogFile = New-Item errors.txt -Force
# Traps all errors and logs them in the target ffile.
# Note:
# * Using neither `break` or `continue` in the script block
# still also prints the error and continues execution.
# * CAVEAT: Even *script*-terminating errors then
# do NOT abort execution.
trap { $_ >> $errLogFile }
# ... your script
用途Start-Transcript:
Start-Transcript是一種捕獲所有腳本輸出的方法,而不僅僅是錯誤(也就是說,記錄所有PowerShell輸出流的輸出,特別是包括成功輸出(資料) ——你別無選擇)。必須與它配對
Stop-Transcript才能關閉腳本檔案。如果您忽略呼叫
Stop-Transcript,腳本將保持打開狀態并在會話的剩余部分繼續記錄。為了確保被呼叫,您
Stop-Transcript將面臨與上述相同的權衡:finally在陳述句塊中呼叫它try可能會過早中止執行。- 使用沒有的
trap陳述句break可能不會在應該停止執行時停止執行。
也就是說,如果您的腳本的執行是您會話中唯一發生的事情- 例如在 CLI 呼叫中
-File-不呼叫Stop-Transcript將不是問題,并確保無副作用的日志記錄 - 盡管總是包括所有腳本的輸出,如前所述。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/528450.html
