【问题标题】:How to ignore warning errors?如何忽略警告错误?
【发布时间】:2015-06-08 13:02:59
【问题描述】:

我有以下 PowerShell 脚本。它获取给定 IP 地址内计算机的 NetBIOS 名称。我正在使用管道将结果转储到文本文件中。问题是如果 IP 地址不可用,则会打印警告。

这是 PowerShell 脚本:

function Get-ComputerNameByIP {
param( $IPAddress = $null )
BEGIN {
    $prefBackup = $WarningPreference
    $WarningPreference = 'SilentlyContinue'
}
PROCESS {
    if ($IPAddress -and $_) {
        throw ‘Please use either pipeline or input parameter’
        break
    } elseif ($IPAddress) {
        ([System.Net.Dns]::GetHostbyAddress($IPAddress))
    } 
    } else {
        $IPAddress = Read-Host “Please supply the IP Address”
        [System.Net.Dns]::GetHostbyAddress($IPAddress)
    }
}
END {
    $WarningPreference = $prefBackup
}

这是我希望忽略的错误消息:

警告:请求的名称有效,但未找到请求类型的数据

【问题讨论】:

  • 只是为了确保:您收到警告还是错误?警告以文本 WARNING: 开头,通常显示为黄色文本,而错误通常显示为红色文本并包含堆栈跟踪。

标签: powershell suppress-warnings powershell-ise


【解决方案1】:

您想抑制警告,而不是错误。通过将$WarningPreference 变量设置为SilentlyContinue,可以完全消除警告:

PS C:\> Write-Warning 'foo'
WARNING: foo
PS C:\> $prefBackup = $WarningPreference
PS C:\> $WarningPreference = 'SilentlyContinue'
PS C:\> Write-Warning 'foo'
PS C:\> $WarningPreference = $prefBackup
PS C:\> Write-Warning 'foo'
WARNING: foo

该设置与当前范围有关,因此如果您想禁止您的函数的所有警告,您只需在函数开头设置首选项:

function Get-ComputerNameByIP {
    param( $IPAddress = $null )

    BEGIN {
        $WarningPreference = 'SilentlyContinue'
    }

    PROCESS {
        if ($IPAddress -and $_) {
            throw ‘Please use either pipeline or input parameter’
            break
        } elseif ($IPAddress) {
            [System.Net.Dns]::GetHostbyAddress($IPAddress)
        } 
            [System.Net.Dns]::GetHostbyAddress($_)
        } else {
            $IPAddress = Read-Host "Please supply the IP Address"
            [System.Net.Dns]::GetHostbyAddress($IPAddress)
        }
    }

    END {}
}

如果您希望仅针对特定语句抑制警告,更简单的方法是将警告输出流redirect 发送到$null

[System.Net.Dns]::GetHostbyAddress($IPAddress) 3>$null

不过,警告流重定向仅在 PowerShell v3 和更新版本中可用。

【讨论】:

  • 是的,我的接受管道输入,检查编辑后的代码
  • 这样,1..255 | ForEach-Object {"192.168.1.$_"} | Get-ComputerNameByIP
  • 知道为什么操作会收到警告,就像我在运行该命令时遇到的错误一样吗?
【解决方案2】:

您可以将公共参数-WarningAction:SilentlyContinue 与生成警告的命令一起使用。这比在执行命令之前单独覆盖 $WarningPreference 并按照上面的建议将其恢复回来要好 - 这个参数基本上可以为你做到这一点。

WarningAction 参数覆盖当前命令的$WarningPreference 变量的值。因为$WarningPreference 变量的默认值为Continue,所以会显示警告并继续执行,除非您使用WarningAction 参数。

查看更多here

【讨论】:

    【解决方案3】:
    $ErrorActionPreference = "silentlyContinue"
    

    此全局变量控制那些提供间歇性(非终止)错误和警告的命令的错误输出。您的错误属于此类,因此请设置首选项以静默继续抑制这些警告。

    【讨论】:

    • 任何地方,begin 块似乎是最好的设置位置,尽管最好先在“begin”块中获取它的值,然后在“结束”块。此外,如果您修改函数以接受 -errorAction 参数,该参数被列为常见并控制任何类型的错误是否会中断进程,这可能会很好。
    • 即使将警告放入开始块后仍然显示警告
    • 您需要小心执行此操作,因为它是一个首选项变量并会影响当前的 powershell 会话。不仅仅是函数的范围。
    • @Matt 您无法通过参数将错误操作首选项更改为 .NET 函数调用,因此这可能是唯一的方法。
    • @Matt 除非您使用范围修饰符,否则对函数中首选项变量的更改不会影响其他范围。
    【解决方案4】:

    你可以使用一个 try/catch 块来做这样的事情。考虑以下示例,该示例使用格式正确但没有关联记录的 IP 地址。

    try{
        [System.Net.Dns]::GetHostbyAddress("127.0.0.56")
    } Catch [System.Management.Automation.MethodInvocationException]{
        Write-Host "Nothing Record Found"
    }
    

    当我对此进行测试时,您看到的错误被捕获为[System.Management.Automation.MethodInvocationException],因此我检查了该特定错误类型。根据它的名字,我敢肯定还有其他原因可以调用它。可以完全省略该部分,它将捕获所有错误。由于您考虑了其他一些可能性,因此您可能不需要它。

    如果这是一个问题,您可以检查$_.Exception.InnerException 的文本,看看它是否也与错误匹配。在上述情况下,它包含文本“The requested name is valid, but no data of the requested type was found”。

    这可能是错误的,因为我很好奇为什么您的错误以“警告”为前缀,而我的错误却没有。可能需要对我们的两个部分进行更多研究。

    【讨论】:

    • 让我再挖掘一下
    【解决方案5】:

    您可以捕获错误并强制 PowerShell 不对其执行任何操作,有点像 Try/Catch,但对整个脚本来说是全局的:

    TRAP {"" ;continue} 
    [System.Net.Dns]::GetHostbyAddress($IPAddress)
    

    【讨论】:

      猜你喜欢
      • 2018-12-12
      • 2018-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      • 2020-03-31
      • 2013-12-15
      相关资源
      最近更新 更多