从批处理脚本分配 IP
Posted
技术标签:
【中文标题】从批处理脚本分配 IP【英文标题】:Assigning IP from Batch Script 【发布时间】:2014-04-08 05:17:56 【问题描述】:使用以下代码,我收到错误“无效的接口 LAN:指定”。此代码在 Win7 中有效,但在 Windows XP 中无效。我怀疑它与“!adapterName!”有关。在 XP 中发生冲突。
我利用这个脚本来获取 NIC 名称,以防它在未来发生一些变化并且希望保留这个方案。有什么想法可以在 XP 环境中继续使用此类脚本吗?
:: Set primary and alternate DNS for IPv4
@ECHO OFF
for /f "tokens=* delims=0" %%a in ("%SITEID%") DO set DROPZERO=%%a
SETLOCAL EnableDelayedExpansion
SET adapterName=
FOR /F "tokens=* delims=:" %%a IN ('IPCONFIG ^| FIND /I "ETHERNET ADAPTER"') DO SET adapterName=%%a
REM Removes "Ethernet adapter" from the front of the adapter name
SET adapterName=!adapterName:~17!
REM Removes the colon from the end of the adapter name
SET adapterName=!adapterName:~0,-1!
echo Setting Static IP Information...
set IP_Addr=10.102.%DROPZERO%.105
set D_Gate=10.102.%DROPZERO%.1
set Sub_Mask=255.255.255.0
netsh interface ip set address "!adapterName!" static %IP_Addr% %Sub_Mask% %D_Gate% 1 > output_net.txt
netsh interface ip set dns name="!adapterName!" static 10.98.1.26 primary >> output_net.txt
netsh interface ip add dns name="!adapterName!" 10.98.1.48 index=2 >> output_net.txt
【问题讨论】:
ipconfig
输出的格式可能与 Windows 7 到 XP 不同。在 Windows 7 和 XP 中查看 IPCONFIG ^| FIND /I "ETHERNET ADAPTER"
的输出。如果格式不同,那么您的 for 循环可能无法正确设置 adapterName
。
我按照您的建议对其进行了分解,并且正确设置了适配器名称。
用echo netsh
替换你的netsh
调用,看看这些命令是不是你认为的那样。
马克,谢谢!这把我的眼睛带到了他们需要的地方。这行代码 SET "adapterName=!adapterName:~0,-1!"实际需要是“adapterName=!adapterName:~0,-2!”注意 2. 删除适配器名称末尾的冒号。 -1 在 Win7 中工作,-2 在这种情况下需要。我已经验证了网卡的名称,也没有多余的空格。
既然你找到了解决办法,你能把它贴出来并标记为答案吗? :)
【参考方案1】:
这是T-Diddy 发布的批处理代码的改进版本,适用于英语和德语 Windows。
@echo off
rem Set primary and alternate DNS for IPv4.
setlocal
set "SITEID=020"
rem The next line removes leading zeros to define the third octet of the
rem IPv4 address always correct. There are implementations on IP address
rem parsing routines on Windows (for example command ping) and Linux which
rem interpret integer numbers with a leading 0 as octal number and not as
rem decimal number according to C standard. The number 020 would be set
rem unexpected as decimal number 16 instead of 20.
for /F "tokens=* delims=0" %%A in ("%SITEID%") do set DROPZERO=%%A
rem Get first ethernet adapter name output by command IPCONFIG filtered
rem by command FINDSTR with a case-insensitive regular expression search.
rem "Ethernet adapter " is output left to the name of the adapter on English
rem Windows. But on German Windows "Ethernetadapter" is the right word. This
rem is the reason for the regular expression with an optional space between
rem "ethernet" and "adpater".
set "AdapterName="
for /F "tokens=* delims=:" %%A in ('%SystemRoot%\System32\ipconfig.exe ^| %SystemRoot%\System32\findstr.exe /I /R "ethernet.*adapter"') do (
set "AdapterName=%%A"
goto SetAddress
)
rem No ethernet adapter found, exit batch job.
endlocal
goto :EOF
:SetAddress
rem Remove everything from beginning of string to first occurrence of
rem the string "adapter " to remove "Ethernet adapter " respectively
rem on German Windows "Ethernetadapter".
set "AdapterName=%AdapterName:*adapter =%"
rem Remove the colon from the end of the adapter name.
set "AdapterName=%AdapterName:~0,-1%"
echo Ethernet adapter found: %AdapterName%
echo Setting static IP information ...
set IpAddress=10.102.%DROPZERO%.105
set DefaultGate=10.102.%DROPZERO%.1
set SubNetMask=255.255.255.0
%SystemRoot%\System32\netsh.exe interface ip set address "%adapterName%" static %IpAddress% %SubNetMask% %DefaultGate% ^1>output_net.txt
%SystemRoot%\System32\netsh.exe interface ip set dns name="%adapterName%" static 10.98.1.26 primary>>output_net.txt
%SystemRoot%\System32\netsh.exe interface ip add dns name="%adapterName%" 10.98.1.48 index=^2>>output_net.txt
endlocal
我在这里没有看到在 Windows XP 上使用的问题
set "AdapterName=%AdapterName:~0,-1%"
但是在for
循环中使用命令findstr
而不是find
。并且在设置适配器名称时使用双引号,以避免错误地将尾随空格附加到适配器名称。这可能是重要的区别。
阅读此答案的每个人的一般说明:
切勿输入带有 1 或 2 个前导零的 IPv4 地址的 4 个八位字节。这很容易导致被解释为八进制数,这绝对不是任何人所期望的。
你不相信。在 Linux 或 Windows 上尝试一下,例如运行命令
ping 192.168.050.020
您是否预计 ping 会在输出中写入 192.168.40.16 执行?
【讨论】:
以上是关于从批处理脚本分配 IP的主要内容,如果未能解决你的问题,请参考以下文章