脚本的调试向来是一个艰巨的任务,在powershell出现以前简直是一场灾难。在powershell中微软终于做出了诸多改进,不但有了$Error、-whatif,也有了ISE.而在语法上也增加了try-catch-finally,终于可以便利的进行调试和错误处理了。
在该语法中,finally并不是必需的,但是个人并不建议去掉该部分。建议将功能的预处理放在try部分,但没有错误时,再在finally完成功能。
下面将用一段代码演示如何进行错误处理。主要功能是将一段字符串写道硬盘上一个新建的文件中,完成后移出变量。-NoClobber表示不覆盖现有文件。
Try
{   
$strContent = "try catch finally"
Out-File -FilePath d:\test.txt -InputObject $strContent -NoClobber
Write-Host "文件创建成功"
}
Catch [System.UnauthorizedAccessException]
{  
Write-Host "访问失败。错误原因:"$Error[0]
}
Catch [System.IO.DirectoryNotFoundException]
{   
Write-Host "访问失败。错误原因:"$Error[0]
}
Catch
{    Write-Host "访问失败。错误原因:"$Error[0]
}
Finally
{    Remove-Variable strContent
}
 
按照目前的脚本运行后,成功运行,没有任何错误。如下图
PS错误处理_职场
 
再次运行该脚本,会报下图的错误。这正是-NoClobber发挥了作用。而我们通过System.IO.DirectoryNotFoundException捕获了该异常。在catch部分,我们可以主动去捕获可以想到的错误,这样可以提高脚本的友好性,并可以对此类错误进行主动处理,提高脚本的可用性。
PS错误处理_职场_02
 
而我们将输出文件的保存位置更改为d:\temp\这个并不存在的目录后,可以发现报如下图的提示,而这正是我们设计的结果。
PS错误处理_职场_03