【问题标题】:PowerShell Try, Catch, custom terminating error messagePowerShell Try、Catch、自定义终止错误消息
【发布时间】:2014-07-26 11:26:15
【问题描述】:

有没有办法自定义终止错误的错误消息?

在下面的示例中,我希望仅以一个 Try 部分结束,并通过组合两个脚本块在一个 Catch 部分中收集所有错误。我的问题是Import-csv 生成的$error 描述性不够,我希望在$error 消息中包含文本Failed CSV-File import c:\test.csv

感谢您的建议。

脚本块 1

Try {
    $File = (Import-Csv -Path c:\test.csv)
}
Catch {
    throw $error[0].Exception.Message | Send-Mail $ScriptAdmin "FAILED CSV-File import"
}

脚本块 2

try {
    if(!(Test-Path $LogFolder -PathType Container)) {throw "Can't find the log folder: '$LogFolder'"}
    $Credentials = Import-Credentials $UserName $PasswordFile
}
catch {
    throw $Error[0].Exception.Message | Send-Mail $ScriptAdmin "FAILURE"
}

解决方法

一个可能的解决方案是首先检查test-path 是否存在导入文件,然后创建一个带有自定义消息的throw。但我想知道是否可以在不先使用test-path 的情况下在一行代码中处理它。

最佳解决方案(感谢 mjolinor):

try {
    $File = (Import-Csv -Path $ImportFile -Header "A", "B", "C", "D" | Where { $_.A -NotLike "#*" })
    if(!(Test-Path $LogFolder -PathType Container)) {throw "Can't find the log folder: '$LogFolder'"}
    $Credentials = Import-Credentials $UserName $PasswordFile
}
catch {
    Switch -Wildcard ($Error[0].Exception)
        {
           "*$ImportFile*"
           { $FailType = "FAILED CSV-File import" }

           "*$LogFolder*"
           { $FailType = "FAILED Log folder not found" }

           "*Import-Credentials*"
           { $FailType = "FAILED Credential import" }

           Default
           { $FailType = "FAILED Unrecognized error" }

         }
       Write-Warning $Error[0].Exception.Message
       throw $Error[0].Exception.Message | Send-Mail $ScriptAdmin $FailType
}
  • 确保您创建的 advanced-function(如上面的 Import-Credentials)包含 throw 部分中的函数名称。所以我们可以在catchblock 中过滤掉它。

【问题讨论】:

    标签: powershell error-handling


    【解决方案1】:

    可能是这样的吧?

    Try {
          $File = (Import-Csv -Path c:\test.csv)
    
          if(!(Test-Path $LogFolder -PathType Container)) 
          { throw "Can't find the log folder: '$LogFolder'" }
    
          $Credentials = Import-Credentials $UserName $PasswordFile
    
          }
    
    catch {
            Switch -Wildcard ($Error[0].CategoryInfo)
            {
               '*[Import-CSV]*' 
               { $FailType = 'Import CSV failed' }
    
               '*[Test-Path]*'
               { $FailType = 'LogFolder not found' }
    
               '*[Import-Credentials]*'
               { $FailType = 'Credential import failed' }
    
               Default
               { $FailType = 'Unrecognized error' }
    
             }
    
             $Error[0].Exception.Message | Send-Mail $ScriptAdmin $FailType
    
           }
    

    编辑(由于某种原因我无法发表评论):

    我应该指出它没有经过测试,并且更多的是作为一种模式而不是完成的解决方案,而且它似乎已经完成了它打算做的事情。

    @BartekB - 我习惯性地使用 $Error[0] 而不是 $_ 因为它看起来更明确和直观,并且不太可能被稍后可能继承代码的经验不足的人误解。

    【讨论】:

    • 谢谢mjolinor,这正是我要找的。但是,尽管 $error[0] contains the matching word: + CategoryInfo : OpenError: (:) [Import-Csv], FileNotFoundException` 却出现 The specified wildcard character pattern is not valid: *[Import-CSV]* 错误
    • '*[Import-CSV]*''*Import-CSV*' 删除括号[] 时就像一个魅力。再次感谢,这对我帮助很大:)
    • 对于Test-Path,这不起作用,因为字段$Error[0].CategoryInfo不包含单词Test-Path,因为它不在throw中。有没有办法从throw 中设置CategoryInfo
    • 找到了,最好的方法(感谢您的帮助)是使用$Error[0].Exception,然后将变量用作通配符,例如*$ImportFile**$LogFolder* 等。我会将您的答案标记为Solved。再次感谢 :) 我会更新帖子,为其他人提供完整的解决方案。
    • 顺便说一句:你为​​什么使用$Error[0]而不是$_?后者(根据定义)应该包含抛出的错误。
    猜你喜欢
    • 2020-08-02
    • 1970-01-01
    • 2020-05-26
    • 2021-12-19
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    相关资源
    最近更新 更多