我有以下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
}
这是我想忽略的错误消息:
警告:请求的名称有效,但未找到所请求类型的数据
答案 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)