Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 从ipconfig获取MAC和DHCP服务器_Windows_Batch File_Cmd_Winpe_Ipconfig - Fatal编程技术网

Windows 从ipconfig获取MAC和DHCP服务器

Windows 从ipconfig获取MAC和DHCP服务器,windows,batch-file,cmd,winpe,ipconfig,Windows,Batch File,Cmd,Winpe,Ipconfig,我正在WinPE环境中编写一个脚本,我希望在其中找到我的PXE服务器并将其发送到我的MAC地址以检索配置脚本 以下是我必须处理的问题: 服务器将有多个网络适配器。只有一个连接到我的PXE服务器 PXE服务器始终也是该网络上的DHCP服务器 可能有其他DHCP服务器连接到其他NIC PXE服务器也在侦听端口80 卷曲在WinPE映像中可用 我希望脚本中的最后一行是: curl -s -o %TEMP%/setup.cmd http://%PXE_IP%/cblr/svc/op/script/s

我正在WinPE环境中编写一个脚本,我希望在其中找到我的PXE服务器并将其发送到我的MAC地址以检索配置脚本

以下是我必须处理的问题:

  • 服务器将有多个网络适配器。只有一个连接到我的PXE服务器
  • PXE服务器始终也是该网络上的DHCP服务器
  • 可能有其他DHCP服务器连接到其他NIC
  • PXE服务器也在侦听端口80
  • 卷曲在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

这为我提供了每个适配器上DHCP服务器的IP地址。我能确定哪个是正确的。那又怎么样?我需要该适配器的相应MAC地址。该信息在输出中,但我将其与我的
find

一起丢弃。如果可能,我将在WinPE上使用
wmic
而不是ipconfig

获取所有活动接口的步骤

wmic nic where NetConnectionStatus=2 get InterfaceIndex, MACAddress,NetConnectionID /format:csv
我的计算机,13,40:47:40:4D:42:4C,无线网络连接
我的计算机,5800:50:56:C2:20:01,VMware网络适配器VMnet1

然后,对于每个InterfaceIndex,您只需要将其与dhcp服务器结合起来

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
输出:

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字符结尾。

这是我以前的项目(cca 2½年前)中的一个脚本,通过解析
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关闭
标题获取IP和MAC地址
@对于/f“delims=[]令牌=2”%%a in('ping-4-n 1%ComputerName%^ findstr[')do(
设置“PXE_IP=%%a”
)
@对于('getmac/NH/FO表')中的/f%%a,请执行以下操作(
@对于('echo%%a')中的/f%%b,请执行以下操作(
如果/I不是“%%b”=“不适用”(
设置“MY_MAC=%%b”
)
)
)
回显PXE_IP:%PXE_IP%
回显MAC地址:%MY\u MAC%
回音(
echo curl-s-o%TEMP%/setup.cmd http://%PXE\u IP%/cblr/svc/op/script/system/%MY\u MAC%/?script=setup.cmd
暂停>nul

使用
FOR/F
命令来解析
IPCONFIG
命令的输出。您可能还希望通过管道将
IPCONFIG
的输出传输到
FIND
命令。这样我就可以得到例如DHCP服务器。但是,一旦找到正确的DHCP服务器,我怎么知道该使用哪个MAC呢无法仅获取特定适配器的ipconfig。很遗憾,WinPE中没有wmic。:(