PowerShell Try、Catch、自定义终止错误消息

2024-05-02

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

在下面的例子中我只想得到一个Try部分并将所有错误收集在一个中Catch通过组合两个脚本块来部分。我的问题是$error产生于Import-csv描述性不够,我想要文字Failed CSV-File import c:\test.csv$error信息。

感谢您的建议。

脚本块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 first.

最佳解决方案(感谢 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.

也许是这样的?

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] 而不是 $_ ,因为它看起来更明确和直观,并且不太可能被经验不足的人误解,他们可能会在以后继承代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PowerShell Try、Catch、自定义终止错误消息 的相关文章

随机推荐