タイトルにあるように、WindowsのIPアドレスとバッチを一致させたいのですが、どうすればよいですか?
「findstr 」は「 [0-9] 」のような正規表現と一致する可能性がありますが、「 findstr」はどのように一致するのでしょうか。
5 に答える
の正規表現のサポートは少し古いのでfindstr
、通常、Webで見つけたほとんどの正規表現を使用することはできません。以下は、ドットで区切られた4桁の数字に一致します。
ipconfig | findstr /r "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"
ただし、サブネットマスクではなくアドレスのみに関心がある場合は、
ipconfig | findstr /r "Address.*[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"
そして、はい、もしAddress: 232345.534.78678.345
それが明らかにIPアドレスではないようなものと一致するなら。しかし、通常、ipconfig
そのような文字列を吐き出すことはありません。
FINDSTRは、正規表現をサポートする唯一のネイティブバッチユーティリティです。しかし、サポートは非常に限られており、非標準です。サポートされている唯一の繰り返し式はです*
。さらに、最大15文字のクラス用語に制限されています(Windows FINDSTRコマンドの文書化されていない機能と制限は何ですか?を参照)。したがって、IPアドレスと正確に一致するネイティブバッチ正規表現を開発することは不可能だと思います。
ネイティブのWindowsユーティリティ内にとどまり、Power Shellを使用することも、CSCRIPTコマンドを介してJScriptまたはVBScriptを使用することもできます。3つすべてがはるかに優れた正規表現サポートを備えています。
または、Unixユーティリティの多数のWindowsポートのいずれかをダウンロードすることもできますが、その多くは無料です。GnuWin32は優れたリソースです(grepを含む):http://gnuwin32.sourceforge.net/
findstrコマンドの入力がipconfigの結果ではない場合は、次のコード行を使用して、テキストまたはcsvファイルでip-addressを検索できます。
findstr /r "\<[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\>" filename.txt
これは、ユーザーJoeyの回答にメタ文字を追加します。最初は 「\<」 、最後は「>」。このような文字列はあまり一般的ではない(または発生する可能性が非常に低い)場合でも、IPアドレスのような形式の文字列ではなく、末尾または先頭にアルファベット文字が含まれるようにします(例:A198.252.206)。 16または198.252.206.16A)が返されます。
単純な正規表現文字列は次のようになります
(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.(1?[0-9]?[0-9]|2[0-4][0-9])|25[0-5]
許容されるIPアドレスの範囲と正確に一致します。
編集:以下のコメントとfindstr情報の正規表現に基づいて、 [0-2][0-9][0-9]\.[0-2][0-9][0-9]\.[0-2][0-9][0-9]\.[0-2][0-9][0-9]
IPアドレスに一致するように上記の正規表現を変更します。どうやらFINDSTR
実際には、正規表現の解釈に制限があります。
tldr;
これはタイトルの「その他の方法」の部分に該当しますが、バッチコマンドでforループをfindstrと一緒に使用して、目的のIPを取得しました。私の場合、IPをIPと呼ばれる環境変数に設定しました。
コマンドは次のとおりです。
for /f "tokens=3 delims=: " %i in ('netsh interface ip show config name^="Ethernet" ^| findstr "IP Address"') do set IP=%i
それが何を意味するのか知りたい人のために、読んでください
たとえば、ほとんどのコマンドipconfig
はすべてのIPアドレスを出力するだけで、特定のIPアドレスが必要でした。私の場合はイーサネットネットワークアダプター用でした。
コマンドを使用すると、ネットワークアダプタのリストを表示できますnetsh interface ipv4 show interfaces
。ほとんどの人はWi-Fiまたはイーサネットを必要としています。
コマンドプロンプトへの出力には、次のような表が表示されます。
Idx Met MTU State Name
--- ---------- ---------- ------------ ---------------------------
1 75 4294967295 connected Loopback Pseudo-Interface 1
15 25 1500 connected Ethernet
17 5000 1500 connected vEthernet (Default Switch)
32 15 1500 connected vEthernet (DockerNAT)
名前の列に、必要なネットワークアダプター(イーサネット、Wi-Fiなど)が表示されます。
前述のように、私はEthernet
自分のケースに興味を持っていました。
そのアダプタのIPを取得するには、netshコマンドを使用できます。
netsh interface ip show config name="Ethernet"
これにより、次の出力が得られます。
Configuration for interface "Ethernet"
DHCP enabled: Yes
IP Address: 169.252.27.59
Subnet Prefix: 169.252.0.0/16 (mask 255.255.0.0)
InterfaceMetric: 25
DNS servers configured through DHCP: None
Register with which suffix: Primary only
WINS servers configured through DHCP: None
(セキュリティ上の理由から、上記の実際のIP番号を偽造しました)
findstr
さらに、ms-dosコマンドプロンプトのコマンドを使用して、必要な行を指定できます。ここでは、文字列を含む行が必要ですIP Address
。
netsh interface ip show config name="Ethernet" | findstr "IP Address"
これにより、次の出力が得られます。
IP Address: 169.252.27.59
次に、for
ファイル(この場合は複数行の文字列)を解析し、目的の区切り文字とアイテム番号に基づいて文字列の内容を分割できるコマンドを使用できます。
3番目の項目(tokens = 3)を探していること、およびスペース文字と:
区切り文字(delims=:
)として使用していることに注意してください。
for /f "tokens=3 delims=: " %i in ('netsh interface ip show config name^="Ethernet" ^| findstr "IP Address"') do set IP=%i
ループ内の各値またはトークンは変数%iとして出力されますが、私は3番目の「トークン」またはアイテム(したがってtokens=3
)にのみ関心があります。をエスケープして|
、を=
使用する必要があることに注意してください^
コマンドの最後に、for
返されるコンテンツで実行するコマンドを指定できます。この場合、私はset
値をと呼ばれる環境変数に割り当てるために使用していますIP
。必要に応じて、値や好きなものをエコーすることもできます。
これにより、環境変数に割り当てられた優先ネットワークアダプタのIPアドレスを使用して環境変数を取得できます。かなりきちんとしていますね
改善のためのアイデアがあればコメントを残してください。