Создайте командный файл, который сначала будет проверять связь с IP-адресом и проверять, что он не используется, перед установкой IP-адреса IPv4 «Подключение по локальной сети» - PullRequest
1 голос
/ 05 мая 2020

В настоящее время я работаю на заводе, который в основном использует сеть управления на основе ethe rnet, предназначенную для всего оборудования автоматизации. Чтобы сэкономить время, я создал пакетный файл для каждой системы на заводе, чтобы иметь возможность быстро изменять IP-адрес моего компьютера, когда я нахожусь в разных частях завода. Я создал этот каталог пакетных файлов и разместил их на нашем сервере, чтобы наши специалисты по обслуживанию могли получить к ним доступ. Хотя это работает хорошо, мне пришло в голову, что если несколько человек попытаются go онлайн таким образом, в сети будут конфликтовать IP-адреса.

Я попытался изменить свой пакетный файл (ы) для первого эхо-запроса IP-адреса (10.120.194.254), затем, в зависимости от результата, либо измените IPv4 «Подключение по локальной сети» на этот IP-адрес, либо перейдите к следующему доступному IP-адресу (10.120.194.253) ... (10.120.194.252) )... и так далее. Моя идеальная цель - выполнить ту же процедуру для 5 IP-адресов, а затем, если все они окажутся неудачными, отобразить диалоговое окно, в котором отображается сообщение для проверки количества пользователей в сети. Обычно IP-адреса xxx.xxx.xxx.250-254 используются для программирования в сети, поэтому это и есть причина. Вероятность того, что в сети будет такое количество пользователей, мала, но было бы неплохо иметь эту функцию «на всякий случай».

Ниже приведен мой код исходного командного файла для изменения IP-адреса для IPv4 «Подключение по локальной сети».

@echo off
netsh interface IPv4 set address name="Local Area Connection" static 10.120.194.254 255.255.255.0

@echo off
netsh interface IPv4 set dns name="Local Area Connection" source=dhcp

Я попытался использовать функцию уровня ошибок, но не смог получить согласованные результаты при проверке связи с сетью. Кроме того, каждый раз, когда я пингую адрес, он опрашивает 4 раза, а затем переходит к следующему. Есть ли способ сократить время опроса? Ниже приведен мой код для командного файла, который я пытался заставить работать:

@echo off

ping "10.120.194.254"

IF %errorlevel%==0 GOTO IP_Attempt2
    @echo off
    netsh interface IPv4 set address name="Local Area Connection" static 10.120.194.254 255.255.255.0
    @echo off
    netsh interface IPv4 set dns name="Local Area Connection" source=dhcp
    exit /b

:IP_Attempt2

ping "10.120.194.253"

IF %errorlevel%==0 GOTO IP_Attempt3
    @echo off
    netsh interface IPv4 set address name="Local Area Connection" static 10.120.194.253 255.255.255.0
    @echo off
    netsh interface IPv4 set dns name="Local Area Connection" source=dhcp
    exit /b

:IP_Attempt3

ping "10.120.194.252"

IF %errorlevel%==0 GOTO IP_Attempt4
    @echo off
    netsh interface IPv4 set address name="Local Area Connection" static 10.120.194.252 255.255.255.0
    @echo off
    netsh interface IPv4 set dns name="Local Area Connection" source=dhcp
    exit /b

:IP_Attempt4

ping "10.120.194.251"

IF %errorlevel%==0 GOTO IP_Attempt5
    @echo off
    netsh interface IPv4 set address name="Local Area Connection" static 10.120.194.251 255.255.255.0
    @echo off
    netsh interface IPv4 set dns name="Local Area Connection" source=dhcp
    exit /b

:IP_Attempt5

ping "10.120.194.250"

IF %errorlevel%==0 GOTO Max_IP_Attempts
    @echo off
    netsh interface IPv4 set address name="Local Area Connection" static 10.120.194.250 255.255.255.0
    @echo off
    netsh interface IPv4 set dns name="Local Area Connection" source=dhcp
    exit /b

:Max_IP_Attempts

echo Max attempts have been made with this batch file. Verify users on the network.
pause
exit /b

Я прикрепил снимок окна подсказки CMD после запуска командного файла: IP Address snapshot

Ответы [ 2 ]

2 голосов
/ 06 мая 2020

From https://ss64.com/nt/ping.html:

Успешный PING НЕ всегда возвращает %errorlevel% из 0 Поэтому, чтобы надежно обнаружить успешный ping, направьте вывод в FIND и найдите текст «TTL».

В вашем случае вы захотите передать вывод FIND в переменную с FOR l oop. Если FIND не находит «TTL» в выходном тексте, переменная не будет определена. Вы можете проверить, определена ли переменная или нет, чтобы определить ваш результат (либо перейти к следующему IP, либо установить текущий IP как локальный адрес). В вашем сценарии это может выглядеть примерно так:

FOR /F "delims=" %%f IN ('ping "IP" ^| find "TTL"') DO (SET tempVar=%%f)
IF NOT DEFINED tempVAR netsh interface IPv4 set address name="Local Area Connection" static IP 255.255.255.0 & netsh interface IPv4 set dns name="Local Area Connection" source=dhcp & EXIT /B
GOTO IP_Attempt$

В первой строке | направляет вывод ping в команду find (| экранируется кареткой). Вторая строка - это повторная реализация вашего оператора IF. & свяжет команды вместе, чтобы их можно было обрабатывать в одном предложении IF. Если предложение IF не совпадает, третья строка будет GOTO вашей следующей меткой.

Более того, каждый раз, когда я пингую адрес, он опрашивает 4 раза, а затем переходит к следующему . Есть ли способ сократить время опроса?

Попробуйте ping -n 1 target_IP. Он будет пинговать только один раз, прежде чем двигаться дальше. Для большинства встроенных команд вы можете получить удовлетворительную распечатку функциональности, попробовав [command] /? в CMD.

SS64 , DosTips и страница Wikibooks по пакетному сценарию также являются хорошими справочными материалами, если вы когда-нибудь застряли.

Надеюсь, это поможет. Это и мой первый вклад, поэтому, пожалуйста, не стесняйтесь спрашивать, не оставил ли я что-то неясное (или если у вас есть дополнительные вопросы).

0 голосов
/ 06 мая 2020

Чтение вашего вопроса похоже на вопрос:

Как я могу найти использованные или бесплатные IP-адреса в моем su bnet, используя windows пакетные файлы?

И ответ состоит в основном из трех строк кода плюс некоторые пояснения:

if exist ips.txt del ips.txt > nul

echo Please enter the first 24 bits of your subnet (e.g. 192.168.0):
set /p ip=

for /L %%N IN (1, 1, 254) DO (
    echo pinging %ip%.%%N
    ping %ip%.%%N -n 1 -w 1 | find "TTL" && echo %ip%.%%N >> ips.txt
)

cls
type ips.txt

Каждый IP-адрес, который отвечает на один пинг, записывается в ips.txt. Это ваш список «не использовать». Вы можете легко настроить этот фрагмент так, чтобы он работал автоматически каждые n минут и без ввода данных пользователем, или для вывода бесплатных IP-адресов и игнорирования используемых. netsh interface ip set address "LAN" static %ip% %subnet% %gateway%. Для получения дополнительной информации об использовании netsh вы можете прочитать назначить IP-адрес с помощью командного файла или Как изменить IP-адрес с помощью скрипта на windows.


Хотя этот подход может идеально соответствовать вашим потребностям, следует рассмотреть возможность использования IP-управления на основе DHCP или фиксированных IP-адресов для каждой станции. Но это не StackOverflow-часть вашего вопроса. Помощь в управлении сетями и инфраструктурой можно найти в других сообществах.

...