- IF – оператор условного выполнения команд в командных файлах Windows
- Nav view search
- Навигация
- Проверка соединения с сервером через bat-файл
- Батник, который пингует указанный IP-адрес и в случае отсутствия пинга запускает другой батник и закрывается
- Решение
- How to check if ping responded or not in a batch file
- 10 Answers 10
IF – оператор условного выполнения команд в командных файлах Windows
Формат командной строки:
IF [NOT] ERRORLEVEL число команда
IF [NOT] строка1==строка2 команда
IF [NOT] EXIST имя_файла команда
NOT — Указывает, что Windows должна выполнить эту команду, только если условие является ложным.
ERRORLEVEL число — Условие является истинным, если код возврата последней выполненной программы не меньше указанного числа.
строка1==строка2 — Условие является истинным, если указанные строки совпадают.
EXIST имя_файла — Условие является истинным, если файл с указанным именем существует.
команда — Задает команду, выполняемую при истинности условия. За этой командой может следовать ключевое слово ELSE. В случае, если указанное условие ложно, будет выполнена команда, находящаяся после слова ELSE.
Предложение ELSE должно располагаться в той же строке, что и команда, следующая за ключевым словом IF. Например:
IF EXIST имя_файла. (
del имя_файла.
) ELSE (
echo имя_файла. missing.
)
Следующий пример содержит ОШИБКУ, поскольку команда del должна заканчиваться переходом на новую строку:
IF EXIST имя_файла. del имя_файла. ELSE echo имя_файла. Missing
Следующий пример также содержит ОШИБКУ, поскольку команда ELSE должна располагаться в той же строке, что и команда, следующая за IF:
IF EXIST имя_файла. del имя_файла.
ELSE echo имя_файла. missing
Вот правильный пример, где все команды расположены в одной строке:
IF EXIST имя_файла. (del имя_файла.) ELSE echo имя_файла. Missing
Изменение команды IF при включении расширенной обработки команд:
IF [/I] строка1 оператор_сравнения строка2 команда
IF CMDEXTVERSION число команда
IF DEFINED переменная команда
где оператор_сравнения принимает следующие значения:
EQU — равно
NEQ — не равно
LSS — меньше
LEQ — меньше или равно
GTR — больше
GEQ — больше или равно,
а ключ /I , если он указан, задает сравнение текстовых строк без учета регистра. Ключ /I можно также использовать и в форме строка1==строка2 команды IF. Сравнения проводятся по общему типу данных, так что если строки 1 и 2 содержат только цифры, то обе строки преобразуются в числа, после чего выполняется сравнение чисел.
Условие CMDEXTVERSION применяется подобно условию ERRORLEVEL, но значение сравнивается с внутренним номером версии текущей реализации расширенной обработки команд. Первая версия имеет номер 1. Номер версии будет увеличиваться на единицу при каждом добавлении существенных возможностей расширенной обработки команд. Если расширенная обработка команд отключена, условие CMDEXTVERSION никогда не бывает истинно.
Условие DEFINED применяется подобно условию EXIST , но принимает в качестве аргумента имя переменной среды и возвращает истинное значение, если эта переменная определена.
Строка %ERRORLEVEL% будет развернута в строковое представление текущего значения кода ошибки ERRORLEVEL, за исключением ситуации, когда уже имеется переменная среды с именем ERRORLEVEL; в подобном случае подставляется значение этой переменной. Например, с помощью данной строки можно выполнить следующее:
goto answer%ERRORLEVEL%
:answer0
echo Получен код возврата 0
:answer1
echo Получен код возврата 1
Допускается и применение описанных выше операторов числового сравнения:
IF %ERRORLEVEL% LEQ 1 goto okay
Строка %CMDCMDLINE% будет развернута в исходную командную строку, переданную CMD.EXE до любой обработки, за исключением ситуации, когда уже определена переменная среды с именем CMDCMDLINE; в подобном случае подставляется значение этой переменной.
Строка %CMDEXTVERSION% будет развернута в строку, представляющую собой текущее значение CMDEXTVERSION, за исключением ситуации, когда уже имеется переменная среды с именем CMDEXTVERSION; в подобном случае подставляется значение этой переменной.
Создание пустого файла, имя которого задается параметром командной строки.
Если параметр командной строки не задан, то пользователю выдается сообщение об ошибке.
@echo off
REM Проверить наличие имени файла, задаваемого в качестве параметра %1
REM Если параметр %1 пустой – переход на метку error
if «%1» EQU «» goto error
REM Если параметр задан, создаем пустой файл, копированием из устройства nul
copy nul «%1»
exit
:error
ECHO File name required ! Must be — %
n0 filename.ext
:exit
Командный файл, выполняющий опрос командой ping сетевых адресов в заданном диапазоне ( 192.168.1.1 – 192.168.1.254 ). Команда ping формирует значение переменной ERRORLEVEL равное нулю, если верно заданы параметры командной строки. То есть, определить доступность пингуемого IP-адреса методом анализа кода возврата ping не получится, поскольку он будет нулевым, независимо от того, отвечает ли пингуемое устройство, или нет. Поэтому, для решения данной задачи необходимо определить характерный признак, который присутствует в выводимых результатах только в том случае, когда пингуемое устройство доступно. Таким признаком может быть наличие строки символов «TTL» в выводе команды ping. Для определения признака можно использовать команду find в цепочке с командой ping .
Примеры вывода для отвечающего и не отвечающего узлов:
Ответ от 192.168.1.1: число байт=32 время=1мс TTL=64 — если устройство с данным IP-адресом доступно;
Превышен интервал ожидания для запроса. — если устройство не отвечает;
Команда find /I «TTL» возвращает код ERRORLEVEL равный 0 , если строка «TTL» присутствует в результате выполнения ping . Ключ /I имеет смысл использовать, чтобы результат не зависил от того, строчные или заглавные символы составляют строку «ttl».
Результат работы командного файла записывается в текстовый файл iplist.txt
@ECHO OFF
REM Постоянная часть IP-адреса
set IPTMP=192.168.1.
REM Количество пингуемых узлов
set N=254
rem С какого адреса начать — начальное значение » хвоста » IP- адреса X.X.X.IPMIN
set /A IPMIN=1
ECHO %DATE% Опрос пингом %N% адресов начиная с %IPTMP%%IPMIN% >> iplist.txt
rem M0 — метка для организации цикла
:M0
rem Переменная IPFULL — полное значение текущего IP-адреса
set IPFULL=%IPTMP%%IPMIN%
rem Если » хвост «больше N – перейти к завершению работы
IF %IPMIN% GTR %N% GOTO ENDJOB
ping -n 1 %IPFULL% | find /I «TTL»
if %ERRORLEVEL%==0 Echo %IPFULL% >> iplist.txt
rem Сформируем следующий IP-адрес
set /A IPMIN=%IPMIN% + 1
rem Перейдем на выполнение следующего шага
GOTO M0
rem Завершение работы
:endjob
exit
Существуют некоторые особенности реализации командного интерпретатора CMD.EXE , которые необходимо учитывать при обработке значений переменных внутри циклов IF и FOR . Использование значений переменных внутри скобок, требует изменения стандартного режима интерпретации командного процессора. Разработчиками предусмотрена возможность запуска CMD.EXE с параметром /V:ON , что включает разрешение отложенного расширения переменных среды с применением символа восклицательного знака ( ! ) в качестве разделителя. То есть, параметр /V:ON разрешает использовать !var! в качестве значения переменной var во время выполнения внутри циклов команд FOR и IF . Но на практике чаще используется возможность локального включения данного режима внутри командного файла специальной директивой:
После чего, можно обрабатывать принимаемые переменными значения внутри цикла, используя вместо знаков процента восклицательные знаки:
FOR … (
IF !ERRORLEVEL!==0 вместо %ERRORLEVEL%==0
…
)
    В русскоязычной справке команды IF имеется ошибка, которая много лет переходит из версии в версию — вместо оператора EQU — равно , указано EQL — равно
Nav view search
Навигация
Проверка соединения с сервером через bat-файл
Проверка соединения с сервером через bat-файл
Иногда нужен такой файл или программка которая сама бы тестировала соединение с серверами.
Для своего пользования я сделал такой его конечно можно модернизировать и улучшить.
Чтобы в окне отображались русские буквы воспользуйтесь кодировщиком.
Принцип работы такой команда ping посылает 2 пакета на сервер.
Если оба пакета прошли то сервер подключен.
Если один пакет прошел другой нет то сервер подключен.
Появляется надпись conect
Если оба пакета не прошли то сервер отключен
Появляется надпись disconect
сервера тестируются последовательно.
Так будет выгладить запущенный пакетный файл.
@echo off
color 1a
TITLE proverka serverov
:proverka
:: сервер 1
echo server 1
ping -n 2 192.168.1.1 | find «TTL=» > nul
if %ERRORLEVEL% EQU 0 echo conect
if %ERRORLEVEL% EQU 1 echo disconect
:: сервер 2
echo server 2
ping -n 2 192.168.1.121 | find «TTL=» > nul
if %ERRORLEVEL% EQU 0 echo conect
if %ERRORLEVEL% EQU 1 echo disconect
:: сервер 3
echo server 3
ping -n 2 192.168.1.243 | find «TTL=» > nul
if %ERRORLEVEL% EQU 0 echo conect
if %ERRORLEVEL% EQU 1 echo disconect
:: Конец проверки
TIMEOUT /T 5
goto proverka
Скрипт проверки соединения сейчас разберем по пунктам
@echo off —не выводить команды на экран
color 1a — цвет фона и букв
TITLE proverka serverov — Заголовок окна
:proverka —функция
::Сервер 1 Комментарии чтоб не забыть что проверяем
echo server1 — Имя сервера, который проверяем
ping — Команда пинг которая проверяет соединение
-n 2 — Количество пакетов для проверки.
можно ставить и больше но тогда тест будет проходить дольше.
192.168.1.1 -IP адрес сервера
| find «TTL=» > nul —Если хоть один пакет принят то все в норме
if %ERRORLEVEL% EQU 0 echo conect — подключен
if %ERRORLEVEL% EQU 1 echo disconect — Не подключен если оба пакета не прошли
TIMEOUT /T 5 — Ожидание 5 секунд
cls —Очищаем фон чтоб не копился мусор.
goto proverka — Возвращаемся к функции и проверяем снова
цикл длиться до бесконечности
не забудь сохранить к себе на стену в соц сети
Батник, который пингует указанный IP-адрес и в случае отсутствия пинга запускает другой батник и закрывается
Доброго времени суток, столкнулся с проблемой . нужен батник который будет пинговать айпишник к примеру 192.168.10.14, в отсутствии пинга он должен запустить другой батник и закрыться. Если пинг есть — просто пингует. Все что я не пробую либо пингует либо запускает(
Я полный чайник в этом очень хотелось бы попросить порекомендовать статьи, книги, любой материал с чего я могу начать и учиться, учиться, учиться.
Добавлено через 34 минуты
Нужно написать батник который запускает определенный файл
На вашей машине создайте исполняемый файл, который: В определенное время запускает файл который.
Как создать батник, который создает батник с командами?
Уже знаю, что такая тема была, но до конца не понял. Как создать батник, который создаст батник с.
Создать батник, который запускает файлы из указанной папки по афавиту
помогите создать батник который запускает файлы из указанной папки по афавиту и с заданным в.
Решение
огромное спасибо, осталось лишь два вопроса
1. как спрятать этот процесс от глаз (можно ли сделать так чтоб его не было видно)
2. что посоветуете почитать и с помощью чего лучше писать (все таки каждый раз просить не хочется)
Добавлено через 4 минуты
и вот еще)) когда нет пинга он постоянно запускает файл можно ли этот момент сделать разовым
Для скрытия консольных окон (bat и cmd файлов) есть несколько утилит.
Утилита cmdow
Для скрытия консольного окна в пакетном файле должна быть следующая строка:
Если строка является первой, то окно будет скрыто сразу, но мигнет на долю секунды. Если строка находится в середине, то окно будет скрыто после обработки команд предшествующих cmdow @ /HID.
Скрытие окна — не единственная функция утилиты. Подробнее читайте в Компьютерра-онлайн.
Домашняя странице программы
Выполнение отдельной команды
Основано на сообщении amel27 в форуме автоустановки.
Иногда требуется скрыть выполнение отдельной команды и нет возможности (или не хочется) создавать отдельный .bat или .cmd файл (например, при динамическом добавлении в раздел реестра RunOnce). В этом случае можно воспользоваться следующим синтаксисом:
CMD /C ( cmdow @ /HID) & ( )
CMD /C (%windir%\Bin\cmdow @ /HID)&(7za.exe x -y -aoa Far1705.7z -o»%ProgramFiles%»)
В командной строке указывается имя исполняемого файла и его командная строка.
hidcon.exe adduser.cmd username password
запустит в скрытой консоли adduser.cmd, передав ему в качестве первого параметра username, в качестве второго — password.
Автор — Oleg_Sch. Скачать утилиту можно отсюда или по прямой ссылке.
Утилита hidec
Сходна с hidcon.
Ключ /W (не чувствителен к регистру) заставляет дожидаться окончания отработки пакетного файла. Так в приведенном ниже примере
How to check if ping responded or not in a batch file
I want to continuously ping a server and see a message box when ever it responds i.e. server is currently down. I want to do it through batch file.
and can ping continuously by
But how do I check if it responded or not?
10 Answers 10
The following checklink.cmd program is a good place to start. It relies on the fact that you can do a single-shot ping and that, if successful, the output will contain the line:
By extracting tokens 5 and 7 and checking they’re respectively «Received» and «1,» , you can detect the success.
Call it with the name (or IP address) you want to test:
Take into account that, if your locale is not English, you must replace Received with the corresponding keyword in your locale, for example recibidos for Spanish. Do a test ping to discover what keyword is used in your locale.
To only notify you when the state changes, you can use:
However, as Gabe points out in a comment, you can just use ERRORLEVEL so the equivalent of that second script above becomes:
The question was to see if ping responded which this script does.
However this will not work if you get the Host Unreachable message as this returns ERRORLEVEL 0 and passes the check for Received = 1 used in this script, returning Link is UP from the script. Host Unreachable occurs when ping was delivered to target notwork but remote host cannot be found.
If I recall the correct way to check if ping was successful is to look for the string ‘TTL’ using Find.
This wont work with IPv6 networks because ping will not list TTL when receiving reply from IPv6 address.
I know this is an old thread, but I wanted to test if a machine was up on my system and unless I have misunderstood, none of the above works if my router reports that an address is unreachable. I am using a batch file rather than a script because I wanted to «KISS» on pretty much any WIN machine. So the approach I used was to do more than one ping and test for «Lost = 0» as follows
I haven’t tested this rigorously but so far it does the job for me
I have made a variant solution based on paxdiablo’s post
Place the following code in Waitlink.cmd
For example use it from another batch file like this
The call to waitlink will only return when a ping was succesful. Thanks to paxdiablo and Gabe. Hope this helps someone else.
Here’s something I found:
Note that ping 1.1.1.1 -n -w 1000 >NUL will wait 1 second but only works when connected to a network
You can ping without «-t» and check the exit code of the ping. It reports failure when there is no answer.
But sometimes first ping just fail and second one work (or vice versa) right? So we want to get success when at least one ICMP reply has been returned successfully:
I hope this helps someone. I use this bit of logic to verify if network shares are responsive before checking the individual paths. It should handle DNS names and IP addresses
A valid path in the text file would be \192.168.1.2\’folder’ or \NAS\’folder’
I’ve seen three results to a ping — The one we «want» where the IP replies, «Host Unreachable» and «timed out» (not sure of exact wording).
The first two return ERRORLEVEL of 0.
Timeout returns ERRORLEVEL of 1.
Are the other results and error levels that might be returned? (Besides using an invalid switch which returns the allowable switches and an errorlevel of 1.)
Apparently Host Unreachable can use one of the previously posted methods (although it’s hard to figure out when someone replies which case they’re writing code for) but does the timeout get returned in a similar manner that it can be parsed?
In general, how does one know what part of the results of the ping can be parsed? (Ie, why might Sent and/or Received and/or TTL be parseable, but not host unreachable?
Oh, and iSid, maybe there aren’t many upvotes because the people that read this don’t have enough points. So they get their question answered (or not) and leave.
I wasn’t posting the above as an answer. It should have been a comment but I didn’t see that choice.