当处理一些特殊命令的时候,系统会进行提示。或者语句有错误时,则终止命令运行。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) 捕获错误