屏蔽/捕获并输出错误
ErrorAction 只能屏蔽非终止性错误,可用参数值如下:(有关详细信息,键入“get-help about_commonparameters”)。
参数值:
Stop: 显示错误消息并停止执行。
Inquire: 显示错误消息,并询问您是否要继续。
Continue: 显示错误消息并继续执行。
SilentlyContinue: 无效果。不显示错误消息,执行继续而无中断。(默认)
$ErrorActionPreference 和 ErrorAction 通用参数都不会影响 Windows
示例:
gwmi win32_operatingsystem -ComputerName 192.168.9.2 -Credential $cred #如果连接不到计算机则会报错 gwmi win32_operatingsystem -ComputerName 192.168.9.2 -Credential $cred -ErrorAction silentlycontinue #如果连接不到计算机则不会出现报错信息 $process = Get-Process "asdfasd" -ErrorAction Silentlycontinue #使用 $? 判断是否正确
#从这里开始隐藏所有的错误信息 $ErrorActionPreference="SilentlyContinue" Stop-Process -Name "abc" #恢复$ErrorActionPreference,错误开始输出 $ErrorActionPreference="Continue"
屏蔽终止性错误:try{} catch {}
如下代码为 零除 错误,直接运行将会返回错误:
Write-Host "script begin" [int] "not a number" $denominator = 0 $result = 50 / $denominator Write-Host "script end" 使用try{} catch {}则会屏蔽其错误,没有输出: try { Write-Host "script begin" [int] "not a number" $denominator = 0 $result = 50 / $denominator Write-Host "script end" } catch {}
捕获终止错误并输出:
try {get-adf;write-host "adf"} catch {$_.exception.message}
检测到语法错误,会终止代码的执行,其错误会被捕获,但是 write-host "adf"并不会被继续执行。
结果:
捕获并输出非终止错误
有时候会需要捕获非终止错误,比如 Remove-Item d:\adfasdf.txt 删除一个不存在的文件:
try { remove-item d:\adfasdf.txt write-host "af" } catch {$_.exception.message}
结果其错误并未被捕获,因为其是一个非终止错误,错误级别较低:
可以将其改为终止错误,如下:
try { $ErrorActionPreference='stop' #终止错误 remove-item d:\adfasdf.txt write-host "af" } catch {$_.exception.message}
结果变成了终止错误,并被捕获:
可以使用如下方法捕获并输出非终止错误:
Remove-Item d:\adfasdf.txt 2>d:\za.txt 或者
Remove-Item d:\adfasdf.txt 2>>d:\za.txt (追加到文本)
自定义错误,使用 Trap:
Trap { "出错了啊: $($_.Exception.Message)"; Continue; } Remove-Item "Books" -ea Stop
结果:
还有一些错误是 ErrorAction和try{} catch {}都无法屏蔽的,如下:
net use \\192.168.9.2 2299 /user:administrator ,如果连接不到目标计算机,则会出现错误 “发生系统错误 53.找不到网络路径”。
可以使用 “>nul 2>nul” 屏蔽其错误信息,然后依然可以继续使用 $lastexitcode 或者 %errorlevel% 得到返回值
cmd /c " net use \\192.168.9.2 2GeneDNA9 /user:administrator >nul 2>nul"
解释:
>nul 或者 1>nul 作用是屏蔽成功执行命令的输出内容
2>nul 作用是屏蔽命令执行失败的输出内容
1>nul 2>nul 作用是屏蔽的所有输出提示 [不论正确与否]