从批处理脚本分配 IP



使用以下代码,我收到错误"无效的接口 LAN:指定"。 此代码在Win7中有效,但在Windows XP中不起作用。 我怀疑这与XP中的"!adapterName!"冲突有关。

我利用此脚本获取 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

这是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%System32ipconfig.exe ^| %SystemRoot%System32findstr.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%System32netsh.exe interface ip set address "%adapterName%" static %IpAddress% %SubNetMask% %DefaultGate% ^1>output_net.txt
%SystemRoot%System32netsh.exe interface ip set dns name="%adapterName%" static 10.98.1.26 primary>>output_net.txt
%SystemRoot%System32netsh.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。在设置适配器名称时使用双引号,以避免错误地在适配器名称后附加尾随空格。这可能是重要的区别。

给每个阅读这个答案的人的一般说明:

切勿输入 IPv4 地址的 4 个八位字节,其中包含 1 或 2 个前导零。这很容易导致被解释为八进制数,这绝对不是任何人期望的。

你不相信。在Linux或Windows上尝试一下,例如运行命令

ping 192.168.050.020

您是否期望 ping 以输出中写入的 192.168.40.16 执行?

相关内容

  • 没有找到相关文章

最新更新