错误传递Powershell管道

时间:2015-06-10 20:00:21

标签: powershell error-handling try-catch

如何在powershell表达式中捕获(抑制)错误?

我正在尝试使用get-ChildItem迭代目录中的文件并提取一些信息。

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

我知道我可以重写这个不使用管道,并以这种方式捕捉错误,但是有可能使它成为一个班轮吗?

以上返回“try:术语'try'未被识别为cmdlet,函数,脚本文件或可操作程序的名称。请检查 拼写名称,或者如果包含路径,请验证路径是否正确,然后重试。“

1 个答案:

答案 0 :(得分: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,您传递给它的脚本块可以是多行,包含try / catchif语句等。