web-dev-qa-db-ja.com

PowerShellのNSLookupは常にRemoteExceptionエラーをスローします

PowerShellスクリプトからnslookupを実行すると、ルックアップが成功したにもかかわらず、常にエラー(コンソールに出力されます)が発生します。

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サーバーに対してルックアップを実行しても、エラーは返されません。

自分で解決策を見つけようとしたところ、これが見つかりました SO回答Resolve-DNSName コマンドを使用することをお勧めします。残念ながら、これにはWindows 8.1/Server 2012 R2が必要であり、スクリプトを実行するシステムの一部はWindows7時代です。

このエラーが表示されないようにするにはどうすればよいですか?

PowerShellがエラーが発生したと見なす理由を説明するためのボーナスポイント!

$ nullにリダイレクトして、実行可能ファイルのエラーを無視します

実行可能ファイルはSTDERRストリームに出力を送信しています。自動$ null変数にリダイレクトすることで抑制できます。

nslookup.exe example.com 2>$null

ノート:

  • PowerShellの$null変数にリダイレクトする必要があります。 PSでは、昔ながらの方法(つまり、2>nul)では実行できません。

  • $nullにリダイレクトする 高速Out-Nullを使用するよりも


説明

NSLookupは、出力の一部を STDERRストリーム に送信しています。 Windowsコンソールアプリケーションがこれを行うときはいつでも、PowerShellはこれをNativeCommandErrorエラーとして報告します。

コマンドプロンプトでnslookup -q=SOA superuser.com 1>nul 2>conを実行して、NSLookupがSTDERRに書き込んでいる内容を確認します。

権威のない答え:

これは正確にPowerShellがエラーメッセージの最初の行に返すものです。

nslookup:信頼できない回答:
行:1文字:1
+ nslookup -q = ns example.com

どうやらNSLookupは、その回答に権限のないネームサーバーからのレコードが含まれている場合にエラーを返します。ただし、問題ではないように思われる場合は、上記のエラーを無視してかまいません。