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 在线教程
- PowerShell 异常处理(trap / try…catch / Throw / $Error / $ConfirmPreference)
- try catch throw异常处理
- 异常处理 throw try catch
- 异常处理 try catch throw
- Java异常处理( try catch finally throw throws exception error)
- 异常(try-throw-catch)
- C++ try catch() throw 异常处理(一)
- c++ 异常处理(try catch throw)、命名空间
- C++处理异常 try,catch,throw
- C++ try catch() throw 异常处理
- C++ try catch() throw 异常处理
- C++ try catch() throw 异常处理
- C++处理异常 try,catch,throw
- C++处理异常 try,catch,throw
- C++语言处理异常 try catch throw
- C++异常处理机制---try&throw&catch
- C++处理异常 try,catch,throw
- C++中异常处理try-throw-catch
- Git使用教程3:MyEclipse+Egit+GitHub实现代码托管 【下】
- linux0.11 块设备驱动与高速缓冲区
- lazarus:一个函数修改目录名(文件夹名)
- 十一、机器学习系统设计笔记之对分类
- 从VCC,GND想到EMC
- PowerShell 异常处理(trap / try…catch / Throw / $Error / $ConfirmPreference)
- 文件上传
- C++ 用libcurl库进行http通讯网络编程
- Android中NavigationDrawer的分析
- 学习爬虫的记录
- android--(BroadcastReceiver)
- 十二、机器学习系统设计笔记之大数据
- 欢迎使用CSDN-markdown编辑器
- 批处理文件 bat 的入门命令