如何在powershell表达式中捕获(抑制)错误?
我正在尝试使用get-ChildItem迭代目录中的文件并提取一些信息。
get-ChildItem "c:\test\" -Recurse | % { $_.Name + " ==> " + (try{(([xml] (Get-Content $_.FullName)).DocumentElement.TagName)} catch{"not xml"}) }
我知道我可以重写这个不使用管道,并以这种方式捕捉错误,但是有可能使它成为一个班轮吗?
以上返回“try:术语'try'未被识别为cmdlet,函数,脚本文件或可操作程序的名称。请检查 拼写名称,或者如果包含路径,请验证路径是否正确,然后重试。“
答案 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
/ catch
,if
语句等。