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

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


【$ConfirmPreference】

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

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


当前自动确认级别:

#当前自动确认级别
$ConfirmPreference


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


设置级别:

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



【$Error】

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

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

Get-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.txt
Remove-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.txt
Remove-Item "delfile1.txt" -ea stop
Remove-Item "WrongFile" -ea stop
Remove-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.txt
Remove-Item "WrongFile" -ea stop
1/$null
Remove-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 在线教程


  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值