マシン上のすべてのインターフェース、IPおよびMACアドレスのリストを取得したい。この情報を取得するマシンがかなりあり(約600)、デバイスでバッチファイルを使用できません。コマンドを送信して、エコーされた出力を取得したいと思います。
必要な情報はすべてipconfig /all
にありますが、forループを使用してそれを解析する方法がわかりません。私はまだその複雑なループにまったく慣れていません。基本的に、可能であれば、1つのライナー出力を取得する必要があります。助言がありますか?
hostname, interface1 name, IP, Mac, interface2 name, ip mac,...
など。
編集:WMIC
の出力にはある程度の運がありましたが、ファイルに正しく表示するのに問題があります。これらを実行すると。
wmic computersystem get name
wmic nic where netenabled=true get netconnectionID
wmic /output:C:\wmictest.csv nicconfig where IPEnabled=True get ipaddress, macaddress /format:csv
私の出力にはnetconnectionID
が表示されません。また、テキストの前の空白行としての出力ファイル。大したことではありませんが、奇妙です。すべての情報をファイルに正しく取り込む方法に関する提案はありますか?これが私の出力例です。
Node,IPAddress,MACAddress
U8001674-TPL-A,{10.91.35.84;fe80::52b:9817:6bbf:dca4},F0:1F:AF:2A:5E:B5
これは、ローカルコンピューターのアクティブなアダプターごとに1行のecho =!HostName!,!NetConID!,!IP_Addrs!,!MAC_Addr!
で生成されるwmic
ソリューションです(リモートマシンに対して実行するために必要な適応を試すことはできません)。
@ECHO OFF >NUL
@SETLOCAL enableextensions enabledelayedexpansion
set "HostName="
wmic computersystem get name ^
/format:textvaluelist.xsl>"%temp%\cmptr.txt" 2>nul
for /F "tokens=1* delims==" %%G in ('type "%temp%\cmptr.txt"') do (
if /i "%%G"=="Name" set "HostName=%%~H"
)
set "MAC_Addr="
for /F "tokens=1* delims=:" %%G in ('ipconfig /all^|find /i "Physical Address"') do (
set "foo="
for %%I in (%%~H) do if not "%%~I"=="" set "foo=%%~I"
set "MAC_Addr=!foo:-=:!"
set "NetConID="
wmic nic where "NetEnabled='true' and MACAddress='!MAC_Addr!'" ^
list /format:textvaluelist.xsl>"%temp%\wmcnc.txt" 2>&1
for /F "tokens=1* delims==" %%I in ('type "%temp%\wmcnc.txt"') do (
if /i "%%I"=="NetConnectionID" set "NetConID=%%~J"
)
set "IP_Addrs="
wmic nicconfig where "IPEnabled='True' and MACAddress='!MAC_Addr!'" ^
list /format:textvaluelist.xsl>"%temp%\wmcnccfg.txt" 2>&1
for /F "tokens=1* delims==" %%I in ('type "%temp%\wmcnccfg.txt"') do (
if /i "%%I"=="IPAddress" set "IP_Addrs=%%~J"
)
if not "!NetConID!,!IP_Addrs!"=="," (
@echo =!HostName!,!NetConID!,!IP_Addrs!,!MAC_Addr!
)
)
:endlocal
del "%temp%\cmptr.txt" 2>nul
del "%temp%\wmcnc.txt" 2>nul
del "%temp%\wmcnccfg.txt" 2>nul
@ENDLOCAL
goto :eof
別のソリューションは、ipconfig /ALL
からの半線形出力を解析し、次のように前のwmic
に最も近い結果を提供します。
@ECHO OFF >NUL
@SETLOCAL enableextensions enabledelayedexpansion
set "HostName="
set "NetConID="
set "IP_Addr4="
set "IP_Addr6="
set "MAC_Addr="
for /F "tokens=1* delims=:" %%G in ('ipconfig /ALL') do (
set "foo=%%~G"
if not "!foo:Host name=!"=="!foo!" (
for %%I in (%%~H) do if not "%%~I"=="" set "HostName=%%~I"
)
if "!foo:adapter=!"=="!foo!" (
if not "!foo:Physical Address=!"=="!foo!" (
for %%I in (%%~H) do if not "%%~I"=="" set "MAC_Addr=%%~I"
)
if not "!foo:IPv4 Address=!"=="!foo!" (
for %%I in (%%~H) do if not "%%~I"=="" set "IP_Addr4=%%~I"
set "IP_Addr4=!IP_Addr4:(preferred)=!"
)
if not "!foo:local IPv6 Address=!"=="!foo!" (
for %%I in (%%~H) do (
if not "%%~I"=="" (
for /F "delims=%%" %%p in ("%%~I") Do set "IP_Addr6=%%~p"
rem set "IP_Addr6=!IP_Addr6:(preferred)=!"
)
)
)
) else (
if not "!IP_Addr6!,!IP_Addr4!"=="," (
@echo #!HostName!,!NetConID!,{"!IP_Addr4!","!IP_Addr6!"},!MAC_Addr!
)
set "MAC_Addr="
set "IP_Addr4="
set "IP_Addr6="
set "NetConID=!foo:*adapter =!"
)
)
if not "!IP_Addr6!,!IP_Addr4!"=="," (
@echo =!HostName!,!NetConID!,{"!IP_Addr4!","!IP_Addr6!"},!MAC_Addr!
)
:endlocal
@ENDLOCAL
goto :eof
私は使うだろう:
wmic nicconfig where "IPEnabled = True" get ipaddress
...そしてあなたが手に入れたいもの。出力を解析する必要はありません。