我有一个脚本,我用“New-PSDrive”命令装入一个networking驱动器。 现在,由于脚本是作为一个“cronjob”在服务器上运行,我想有一些错误检测。 如果由于任何原因New-PSDrive命令失败,脚本应该停止执行,并通知出现问题。 我有以下代码:
Try { New-PSDrive -Name A -PSProvider FileSystem -Root \\server\share } Catch { ... handle error case ... } ... other code ...
出于testing的原因,我指定了一个错误的服务器名称,我得到以下错误“新PSDrive:驱动器根”\错误服务器\共享“不存在或它不是一个文件夹”。 这是因为服务器不存在。 但脚本不会进入Catch子句并停止。 它愉快地继续运行,因为没有安装驱动器,结果一团糟:-)
所以我的问题,为什么? PowerShell中的exception处理有什么区别吗? 我也应该注意到,我是PowerShell脚本的一个noob。
再见,马丁
在Powershell中有两种types的错误,终止错误和非终止错误。 查看关于about_try_catch_finally的帮助以获取更多信息。
如果我尝试这个
try { jimjim-cmdlet } catch { "It's a jimjim error!" }
无意义的小命令将产生一个终止错误,将被catch块捕获。
你正在运行的代码不会抛出一个终止错误,所以执行会抛出非终止错误,并在catch块之后继续。
另请参阅此页面http://powershell.com/cs/forums/p/521/703.aspx ,以获取更多信息。
对于什么时候发生了终止错误,而不是终止错误(可能有更多知识渊博的人可以帮忙),我仍然有点模糊。
我知道我迟到了,但这是我的承诺。
对于非终止错误,您可以像索引那样读取索引为0的错误variables
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块。