Powershell 管道中的错误处理

Error Handing in Powershell pipe

如何捕捉(抑制)Powershell 表达式中的错误?

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

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

我知道我可以重写它以不使用管道,并以这种方式捕获错误,但是否可以将它变成一个衬垫?

上面的 returns "try : 术语 'try' 未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。检查 名称的拼写错误,或者如果包含路径,请验证路径是否正确,然后重试。"

如果在 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 语句等