5

PowerShell スクリプトで nslookup を実行し、出力を解析可能な文字列変数に割り当てたいと考えています。CMD の実行から PowerShell ウィンドウに "Non-authoritative answer:" のようなエコーが表示されたくないのですが、コマンドの出力を排他的に変数にパイプまたはリダイレクトしようとしても、うまくいかなかったり、変数が破損したりしませんでした。 .

例:

PS> $temp = (& nslookup 'myip.opendns.com','resolver1.opendns.com');
Non-authoritative answer:

いくつかの回避策を試しました...

PS> $temp = Invoke-Expression "cmd /c nslookup myip.opendns.com resolver1.opendns.com" >$null

PS> $temp = Invoke-Expression "cmd /c @ECHO off && nslookup myip.opendns.com resolver1.opendns.com"

たぶん、これを行うためのより良い方法があります。ここで IP アドレスを取得するためだけに文字列を操作する方法は、必要以上に数行多くなります。

$temp = (nslookup myip.opendns.com resolver1.opendns.com) | Out-String
$temp = $temp.split()
$tempIPs = $temp -match "^(.|\r|\n)*?\b(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b"
$publicIP = $tempIPs[1]
return $PublicIP

nslookup で行っているように、2 つのサーバーを使用すると、powershell の Resolve-DnsName コマンドが機能しないように見えるため、このルートを使用しました。ルックアップをリダイレクトしてパブリック IP を取得するため、2 つのサーバーが必要です。それを行う方法は他にもありますが、これは非常にうまく機能(invoke-WebRequest ifconfig.me/ip).Contentし、このスクリプトの作業中にエラーが発生しました。

4

1 に答える 1

6

-Serverのパラメータを指定して、クエリを解決するサーバーを指定できますResolve-DnsName

Resolve-DnsName -Name myip.opendns.com -Server resolver1.opendns.com

コマンドのMSDNドキュメントから:Resolve-DnsName

-Server <String[]>
    照会する DNS サーバーの IP アドレスまたはホスト名を指定します。デフォルトでは、このパラメーターが指定されていない場合、インターフェース DNS サーバーが照会されます。

于 2015-09-04T13:12:47.200 に答える