屏蔽/捕获并输出错误

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 作用是屏蔽的所有输出提示 [不论正确与否]

原文地址:https://www.cnblogs.com/dreamer-fish/p/3884510.html