我有一个脚本,使用命令“New-PSDrive”挂载网络驱动器。现在,由于该脚本在服务器上作为“cronjob”运行,因此我希望进行一些错误检测。如果由于任何原因命令 New-PSDrive 失败,则脚本应停止执行并通知出现问题。我有以下代码:
Try {
New-PSDrive -Name A -PSProvider FileSystem -Root \\server\share
} Catch {
... handle error case ...
}
... other code ...
出于测试原因,我指定了错误的服务器名称,并收到以下错误“New-PSDrive:驱动器根目录“\wrongserver\share”不存在或不是文件夹”。这没问题,因为服务器不存在。但脚本不会进入 Catch 子句并停止。它很高兴继续运行,但最终陷入混乱,因为没有安装驱动器 :-)
所以我的问题是,为什么?PowerShell 中的异常处理有什么不同吗?我还应该指出,我是 PowerShell 脚本方面的新手。
再见,马丁
答案1
Powershell 中有两种类型的错误:终止错误和非终止错误。查看 about_try_catch_finally 的帮助以获取更多信息。
如果我尝试这个
try
{
jimjim-cmdlet
}
catch
{
"It's a jimjim error!"
}
无意义的 cmdlet 将生成终止错误,该错误将被 catch 块捕获。
您正在运行的代码没有引发终止错误,因此执行会引发非终止错误并在 catch 块之后继续。
另请参阅此页面,http://powershell.com/cs/forums/p/521/703.aspx, 了解更多信息。
我仍然有点不清楚何时抛出终止错误而不是非终止错误(也许更有知识的人可以帮忙)。
答案2
我知道我迟到了,但这是我对此的看法。
对于非终止错误,你可以像这样读取索引 0 处的错误变量
try {
New-PSDrive -Name "H" -PSProvider filesystem -Root \\SERVER\Folder -Scope 1
if ($Error[0].Exception.Message -like "*does not exist*")
{
throw [System.IO.FileNotFoundException]::new("Could not find folder")
}
}
Catch [System.IO.FileNotFoundException]
{
break
}
Catch
{
# Other error handling
}
这会破坏你的脚本,你可以在 catch 块中添加额外的逻辑和日志记录。