本文目录
如果你想对错误处理,并且输出友好的信息。须要两点:
第一,抑制内置的错误信息;
第二,一个能够发现异常是否发生的机制。
在之前的文章中我们已经知道怎样抑制内置的错误消息了,是通过ErrorAction。你如果将ErrorAction设置为“SilentlyContinue”,错误信息就不会输出了。
Remove-Item "文件不存在" -ErrorAction "SilentlyContinue" $?中的错误状态 $?变量会保存上一步操作是否成功或者失败,也就是告诉你是否发生了错误。可以写一段脚本进行测试。 Remove-Item "文件不存在" -ErrorAction "SilentlyContinue" If (!$?) { "删除文件操作失败"; break }; "删除文件成功!" #删除文件操作失败
因为文件不存在,所在Remove-Item失败,失败异常标志$?会变为$false。语句块 !$? 的值会变为$true,进而提示删除文件失败。如果你喜欢像正常的输出一样,将异常的message输出。
Remove-Item "文件不存在" -ErrorAction "SilentlyContinue" If (!$?) { "发生异常,异常信息为$($error[0])"; break } "删除文件成功!" # 发生异常,异常信息为:找不到路径“E:文件不存在”,因为该路径不存在。
使用Traps
使用Traps可以捕获异常,在捕获到异常时,可以在做相应的处理。例如我们在Powershell自动化工作中,出现了异常可以发一封邮件给管理员。
Trap { "自动化工作发生异常,正在发邮件联系管理员给管理员!"} 1/$null 自动化工作发生异常,正在发邮件联系管理员给管理员! 试图除以零。 所在位置 行:4 字符: 3 + 1/ <<<< $null + CategoryInfo : NotSpecified: (:) [], RuntimeException + FullyQualifiedErrorId : RuntimeException
到目前为止,并没有对异常进行处理。
Traps未处理的异常
上面的异常发生在运行时,但是有的异常发生在编译时,例如:
Trap {"我想捕获异常"} 1/0 试图除以零。 所在位置 行:2 字符: 44 + Trap { "A dreadful error has occurred!"} 1/ <<<< 0 + CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordExc eption + FullyQualifiedErrorId : RuntimeException
这次Trap没有生效,因为0为常量,该异常会在编译时被抛出,并且Traps对此无能为力。但是对于cmdlets中内部异常却可以捕获。
PS> Trap {"我想捕获异常"} PS> 1/0 我想捕获异常 尝试除以零。 所在位置 行:1 字符: 17 + Trap {"我想捕获异常"};1/0 + ~~~ + CategoryInfo : NotSpecified: (:) [], RuntimeException + FullyQualifiedErrorId : RuntimeException
使用Break和Continue来对异常作后续处理
Traps异常发生时使用break中断脚本执行
Trap { "异常发生,我想终止脚本!" } stop-service -name "NoSuchService" -ErrorAction "Stop" 异常发生,我想终止脚本! Stop-Service : 找不到任何服务名称为“NoSuchService”的服务。 所在位置 行:3 字符: 13 + stop-service <<<< -name "NoSuchService" -ErrorAction "Stop" + CategoryInfo : ObjectNotFound: (NoSuchService:String) [Stop-Ser vice], ServiceCommandException + FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell. Commands.StopServiceCommand
Traps异常发生时,使用Continue 继续执行
Trap { "异常发生,我要继续执行!" } stop-service -name "NoSuchService" -ErrorAction "Stop" Write-Host "继续执行" 异常发生,我要继续执行! Stop-Service : 找不到任何服务名称为“NoSuchService”的服务。 所在位置 行:3 字符: 13 + stop-service <<<< -name "NoSuchService" -ErrorAction "Stop" + CategoryInfo : ObjectNotFound: (NoSuchService:String) [Stop-Service], ServiceCommandException + FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell. Commands.StopServiceCommand 继续执行
查看异常的详细信息
Trap 到异常后,Powershell会自动将该异常保存在$_变量中。
Trap { Write-Host $_.Exception.Message; Continue }; Stop-Process -Name "NoSuchProcess" Stop-Process : 找不到名为“NoSuchProcess”的进程。请验证该进程名称,然后再次调用 cmdlet。 所在位置 行:6 字符: 13 + Stop-Process <<<< -Name "NoSuchProcess" + CategoryInfo : ObjectNotFound: (NoSuchProcess:String) [Stop-Process], ProcessComman dException + FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShell.Commands.StopProcess Command
本文链接: https://www.pstips.net/powershell-recognize-and-response-errors.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
博主您好:
Trap { “异常发生,我想终止脚本!” } ->这句少了 break
Trap { “异常发生,我要继续执行!” }->这句少了continue
Trap
{
Write-Host $_.Exception.Message;
Continue
};
Stop-Process -Name “NoSuchProcess”
最后一句,Stop-Process -Name “NoSuchProcess” 加上 -ErrorAction Stop跑起来才有feel.
GetADUser -identity “1111” -erroraction silentlycontinue….
上面的命令,如果不存在id=1111的用户,错误信息还是会输出,这是为什么呢?