0
点赞
收藏
分享

微信扫一扫

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


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


【$ConfirmPreference】

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

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

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



当前自动确认级别:

#当前自动确认级别
$ConfirmPreference


#查看$ConfirmPreference支持的设置,参数为枚举类型
[ENUM]::GetNames($ConfirmPreference.GetType())

PowerShell 异常处理(trap / try…catch / Throw / $Error / $ConfirmPreference)_错误信息_02



设置级别:

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




【$Error】

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

Remove-Item "WrongFile" -ErrorVariable ErrorVar -ErrorAction "SilentlyContinue"
$ErrorVar

Get-WmiObject Win32_Service –comp "Server" -ErrorVariable ErrorVar -ErrorAction "SilentlyContinue"
$ErrorVar

PowerShell 异常处理(trap / try…catch / Throw / $Error / $ConfirmPreference)_自定义_03




如没有使用 -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()

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




【$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
};
"操作成功!"

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




try…catch 捕获异常:

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

try { 1/0 } catch { Write-Warning $_ }

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

PowerShell 异常处理(trap / try…catch / Throw / $Error / $ConfirmPreference)_自定义_06




trap 捕获异常:

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

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

> notepad test.ps1

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

PowerShell 异常处理(trap / try…catch / Throw / $Error / $ConfirmPreference)_错误信息_07



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

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


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

PowerShell 异常处理(trap / try…catch / Throw / $Error / $ConfirmPreference)_错误信息_08


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

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

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

PowerShell 异常处理(trap / try…catch / Throw / $Error / $ConfirmPreference)_错误信息_09



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



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

更改脚本 test.ps1 为:

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

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


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



Throw 自定义抛出异常信息

同样俩个示例:

try { throw "exception test!" } catch { Write-Warning $_ }

if (2 -ne 1){ throw "Terminating Error!" }

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





参考:

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

​​Chapter 11. Error Handling​​

​​PowerShell 在线教程​​


举报

相关推荐

0 条评论