当我nslookup
从PowerShell脚本运行时,尽管查找成功,但始终会收到一个错误(输出到控制台):
PS C:\Windows\system32> $MyOutput = nslookup -q=SOA superuser.com
8.8.4.4 nslookup : Non-authoritative answer: At line:1 char:13
+ $MyOutput = nslookup -q=SOA superuser.com 8.8.4.4
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (Non-authoritative answer::String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
这似乎是由于答案不权威。针对权威DNS服务器进行查找不会返回错误。
在我自己寻找解决方案的尝试中,我找到了这个答案。建议使用Resolve-DNSName命令。不幸的是,这需要Windows 8.1 / Server 2012 R2,并且我的脚本将在其中运行的某些系统是Windows 7时代。
如何防止显示此错误?
奖励点,用于解释PowerShell为什么认为发生了错误!
如果您
—
消除
$ErrorActionPreference = "SilentlyContinue"
在脚本的开头进行设置,则应该能够阻止它。请记住,这将
$MyOutput = nslookup -q=SOA superuser.com 2>$null
nslookup
将Non-authoritative answer:
消息发送到stdERR 就足够了。为了证明这一点,运行>NUL nslookup -q=SOA superuser.com
以及2>NUL nslookup -q=SOA superuser.com
从打开的cmd
窗口......
就像评论所暗示的那样,这随Powershell版本的不同而不同。如果使用v5,则
—
根
Non-authoritative answer:
可以通过2>$null
重定向排除该行。如果使用输出错误的较小版本,则可以修改$ErrorActionPreference
。不要以为-ErrorAction
会在这里。.NET还有其他替代方法,包括[System.Net.Dns]::GetHostAddresses("superuser.com")
。
@ITSnuggles我正在执行的某些系统是Windows 7,带有该cmdlet的PS版本不在该OS上运行。:(
—
Twisty模仿者,
[System.Net.Dns]::Resolve("superuser.com")
代替Resolve-DNSName
cmdlet。关于nslookup
,有趣的是,它并没有在Posh 5中引发错误,而是将其定向Non-authoritative answer:
到控制台(即使将输出分配给变量-就像您的示例一样)