如何忽略警告错误?

时间:2015-06-08 13:03:00

标签: powershell suppress-warnings powershell-ise

我有以下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
}

这是我想忽略的错误消息:

  

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

5 个答案:

答案 0 :(得分:3)

您想要禁止警告,而不是错误。通过将$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 :(得分:2)

您可以将公用参数-WarningAction:SilentlyContinue与生成警告的命令一起使用。比执行上面建议的命令之前先覆盖$WarningPreference并在之后将其还原之前更好-此参数基本上可以为您完成此操作。

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

查看更多here

答案 2 :(得分:1)

$ErrorActionPreference = "silentlyContinue"

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

答案 3 :(得分:1)

你可以使用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"。

这可能是错的,因为我很好奇为什么你的错误以"警告"为前缀。我的不是。可能需要对我们的两个部分进行更多的研究。

答案 4 :(得分:0)

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

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