Назначение IP из пакетного скрипта
С приведенным ниже кодом я получаю сообщение об ошибке "Неверный интерфейс 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
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
, И двойные кавычки используются при установке имени адаптера, чтобы избежать ошибочного добавления к имени адаптера завершающего пробела. Это может быть важным отличием.
Общее примечание для всех, кто читает этот ответ:
Никогда не вводите 4 октета адреса IPv4 с 1 или 2 ведущими нулями. Это может очень легко привести к интерпретации как восьмеричное число, которое определенно никто не ожидает.
Вы не верите этому. Попробуйте это на Linux или Windows, например, при запуске команды
ping 192.168.050.020
Вы ожидали, что ping выполняется с 192.168.40.16, как написано в выводе?