2015-06-10 159 views
1

如何捕獲(壓縮)PowerShell表達式中的錯誤?PowerShell管道中的錯誤

我想使用get-ChildItem遍歷目錄中的文件並提取一些信息。

get-ChildItem "c:\test\" -Recurse | % { $_.Name + " ==> " + (try{(([xml] (Get-Content $_.FullName)).DocumentElement.TagName)} catch{"not xml"}) } 

我知道我可以重寫這個不使用管道,並捕捉錯誤的方式,但它可能使這一個班輪?

上面的返回「try:術語'try'不被識別爲cmdlet,函數,腳本文件或可操作程序的名稱,請檢查 的拼寫名稱,或者如果包含路徑,該路徑是正確的,然後再試一次。「

回答

4

如果在Get-Content期間發生錯誤,則請撥打-ErrorAction Ignore-ErrorAction SilentlyContinue。如果在訪問的Get-Content結果的性質發生了,然後而是採用點符號,使用Select-Object這樣你就可以在每個那些使用-ErrorAction

get-ChildItem "c:\test\" -Recurse | % { $_.Name + " ==> " + ((([xml] (Get-Content $_.FullName -ea Ignore)) | Select-Object -ExpandProperty DocumentElement -ea Ignore | Select-Object -ExpandProperty TagName -ea Ignore)) } 

use a trap statement某處可能超出此一襯墊,不知道這是否仍然是一筆一筆。

我的建議是不要掛在某些事情上。請注意,管道不需要是單行的。 %ForEach-Object並且您傳遞給它的scriptblock可以是多行,用try/catchif陳述等完成。