有没有办法自定义终止错误的错误消息?
在下面的示例中,我想最后得到一个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
。
最佳解决方案(感谢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
部分中的函数名称。所以我们可以在catch
块中过滤掉它。答案 0 :(得分:3)
这样的事,也许?
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]而不是$ _,因为它看起来更直观,更直观,不太可能被经验不足的人误解,可能会在以后继承代码。