2017-03-08 159 views
3

我正在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把它扔掉了。

+0

使用'FOR/F'命令來分析'IPCONFIG'命令的輸出。你可能想要將'IPCONFIG'的輸出傳送給'FIND'命令。 – Squashman

+0

這樣我可以得到例如DHCP服務器。但是一旦我找到正確的DHCP服務器,我怎麼知道哪個MAC用於那個? AFAIK我無法獲得僅用於特定適配器的ipconfig。 –

回答

1

我會使用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字符結尾。

+0

不幸的是wmic在WinPE中不可用。 :( –

1

下面是我的舊項目(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! 
) 
0

我不知道這是否解決方案可用於或者不是在你的情況下獲取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