Script windows переменная if

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 — %

Читайте также:  Adobe flash plugin debian linux

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

)

&nbsp &nbsp В русскоязычной справке команды IF имеется ошибка, которая много лет переходит из версии в версию — вместо оператора EQU — равно , указано EQL — равно

Как работать с логическими условиями IF в Powershell ELSEIF и ELSE на примерах

17 октября 2019

Логические операторы IF ElseIf и Else в Powershell относятся к основным командам условий не только в этом языке, но и в других. Благодаря таким операторам в наших скриптах добавляются условия.

Вы можете представить скрипт, где вам нужно поставить запятую в выражении «Казнить нельзя помиловать». В зависимости от того к чему это выражение применяется запятая будет стоять в разных местах и эту проблему решает условный оператор.

Навигация по посту

Условия

Самих условий может быть несколько. Каждый будет разобран дальше.

Этот оператор работает самый первый из блока условий и является обязательным в случае любых условий. Когда мы хотим проверить само существование значение достаточно указать переменную:

Результат любого сравнение приравнивается к 2 булевым значениям — это True (правда, существует) и False (ложь, не существует, $None). Если вы передаете переменную в условие без каких либо дополнительных операторов, то само существование значения у переменной позволяет выполнить следующую часть и написать «Условие выполнено». Та часть, которая экранируется в фигурные скобки называется ScriptBlock.

На следующем примере, в первом случае у нас вернется True, так как значение у переменной существует. Во втором случае мы проверяем переменную, которая не хранит никаких значений (она не была объявлена), а значит соответствует $null и вернет False:

Читайте также:  Windows 10 утилита создателя usb

Этот оператор не является обязательным. Else используется когда результаты предыдущих проверок равен Fasle:

Обратите внимание, что я использую Powershell ISE, а не консоль. При запуске в консоли, при таком написании, у нас будут ошибки:

  • Имя «else» не распознано как имя командлета, функции, файла сценария или выполняемой программы.
  • The term ‘else’ is not recognized as the name of a cmdlet, function, script file, or operable program.

Связано это с тем, что консоль выполняет каждою строку отдельно и оператор else воспринимается как отдельный. Для избежания таких ситуаций есть множество способов решения:

  1. Объявлять операторы в одну строку.
  2. Использовать функции.
  3. Хранить скрипт в файле и импортировать его.

Эти способы и другие будут рассмотрены далее.

Elseif

Представим, что нам нужно проверить существование нескольких значений. Мы можем это сделать так:

Для избежания таких сложно читаемых конструкций используется дополнительное условие elseif.

Elseif не является обязательным и выполняется после IF. В отличие от else, который работает в случае когда все операторы вернули False, оператор elseif может проверять на True и False. Переписав предыдущий пример, но с новым оператором, условие будет выглядеть так:

В отличие от других операторов elseif может использоваться множество раз. Тот оператор, который первый вернет True, отменит выполнение следующих условий.

Примеры работы с Powershell Filter с объектами AD

Операторы сравнения

Когда нам нужно проверить не только существование значения, но и эквивалентность или упоминание, нам нужно использовать операторы сравнения.

-eq проверка эквивалентности

С помощью оператора -eq можно проверить полное соответствие между значениями. Для примера это может быть строка или число:

Если бы значения не совпадали, то результат был бы False и условие было бы не выполненным. Проведем пример со всеми условиями:

Powershell, по умолчанию, не является зависимым от регистра. Это значит, что «Строка» и «строка» будут эквивалентны друг другу. Что бы проверить равенство с учетом регистра нужно использовать -ceq:

Самые первые примеры, которые были показаны выше, являются сокращенным вариантом написания с оператором -eq:

Важно понять работу следующего примера:

Так как проверка на эквивалентность $false правдива, результат работы условия будет True.

-ne или не соответствие

Когда нужно проверить отсутствие конкретного значения используется команда -ne:

Как уже писалось выше, если первое условие возвращает True второе выполняться не будет:

Так же как и в предыдущем случае если оператор учета регистра -cne.

Для примера так мы запустим сервис, если он не равен Running:

-gt -ge -lt -le проверка на большее и меньшее значение

Аналогично предыдущим примерам мы можем включать проверку на большее и меньшее значение, для примера выполним такое условие:

Дословно операторы выше переводятся как Less than (меньше чем) и Gt (больше чем) и именно поэтому выполняется условие else. Другие операторы, включающие букву ‘e’ вместо ‘t’ выполняют так же проверку на равенство, например ge — Greater or equal (больше или равно). Таких операторов достаточно много:

  • gt — больше чем;
  • cgt — больше чем, но с учетом регистра;
  • ge — больше или равно;
  • cge — больше или равно с учетом регистра;
  • lt — меньше чем;
  • clt — меньше чем, но с учетом регистра;
  • le — меньше чем или равно;
  • cle — меньше чем или равно с учетом регистра.

Не совсем ясно зачем делать учет регистра в определении количества, но такая возможность тоже есть.

-like проверка вхождений

В Powershell есть возможность проверки вхождений используя -like и определенный синтаксис:

  • ? — обозначение единственного пропущенного символа;
  • * — обозначение любого количества пропущенных символов.

Выше мы проверяли начинается ли строка с символов AD. Если бы мы искали конец строки нужно было указывать символ * до последнего элемента:

  • like — поиск вхождения, не чувствителен к регистру;
  • clike — поиск вхождения, чувствителен к регистру;
  • notlike — проверка на отсутствие вхождения, не чувствителен к регистру;
  • cnotlike — проверка на отсутствие вхождения, чувствителен к регистру.

-match использование регулярных выражений

Для проверки с использованием регулярных выражений есть свой оператор -match. Конечно, синтаксис в использовании регулярных выражений и -like отличается:

Читайте также:  Как записать кали линукс

Если не указывать маску/шаблон, то match будет искать по полному совпадению:

Так же есть несколько вариантов использования регулярных выражений:

  • match — регулярные выражения не чувствительные к регистру:
  • cmatch — чувствительные к регистру;
  • notmatch — поиск не совпадающих, не чувствительных к регистру значений;
  • cnotmatch — поиск не совпадающих, чувствительных к регистру значений.

-is проверка типов

Часто бывает необходимость проверить тип данных перед дальнейшем использованием. Использование сложения со строкой и числом приводит к разным последствиям. Для избежания этих проблем нужно проверять типы. На примере ниже я проверяю является ли значение числом:

Таких типов данных в Powershell около 13:

  • [string] — строка;
  • [char] — 16-битовая строка Unicode;
  • [byte] — 8 битовый символ;
  • [int] — целое 32 битовое число;
  • [long] — целое 64 битовое число;
  • [bool] — булево значение True/False;
  • [decimal] — 128 битовое число с плавающей точкой;
  • [single] — 32 битовое число с плавающей точкой;
  • [double] — 64 битовое число с плавающей точкой;
  • [DateTime] — тип данных даты и времени;
  • [xml] — объект xml;
  • [array] — массив;
  • [hashtable] — хэш таблица.

Так же можно использовать ключ -isnot, который выполняет противоположные действия.

Условия в массивах

Когда мы работаем с коллекциями, массивами или листами проверка вхождений работает немного иначе чем в предыдущих примерах. Тут важно учитывать не только порядок, но и логику:

Этот пример так же будет работать с логическими операторами:

Обратите внимание, что в случае с -ne, который ищет неравенство, результат будет True если хотя бы одно число и строка не совпадает с указанной:

Когда используются операторы типа ge, lt и другие, результат будет True если хотя бы одно из значений будет больше:

Для поиска вхождений в массивах обычно используются операторы описанные далее.

-contains

При использовании contains у нас возвращаются булевы значения True и False и является более логичным для проверки массивов:

Другие варианты использования:

  • contains — без учета регистра;
  • ccontains — с учетом регистра;
  • notcontains — отсутствие значения без учета регистра;
  • cnotcontains — отсутствие значение с учетом регистра.

Этот оператор создан для удобства людей, которые пишут на других языках. Он отличается от contains порядком проверяемых значений. В этом случае массив должен находиться справа:

  • in — регистр не имеет значения;
  • cin — регистр имеет значение;
  • notin — отсутствие вхождения, регистр не имеет значения;
  • cnotin — отсутствие вхождения, регистр имеет значения.

Логические операторы

Когда нам нужно комбинировать условия удобно использовать логические операторы.

Использование этого оператора переворачивает результат. Если результат значения равен False, то используя not, выражение все равно будет выполнен:

Если вы хотите использовать предыдущие операторы тоже, тогда их нужно помещать между скобок:

У -not есть алиас в виде восклицательного знака ! :

And позволяет связывать несколько значений. Условие будет выполнено только в том случае, если все значения будут True:

Если хотя бы одно из выражений было бы равно False, то все условие относилось бы к False:

Мы так же можем проверять существование нескольких значений:

Отличия -and от -or в том, что нам достаточно получить True только от одного выражения:

Вы можете комбинировать несколько операторов для верного выполнения условия, главное помещать их в кавычки:

Функции по работе со строками в Powershell

Использование выражений при сравнении в Powershell

Мы можем использовать команды Powershell в сравнениях:

Командой Get-NetAdapte мы получаем список адаптеров. Если бы список был пуст, то он бы вернул $null и выражение бы не выполнилось.

Можно использовать серию скриптов, но главное экранировать в скобки:

Проверка на $null

Мы уже писали о сложностях работы с $null в Powershell, но главное придерживаться правила, что это значение должно быть слева:

Переменные

Вы можете назначать переменную через условие, а в самом ScriptBlock работать с ней:

Процесс Notepad будет остановлен в случае, если такой процесс существует.

Мы так же можем назначать результат работы условий с помощью переменной:

Эти способы весомо ухудшают читаемость кода и я бы не советовал их использовать.

Оцените статью