Это мой скрипт (выводит ip из ipconfig)

@echo off
setlocal enabledelayedexpansion
for /f "tokens=1-2 delims=:" %%A in ('ipconfig^|find "IP"^|find ":10."') do set ip==%%B
set "ipaddress=%ip:~1%"
set "ipk=%ipaddress:~1,-2%"
echo %ipk%

Что я получаю: эхо выключено

1
fosfik 17 Сен 2018 в 16:00

2 ответа

Лучший ответ

Вы не можете быть уверены, что последняя часть IP-адреса представляет собой 2-значное число. Это может быть любое значение от 1 до 254, поэтому вырезание последних 2-х символов может не дать вам правильного результата.

К счастью для этого случая, поскольку IP-адреса разделены ., их можно рассматривать как расширения имен файлов с помощью модификаторов FOR.

А используя findstr (с условиями поиска регулярных выражений) вместо find для поиска IP-адреса, вы можете уменьшить количество каналов с 2 до 1.

@echo off
set "ipk=IP_NOT_FOUND"
for /f "tokens=2 delims=:" %%A in ('ipconfig^|findstr /IRC:"IPv4.*: *10\."') do set "ipk=%%~nA."
set "ipk=%ipk: =%"
echo %ipk%
pause

Однако неясно, что именно представляет ipk. Если вы хотели отобразить сетевой адрес, то, скорее всего, это будет неправильный способ сделать это, потому что сетевой адрес зависит от значения маски подсети, которая должна можно получить отдельно и выполнить вычисления с IP-адресом и маской подсети для получения правильного сетевого адреса.

Но это выходит за рамки вашего вопроса, поэтому я оставляю все как есть.

И вы должны знать, что если существует более одного сетевого адаптера с IP-адресом 10., то это вернет IP-адрес последнего перечисленного адаптера.

Интерпретация термина регулярного выражения findstr: "IPv4.*: *10\."
IPv4 Строка, содержащая строку «IPv4» (регистр не учитывается из-за переключателя /I)
.*:, за которым следует ноль или более любых символов, за которыми следует двоеточие :
*10\., за которым следует ноль или более пробелов, за которым следует 10. и остальная часть строки, если таковая имеется.

2
sst 19 Сен 2018 в 00:16

Диапазон вашей сети может в конечном итоге расшириться до других диапазонов IP, поэтому я подумал, что добавлю еще один вариант, в котором вам не придется жестко кодировать свой начальный диапазон. Так что это скорее расширение вашего запроса.

Здесь я просто беру настроенную подсеть, получаю IP-адрес в этом диапазоне и сопоставляю его с вашим IP-адресом, а затем повторяю его. Это не требует от вас жесткого кодирования начального диапазона IP:

@echo off
setlocal enabledelayedexpansion
for /f "tokens=2,3 delims={,}" %%a in ('"wmic nicconfig where IPEnabled="True" get DefaultIPGateway /value | find "I" "') do set gate_test=%%~a
set gate_test=!gate_test: =!
for /f "tokens=1-2 delims=^." %%i in ("!gate_test!") do set range=%%i.%%j
    for /f "delims=:" %%l in ('ipconfig ^| findstr IPv4') do (
      set ip=%%m
      set ip=!ip: =!
      for /f "tokens=1-2 delims=^." %%n in ("!ip!") do set iprange=%%n.%%o
     if !iprange! == !range! set ipaddress=!ip!
   )
)
echo !ipaddress!
0
Gerhard Barnard 17 Сен 2018 в 19:36