• 屏蔽/捕获并输出错误


    屏蔽/捕获并输出错误

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

  • 相关阅读:
    POJ2785-4 Values whose Sum is 0
    Codeforce 9C
    Codeforces 797C -Minimal string
    程序员自我修养
    异或
    Socket网络编程
    java编写本月日历
    PreparedStatement的用法
    项目导入时报错:The import javax.servlet.http.HttpServletRequest cannot be resolved 解决方法
    Dell灵越 5559笔记本安装固态硬盘 BIOS设置
  • 原文地址:https://www.cnblogs.com/zmwgz/p/11226858.html
Copyright © 2020-2023  润新知