2015-06-10 55 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陈述等完成。