亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PowerShell > 正文

淺談PowerShell 捕獲錯誤

2020-03-26 19:08:00
字體:
來源:轉載
供稿:網友

之前的文章我們演示了如何使用 Windows PowerShell 構建相當高級的清單工具。我創建的工具提供了多個有關輸出的選項,這應歸功于外殼的內置功能和將函數應用于對象。

我所創建的函數有一個無可否認的弱點:它不能適度處理可能發生的任何錯誤(例如連接或權限問題)。這正是我要在本期的 Windows PowerShell 專欄中加以解決的,我將介紹 Windows PowerShell 所提供的錯誤處理功能。

設置 Trap

在 Windows PowerShell 中,Trap 關鍵字定義一個錯誤處理程序。當您的腳本中出現異常時,外殼會檢查是否已經定義 Trap,這意味著它必須在發生任何異常之前出現在腳本中。對于本演示,我將整理出一個會產生連接性問題的測試腳本:我將使用 Get-WmiObject 連接網絡中并不存在的計算機名。我的目標是讓錯誤 Trap 將無效計算機名寫出到一個文件中,從而為我提供一個記錄了無效計算機名的文件。我還將加入到兩個有效計算機的連接(我將使用 localhost)。請參見圖 1 中的腳本。

添加 Trap

trap { write-host "Error connecting to $computer" -fore red "$computer" | out-file c:/demo/errors.txt -append  continue}$computer = "localhost"get-wmiobject win32_operatingsystem -comp $computer $computer = "server2"get-wmiobject win32_operatingsystem -comp $computer $computer = "localhost"get-wmiobject win32_operatingsystem -comp $computer

此腳本的輸出(如圖 2 所示)與我的期望不符。請注意 "Error connecting to…" 消息不顯示。也沒有創建 Errors.txt 文件。也就是說,根本沒有執行我的 Trap。究竟發生了什么?

PowerShell,捕獲錯誤

圖 2 這不是我所希望的輸出!

停止!

關鍵在于了解正常外殼錯誤消息與異常不同(分為非終止錯誤和終止錯誤。終止錯誤會停止管道的執行并產生異常)。只有異常才能被捕獲。出現錯誤時,外殼會檢查其內置的 $ErrorActionPreference 變量以確定自己要執行的操作。該變量默認含有 "Continue" 值,它表示“顯示錯誤消息并繼續”。將此變量更改為 "Stop" 會使其顯示錯誤消息并產生可捕獲的異常。但這意味著您腳本中的任何錯誤也將執行該操作。

更好的方法是只讓您認為可能會引發問題的 cmdlet 使用“停止”行為??梢允褂?–ErrorAction(或 –EA)參數(一個所有 cmdlet 都支持的常見參數)完成此操作。圖 3 顯示了此腳本的修訂版本。它將按照預期方式工作,產生的輸出如圖 4 所示。

 使用 -ErrorAction

trap { write-host "Error connecting to $computer" -fore red  "$computer" | out-file c:/demo/errors.txt -append  continue}$computer = "localhost"get-wmiobject win32_operatingsystem -comp $computer -ea stop$computer = "server2"get-wmiobject win32_operatingsystem -comp $computer -ea stop$computer = "localhost"get-wmiobject win32_operatingsystem -comp $computer -ea stop

PowerShell,捕獲錯誤

圖 4 使用 –ErrorAction 參數時我獲得了更多有用的結果

在 Trap 末尾使用 Continue 指示外殼繼續執行產生異常的代碼行之后的一行。還可以使用關鍵字 Break(我將在稍后加以討論)。另請注意,$computer 變量(在腳本中定義)在 Trap 內仍然有效。這是因為 Trap 是腳本本身的子作用域,即 Trap 可以查看腳本內的所有變量(稍后我也將介紹此方面的更多相關信息)。

在作用域中完成所有操作

Windows PowerShell 中錯誤捕獲的一個尤為棘手的方面是作用域的使用。外殼本身代表全局作用域,它包含外殼內部發生的所有事件。如果您運行某個腳本,它會獲取自己的腳本作用域。如果您定義某個函數,該函數的內部便是其自己的專用作用域等等。這將創建一種父/子類型的層次結構。

發生異常時,外殼會在當前作用域內查找 Trap。這意味著某個函數內的異常將在該函數內部查找 Trap。如果外殼發現了 Trap,就會執行該 Trap。如果 Trap 以 Continue 結尾,外殼將繼續執行引發異常的代碼行后面的一行,但仍在同一作用域中。下面借助一小部分偽代碼來說明這一點:

Trap { # Log error to a file Continue}Get-WmiObject Win32_Service –comp "Server2" –ea "Stop"Get-Process

如果異常發生在第 5 行,則將執行第 1 行中的 Trap。Trap 以 Continue 結尾,因此將繼續執行第 6 行。

現在考慮下面這個略有些不同的作用域示例:

 Trap {  # Log error to a file  Continue }  Function MyFunction {  Get-WmiObject Win32_Service –comp "Server2" –ea "Stop"  Get-Process }  MyFunction Write-Host "Testing!"

如果錯誤發生在第 7 行,則外殼會在函數的作用域內查找 Trap。如果沒有找到,那么外殼將退出函數的作用域,繼續在父作用域內查找 Trap。因為那里有 Trap,所以它將執行第 1 行。在本例中,代碼是 Continue,所以將繼續執行同一作用域中異常之后的代碼行,即第 12 行,而不是第 8 行。換言之,外殼在退出之后不會再重新進入該函數。

現在將該行為與以下示例做一下對比:

Function MyFunction { Trap {  # Log error to a file  Continue } Get-WmiObject Win32_Service –comp "Server2" –ea "Stop" Get-Process} MyFunctionWrite-Host "Testing!"

在本例中,第 6 行中的錯誤將執行第 2 行中的 Trap,并保持在函數的作用域內。Continue 關鍵字將保持在該作用域內,繼續執行第 7 行。如果您將 Trap 放入預期會發生錯誤的作用域內,好處是您仍保持在作用域中并可以在其中繼續執行。但如果此方法對于您的情況不適用應該怎么辦呢?

該工具非常適合管理配置基線。Compare-Object(或 Diff)旨在對比兩組對象。默認情況下,它將比較每個對象的所有屬性,并由該命令輸出所有不同之處。所以設想您已將某個服務器的服務完全按照您所需的方式進行了配置。只需運行下面的內容就能創建基線:

Get-Service | Export-CliXML c:/baseline.xml

幾乎所有對象都可以輸送到 Export-CliXML,它會將對象轉換為 XML 文件。而后,您可以運行同一命令(如 Get-Service)并將結果與保存的 XML 進行比較。命令如下:

Compare-Object (Get-Service) (Import-CliXML  c:/baseline.xml) –property name

添加 –property 參數將強制比較僅查看該屬性,而非整個對象。在本例中,您將得到由不同于原始基線的所有服務名稱組成的列表,讓您了解在創建后基線是否添加或刪除了任何服務。

斷開

我在前面提到過 Break 關鍵字。圖 5 顯示了一個如何運用 Break 關鍵字的示例。

使用 Break 關鍵字

 Trap {  # Handle the error  Continue }  Function MyFunction {  Trap {   # Log error to a file   If ($condition) {    Continue   } Else {    Break   }  }  Get-WmiObject Win32_Service –comp "Server2" –ea "Stop"  Get-Process }  MyFunction Write-Host "Testing!"

以下簡要概述了執行鏈。首先執行第 19 行,它調用第 6 行中的函數。執行第 15 行并產生異常。該異常在第 7 行捕獲,然后 Trap 必須在第 9 行做出決定。假設 $condition 為 True,Trap 將在第 16 行繼續執行。

但是,如果 $condition 為 False,Trap 將發生中斷。這將退出當前作用域,并將原始異常傳遞至父項。從外殼角度看,這意味著第 19 行產生了異常,并被第 1 行捕獲。Continue 關鍵字將強制外殼繼續執行第 20 行。

實際上,這兩個 Trap 中都包含了略多一些的代碼,用于處理錯誤,對其進行記錄等等。在本例中我只是省略了這種函數代碼,以使實際流程更易于查看。

為什么要擔心呢?

您何時需要捕獲錯誤?有兩種情況:預測可能會發生錯誤以及當您想要某種超越普通錯誤消息的行為時(例如將錯誤記錄到文件或顯示更有幫助的錯誤消息)。

通常我在復雜一些的腳本中加入錯誤處理,以幫助處理我可以預見發生的錯誤。這些錯誤包括但不限于連接不良或權限問題等錯誤。

錯誤捕獲無疑需要花費更多的時間和精力才能了解。但當您在 Windows PowerShell 中處理更加復雜的任務時,很有必要實施錯誤捕獲,以幫助您構建更加完善、專業的工具。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美亚洲范冰冰与中字| 亚洲天堂av在线播放| www国产亚洲精品久久网站| 日韩电影在线观看免费| 欧美在线性视频| 亚洲天堂网站在线观看视频| 不卡av电影院| zzijzzij亚洲日本成熟少妇| 国产精品视频久久| 欧美日韩国产一中文字不卡| 国产精品美乳一区二区免费| 亚洲精品久久久久久下一站| 欧美午夜激情在线| 国产精品亚洲аv天堂网| 欧美另类精品xxxx孕妇| 狠狠躁天天躁日日躁欧美| 亚洲精品91美女久久久久久久| 7777kkkk成人观看| 久久久久成人精品| 成人精品一区二区三区电影免费| 亚洲欧美日韩一区在线| 亚洲欧美日韩一区在线| 亚洲xxxx3d| 欧美成人免费视频| 国产精品青青在线观看爽香蕉| 一本色道久久88精品综合| 国产在线一区二区三区| 国产精品国模在线| 九九热精品在线| 91在线观看免费高清完整版在线观看| 欧美午夜视频在线观看| 一区二区三区 在线观看视| 在线日韩中文字幕| 国产成人精品一区二区在线| 国产精品视频色| 亚洲美女又黄又爽在线观看| 国产精品视频久久| 日本视频久久久| 国产精品露脸av在线| 欧洲日韩成人av| 国产午夜精品全部视频在线播放| 2020久久国产精品| 成人午夜黄色影院| 欧美成人午夜影院| 精品一区二区三区四区| 中文字幕精品一区久久久久| 亚洲最大的免费| 一区二区三区日韩在线| 亚洲第一福利在线观看| 久久99久久亚洲国产| 亚洲网站在线观看| 精品国产老师黑色丝袜高跟鞋| 精品国偷自产在线视频99| 久久精品国产成人精品| 久久久国产成人精品| 久久久www成人免费精品张筱雨| 欧美黑人又粗大| 国产第一区电影| 日韩电影视频免费| 中文字幕精品视频| 欧美激情在线有限公司| 欧美裸体xxxx极品少妇| 国产欧美一区二区三区在线看| 美女扒开尿口让男人操亚洲视频网站| 成人欧美在线观看| 日韩欧美中文第一页| 国产精品日韩在线一区| 欧美激情综合亚洲一二区| 久久精品国产综合| 51视频国产精品一区二区| 亚洲美女av在线| 日韩免费电影在线观看| 欧美日韩黄色大片| 久久成人一区二区| 国产美女精品免费电影| 91九色在线视频| 亚洲香蕉成视频在线观看| 久久影视免费观看| 九九热r在线视频精品| 欧美一级免费视频| 国产成人在线精品| 久久久国产精品视频| 91久久国产综合久久91精品网站| 久久精品欧美视频| 国产精品jvid在线观看蜜臀| 成人免费看片视频| 日韩在线观看高清| 日韩欧美成人免费视频| 欧美成人免费全部观看天天性色| 欧美激情a∨在线视频播放| 亚洲福利视频网| 91在线高清免费观看| 亚洲永久在线观看| 日韩精品高清在线| 日韩欧美高清在线视频| 美女啪啪无遮挡免费久久网站| 国产69精品久久久久久| 一本久久综合亚洲鲁鲁| 大伊人狠狠躁夜夜躁av一区| 日韩免费观看在线观看| 久久久久久国产精品久久| 亚洲自拍偷拍视频| 97久久久久久| 日本aⅴ大伊香蕉精品视频| 久久精视频免费在线久久完整在线看| 国产视频观看一区| 九九久久综合网站| 国产一区二区三区在线免费观看| 国产成人+综合亚洲+天堂| 欧美激情网站在线观看| 成人福利网站在线观看| 亚洲精品中文字幕av| 日韩在线视频一区| 成人妇女淫片aaaa视频| 美日韩精品视频免费看| 欧美日韩免费网站| 久久综合久久美利坚合众国| 欧美激情乱人伦| 97免费视频在线播放| 日韩av在线一区二区| 97人人模人人爽人人喊中文字| 国产97在线亚洲| 国产精品久久999| 精品久久久久久久久久久久久| 亚洲精品在线不卡| 成人网在线观看| 国产一区二区三区高清在线观看| 日韩精品中文字幕有码专区| 亚洲黄页视频免费观看| 亚洲欧美日韩直播| 日韩av在线高清| 在线观看精品自拍私拍| 日韩中文字幕网址| 久久久精品久久久久| 日韩一区二区精品视频| 日韩欧美国产激情| 亚洲高清免费观看高清完整版| 亚洲欧美中文日韩在线| 欧美精品999| 91手机视频在线观看| 中文字幕在线看视频国产欧美| 在线日韩日本国产亚洲| 午夜精品一区二区三区视频免费看| 亚洲乱码av中文一区二区| 色综合色综合网色综合| 91tv亚洲精品香蕉国产一区7ujn| 久久免费视频在线| 欧美肥臀大乳一区二区免费视频| 91久久中文字幕| 国产日韩在线观看av| 中文字幕视频在线免费欧美日韩综合在线看| 一本大道亚洲视频| 欧美精品第一页在线播放| 亚洲人成人99网站| 欧美国产日韩一区二区在线观看| 欧美色另类天堂2015| 亚洲国产精品女人久久久| 国产精品偷伦视频免费观看国产| 国产日韩欧美在线视频观看| 亚洲区在线播放| 国产欧美久久一区二区| 国产999视频| 国产精品久久久久久久久久三级| 国产日韩在线一区|