【问题标题】:Error Handing in Powershell pipePowershell 管道中的错误处理
【发布时间】:2015-08-26 06:51:15
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: powershell error-handling try-catch


    【解决方案1】:

    如果错误发生在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 语句等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-13
      • 1970-01-01
      • 2013-12-10
      • 2014-02-27
      • 2016-02-26
      • 2017-07-20
      • 2014-08-28
      • 1970-01-01
      相关资源
      最近更新 更多