PowerShell 异常处理(trap / try…catch / Throw / $Error / $ConfirmPreference)

来源:互联网 发布:日本人的交友软件 编辑:程序博客网 时间:2024/06/05 18:10

当处理一些特殊命令的时候,系统会进行提示。或者语句有错误时,则终止命令运行。powershell 同样像编程语言一样,有对异常操作的处理。


【$ConfirmPreference】

当删除一个进程的时候,类似重要操作需要确认:

#当删除一个进程的时候,需要确认Stop-Process -Name sqlservrStop-Process -Name sqlservr -Confirm


当前自动确认级别:

#当前自动确认级别$ConfirmPreference#查看$ConfirmPreference支持的设置,参数为枚举类型[ENUM]::GetNames($ConfirmPreference.GetType())


设置级别:

#设置最低级别,没有任何提示,直接执行命令较危险!$ConfirmPreference="Low"



【$Error】

对于错误,powershell 提供变量设置 -ErrorVariable 可将错误存储到变量中,变量只保留最后一次执行的错误信息。这样可以设置不让脚步出错而终止。

Remove-Item "WrongFile" -ErrorVariable ErrorVar -ErrorAction "SilentlyContinue"$ErrorVarGet-WmiObject Win32_Service –comp "Server" -ErrorVariable ErrorVar -ErrorAction "SilentlyContinue"$ErrorVar



如没有使用 -ErrorVariable 收集错误信息,有系统自动收集错误的数组变量 $Error

#如没有使用 -ErrorVariable 收集错误信息,有系统自动收集错误的数组变量 $Error$Error#数组变量 $Error 的最大记录(可直接设置,该值大于等于256)$MaximumErrorCount$MaximumErrorCount=300#数组 $Error 相关查询$Error[0]$Error[0].Exception.Message$Error | where {$_.Exception -ne $null} | foreach {$_.Exception.Message }$Error | where {$_.Exception -ne $null} | foreach {$_.Exception.GetType().fullName }#清除数组记录$Error.Clear()



【$ErrorActionPreference】

当执行脚本出错时,同样可以定义容错度,这样可以捕获异常,设置对批处理中的命令做处理。

#容错度查看$ErrorActionPreference#容错度设置$ErrorActionPreference = 'Ignore'#直接忽略错误$ErrorActionPreference = 'SilentlyContinue'#错误不抛出,脚本也会继续执行。$ErrorActionPreference = 'Continue'#将错误抛出来,但是脚本会继续往下执行$ErrorActionPreference = 'Stop'#错误发生时,终止脚本执行$ErrorActionPreference = 'Inquire'#提供选项由用户选择Error Action

#自定义设置 -ErrorAction :

#自定义设置 -ErrorAction#设置不提示错误继续执行(-ErrorAction 可简写为 -EA)Remove-Item "WrongFile" Remove-Item "WrongFile" -EA "SilentlyContinue"Remove-Item "WrongFile" -ErrorAction "SilentlyContinue"

失败异常标志 "$?" ,失败时 $? 为 $false ,可判断命令是否执行成功:

Remove-Item "WrongFile" -ErrorAction "SilentlyContinue"If (!$?){"操作失败";break};"操作成功!"



try…catch 捕获异常:

try…catch 几乎存在所有主流编程语言中,用法都差不多,简单俩个示例:

try { 1/0 } catch { Write-Warning $_ }try { 1/0 } catch { Write-Warning $_ } Finally {"Finally Output!"}



trap 捕获异常:

使用Traps可以捕获异常,在捕获到异常时,可以在做相应的处理。

示例中将脚步保存到文件中来执行,

> notepad test.ps1

trap{ Write-Host "错误:" $_.Exception.Message -fore red ;continue }""> delfile1.txt""> delfile2.txtRemove-Item "delfile1.txt"Remove-Item "WrongFile"Remove-Item "delfile2.txt"


错误命令的前后命令都执行了。结果还是一样出现错误信息,为什么不是提示异常?

关键在于了解正常外壳错误消息与异常不同(分为非终止错误和终止错误。终止错误会停止管道的执行并产生异常)。只有异常才能被捕获。出现错误时,外壳会检查其内置的 $ErrorActionPreference 变量以确定自己要执行的操作。该变量默认含有 "Continue" 值,它表示“显示错误消息并继续”。将此变量更改为 "Stop" 会使其显示错误消息并产生可捕获的异常。但这意味着您脚本中的任何错误也将执行该操作。(参考:在 Windows PowerShell 中使用 –ErrorAction (–EA) 捕获错误)


现在设置 $ErrorActionPreference = 'Stop'  再执行:



现在正常了!!~ 但是 $ErrorActionPreference = 'Stop'  范围是比较大的,会影响到其他操作!不是很好的办法。

现在在脚本中定义错误行为,先把 $ErrorActionPreference 设置为  'Continue' ,并更改脚本 test.ps1为:

trap{ Write-Host "错误:" $_.Exception.Message -fore red ;continue }""> delfile1.txt""> delfile2.txtRemove-Item "delfile1.txt" -ea stopRemove-Item "WrongFile" -ea stopRemove-Item "delfile2.txt" -ea stop


在可能出现错误的命令后,设置 -ErrorAction 为 stop ,如果有异常就可以捕获或自定义输出了!



此外,还可定义多个 trap,或自定义其他异常的异常信息 trap []。

更改脚本 test.ps1 为:

trap [System.DivideByZeroException] { "Divided by null!" ; continue }trap { Write-Host "错误:" $_.Exception.Message -fore red ; continue }""> delfile1.txtRemove-Item "WrongFile" -ea stop1/$nullRemove-Item "delfile1.txt" -ea stop

执行后可以看到捕获到不同的异常信息。



Throw 自定义抛出异常信息

同样俩个示例:

try { throw "exception test!" } catch { Write-Warning $_ }if (2 -ne 1){ throw "Terminating Error!" }




参考:

在 Windows PowerShell 中使用 –ErrorAction (–EA) 捕获错误

Chapter 11. Error Handling

PowerShell 在线教程


1 0
原创粉丝点击