【发布时间】: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 中过滤掉它。
【问题讨论】: