
Я пытаюсь заставить cmd копировать только определенный набор символов из вывода команды. Мне удалось выбрать строку, в которой находится фраза, но дальше я теряюсь. Вот моя команда на данный момент.
ipconfig | findstr /i "ipv4"
Я уверен, что вы знакомы с ipconfig
командой и findstr
командой. По сути, я изолирую IPv4-адрес конкретного компьютера. Вот что такое команда выше.
IPv4 Address. . . . . . . . . . . : 192.168.1.75
Я хотел бы изолировать "192.168.1." и сохранить его в переменной, чтобы использовать его гораздо позже в команде. Допустим, я установил "192.168.1." в переменную a
.
Следующая команда, которую я хочу запустить, сканирует все IP-адреса от 192.168.1.1 до 192.168.1.254 и сохраняет те, которые используются. Поскольку эта, которая скоро станет программой, будет запущена на разных компьютерах в разных местах, "192.168.1." будет отличаться, и я хочу изолировать все, что cmd помещает в его местоположение. Поэтому вышеупомянутая переменнаяаможет быть, но не ограничивается, 192.168.10., 10.10.10., или даже 1.1.1. в зависимости от ситуации. Вот код, который я буду использовать.
FOR /L %i IN (1,1,254) DO ping -n 1 (the 'a' variable)%i | FIND /i "bytes=">>c:\ipaddresses.txt
или если поможет то, как будет выглядеть переменная.
FOR /L %i IN (1,1,254) DO ping -n 1 192.168.1.%i | FIND /i "bytes=">>c:\ipaddresses.txt
Я использую 64-битную версию Windows 10 Pro.
решение1
Я хотел бы изолировать «192.168.1.» и сохранить его в переменной.
Используйте следующий пакетный файл (test.cmd):
@echo off
setlocal
setlocal enabledelayedexpansion
rem throw away everything except the IPv4 address line
for /f "usebackq tokens=*" %%a in (`ipconfig ^| findstr /i "ipv4"`) do (
rem we have for example "IPv4 Address. . . . . . . . . . . : 192.168.42.78"
rem split on : and get 2nd token
for /f delims^=^:^ tokens^=2 %%b in ('echo %%a') do (
rem we have " 192.168.42.78"
rem split on . and get 4 tokens (octets)
for /f "tokens=1-4 delims=." %%c in ("%%b") do (
set _o1=%%c
set _o2=%%d
set _o3=%%e
set _o4=%%f
rem strip leading space from first octet
set _3octet=!_o1:~1!.!_o2!.!_o3!.
echo !_3octet!
)
)
)
rem add additional commands here
endlocal
Примечания:
- Необходимое вам значение сохраняется в
_3octet
- Удалите то
echo
, что там для отладки - Замените
rem add additional commands here
на ваш "сетевой пинг"
Пример использования и вывода:
F:\test>ipconfig | findstr /i "ipv4"
IPv4 Address. . . . . . . . . . . : 192.168.42.78
F:\test>test
192.168.42.
Дальнейшее чтение
- Индекс AZ командной строки Windows CMD- Отличный справочник по всем вопросам, связанным с командной строкой Windows.
- включеноотложенное расширение- Отложенное расширение приведет к тому, что переменные будут расширяться во время выполнения, а не во время анализа.
- для /ф- Циклическая команда по результатам другой команды.
- ipconfig- Настройка IP (конфигурация интернет-протокола)
- набор- Отображение, установка или удаление переменных среды CMD. Изменения, сделанные с помощью SET, будут сохраняться только в течение текущего сеанса CMD.
- установитьлокальный- Установите параметры для управления видимостью переменных среды в пакетном файле.
- переменные- Извлечь часть переменной (подстроку).
решение2
У меня это работает на нескольких компьютерах:
for /F "tokens=14" %A in ('"ipconfig | findstr IPv4"') do echo %A
решение3
Попробуйте что-то вроде этого. "ipconfig /all > network_info.txt" просто создает txt-файл для программы.
ipconfig /all > network_info.txt
type network_info.txt | findstr /v Stuff | findstr /v Etc > whatyouwant.txt
set /p Build=<whatyouwant.txt
Этот вариант требует много времени, но невероятно прост. Вам придется продолжать делать
| findstr /v something
и замена слова на то, что вам нужно. Вам придется решить, как вы хотите удалить определенные слова из разных строк, но это сработает, если вам нужно просто. Я использую это на выходах для команд, чтобы удалить мусор, который мне не нужен. В идеале вы должны получить выход в txt, и он будет читать первую строку, так что у вас будет только одна строка txt. Надеюсь, я помог или помог кому-то еще, кому нужен этот ответ. Он запутанный, но вы также получите свой ответ в txt, если это плюс
решение4
Для назначения IP-адресов последовательно пронумерованным переменным среды (IP1, IP2). Для систем с несколькими сетевыми адаптерами.
@echo off
setlocal enabledelayedexpansion
set _count=1
for /f "usebackq tokens=*" %%a in (`ipconfig ^| findstr /i "ipv4"`) do (
for /f delims^=^:^ tokens^=2 %%b in ('echo %%a') do (
for /f "tokens=*" %%c IN ('echo %%b') do (set IP!_count!=%%c & echo IP!_count!=%%c & set /a _count+= 1)
)
)
set _count=
call :haltAndStore 2> nul
REM kludge: Forces batch processor to abort causing side-effect of persisting env vars.
:haltAndStore
()