从ipconfig获取MAC和DHCP服务器
我正在WinPE环境中编写一个脚本,我想要查找我的PXE服务器并将其发送给我的MAC地址以检索配置脚本。从ipconfig获取MAC和DHCP服务器
这是我不得不面对:
- 服务器将有多个网络适配器。只有一个连接到我的PXE服务器。
- PXE服务器始终也是该网络上的DHCP服务器。
- 可能有其他DHCP服务器连接到其他NIC。
- PXE服务器也在端口80上侦听。
- cURL在WinPE映像中可用。
我想在脚本中的最后一行是:
curl -s -o %TEMP%/setup.cmd http://%PXE_IP%/cblr/svc/op/script/system/%MY_MAC%/?script=setup.cmd
我看到,我得到ipconfig /all
所有必要的信息,但我不知道如何解析输出。
例如,我可以做
for /f "tokens=15 delims= " %%X in ('ipconfig /all ^| find "DHCP Server"') do echo %%X
这给了我的IP地址为每个适配器上的DHCP服务器。我可以确定哪个是正确的。但那又如何?我需要该适配器的相应MAC地址。这些信息在输出中,但是我用find
把它扔掉了。
我会使用wmic
而不是ipconfig,如果可能的话在WinPE上。
要获得所有活动接口
wmic nic where NetConnectionStatus=2 get InterfaceIndex, MACAddress,NetConnectionID /format:csv
我的电脑,13,40:47:40:4D:42:4C,无线网络连接
我的电脑,58,00:50:56:C2 :20:01,VMware的网络适配器VMnet1的
然后你只需要这与DHCP服务器结合起来,每个InterfaceIndex
wmic nicconfig get InterfaceIndex,DHCPServer /format:csv
我的电脑,10.0.0.1,13
我的电脑,, 58
有关读取数据时,你使用这样的事情
@echo off
setlocal EnableDelayedExpansion
REM *** Delete all previous variables beginning with "nic_"
for /F "delims==" %%V in ('set nic[ 2^> nul') do set "%%V="
for /F "skip=2 tokens=1-4* delims=," %%1 in ('"wmic nic where NetConnectionStatus=2 get InterfaceIndex, MACAddress,NetConnectionID,Status /format:csv"') do (
echo DEBUG: "%%4",%%2,%%3
set "nic[%%2].mac=%%3"
)
for /F "skip=2 delims=" %%L in ('"wmic nicconfig get InterfaceIndex,DHCPServer,IPAddress /format:csv"') do (
set "line=%%L"
set "line=""!line:,=,"!"" --- Pump up the csv line with quotes to avoid empty columns col1,,col2 transformed to "col1","","col3"
for /F "tokens=1-4* delims=," %%1 in ("!line!") do (
if "%%~2" NEQ "" (
set nic[%%~3].dhcpServer=%%~2
)
)
)
set nic
输出:
网卡[ 13] .dhcpServer = 10.0.0.1
nic [13] .mac = 40:47:40:4D:42:4C
NIC [58]的.Mac = 00:50:56:C2:20:01
顺便说一句。我有点欺骗,因为我总是获取一个我不需要的额外列,但它是为了避免这个问题,最后一列以CR字符结尾。
不幸的是wmic在WinPE中不可用。 :( –
下面是我的旧项目(cca2½年前)的脚本,通过解析ipconfig /ALL
输出模拟wmic
结果。适应它得到DHCP服务器的代替
IPv4地址
和
IPv6地址的
不应该是你一个艰巨的任务......
@ECHO OFF
@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!
)
我不知道这是否解决方案可用于或者不是在你的情况下获取IP和MAC地址?
@echo off
Title Get IP and MAC Address
@for /f "delims=[] tokens=2" %%a in ('ping -4 -n 1 %ComputerName% ^| findstr [') do (
set "PXE_IP=%%a"
)
@For /f %%a in ('getmac /NH /FO Table') do (
@For /f %%b in ('echo %%a') do (
If /I NOT "%%b"=="N/A" (
Set "MY_MAC=%%b"
)
)
)
echo PXE_IP : %PXE_IP%
echo MAC Address : %MY_MAC%
echo(
echo curl -s -o %TEMP%/setup.cmd http://%PXE_IP%/cblr/svc/op/script/system/%MY_MAC%/?script=setup.cmd
pause>nul
使用'FOR/F'命令来分析'IPCONFIG'命令的输出。你可能想要将'IPCONFIG'的输出传送给'FIND'命令。 – Squashman
这样我可以得到例如DHCP服务器。但是一旦我找到正确的DHCP服务器,我怎么知道哪个MAC用于那个? AFAIK我无法获得仅用于特定适配器的ipconfig。 –