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
/catch
、if
语句等
如何捕捉(抑制)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
/catch
、if
语句等