If в cmd: IF – оператор условного выполнения команд в пакетном файле Windows

Содержание

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. Но на практике чаще используется возможность локального включения данного режима внутри командного файла специальной директивой:

    Setlocal EnableDelayedExpansion

    После чего, можно обрабатывать принимаемые переменными значения внутри цикла, используя вместо знаков процента восклицательные знаки:

    FOR … (
    IF !ERRORLEVEL!==0 вместо %ERRORLEVEL%==0

    )

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

    Весь список команд CMD Windows

  • if | Microsoft Docs

    • Чтение занимает 3 мин

    В этой статье

    Выполняет условную обработку в пакетных программах.Performs conditional processing in batch programs.

    СинтаксисSyntax

    if [not] ERRORLEVEL <number> <command> [else <expression>]
    if [not] <string1>==<string2> <command> [else <expression>]
    if [not] exist <filename> <command> [else <expression>]
    

    Если расширения команд включены, используйте следующий синтаксис:If command extensions are enabled, use the following syntax:

    if [/i] <string1> <compareop> <string2> <command> [else <expression>]
    if cmdextversion <number> <command> [else <expression>]
    if defined <variable> <command> [else <expression>]
    

    ПараметрыParameters

    ПараметрParameterОписаниеDescription
    notnotУказывает, что команда должна выполняться, только если условие имеет значение false. Specifies that the command should be carried out only if the condition is false.
    ERRORLEVEL <number>errorlevel <number>Задает истинное условие, только если предыдущая программа, выполненная Cmd.exe, вернула код выхода, который больше или равен Number.Specifies a true condition only if the previous program run by Cmd.exe returned an exit code equal to or greater than number.
    <command>Указывает команду, которая должна быть выполнена при выполнении предыдущего условия.Specifies the command that should be carried out if the preceding condition is met.
    <string1>==<string2>Задает истинное условие, только если строка1 и строка2 совпадают.Specifies a true condition only if string1 and string2 are the same. Эти значения могут быть строками литерала или пакетными переменными (например, %1 ). These values can be literal strings or batch variables (for example, %1). Литеральные строки не нужно заключать в кавычки.You do not need to enclose literal strings in quotation marks.
    существующие <filename>exist <filename>Указывает истинное условие, если указанное имя файла существует.Specifies a true condition if the specified file name exists.
    <compareop>Задает оператор сравнения из трех букв, включая:Specifies a three-letter comparison operator, including:
    • Равно — равноEQU — Equal to
    • Нек — не равноNEQ — Not equal to
    • ЛСС — меньшеLSS — Less than
    • LEQ -меньше или равноLEQ — Less than or equal to
    • ГТР — большеGTR — Greater than
    • Жек — больше или равноGEQ — Greater than or equal to
    /i/iПринудительное сравнение строк не учитывает регистр. Forces string comparisons to ignore case. Параметр /i можно использовать в string1==string2 формате If.You can use /i on the string1==string2 form of if. Эти сравнения являются универсальными, в том случае, если и строка1 , и строка2 состоят из цифр, строки преобразуются в числа и выполняется числовое сравнение.These comparisons are generic, in that if both string1 and string2 are comprised of numeric digits only, the strings are converted to numbers and a numeric comparison is performed.
    кмдекстверсион <number>cmdextversion <number>Задает истинное условие, только если внутренний номер версии, связанный с компонентом расширения команд Cmd.exe, равен или больше указанного числа.Specifies a true condition only if the internal version number associated with the command extensions feature of Cmd.exe is equal to or greater than the number specified. Первая версия — 1.The first version is 1. Он увеличивается на единицу при добавлении значительных улучшений в расширения команд.It increases by increments of one when significant enhancements are added to the command extensions. Кмдекстверсион Conditional не имеет значения true, если расширения команд отключены (по умолчанию расширения команд включены).The cmdextversion conditional is never true when command extensions are disabled (by default, command extensions are enabled).
    defined <variable>defined <variable>Указывает истинное условие, если переменная определена.Specifies a true condition if variable is defined.
    <expression>Задает команду командной строки и все параметры, которые будут переданы команде в предложении else .Specifies a command-line command and any parameters to be passed to the command in an else clause.
    /?/?Отображение справки в командной строке.Displays help at the command prompt.
    КомментарииRemarks
    • Если условие, указанное в предложении If , имеет значение true, выполняется команда, следующая за условием. Если условие имеет значение false, команда в предложении If игнорируется и команда выполняет любую команду, указанную в предложении else .If the condition specified in an if clause is true, the command that follows the condition is carried out. If the condition is false, the command in the if clause is ignored and the command executes any command that is specified in the else clause.

    • Когда программа останавливается, она возвращает код выхода.When a program stops, it returns an exit code. Чтобы использовать коды выхода в качестве условий, используйте параметр ERRORLEVEL .To use exit codes as conditions, use the errorlevel parameter.

    • При использовании определенного значения в среду добавляются следующие три переменные: % ERRORLEVEL%, % кмдкмдлине% и % кмдекстверсион%.If you use defined, the following three variables are added to the environment: %errorlevel%, %cmdcmdline%, and %cmdextversion%.

      • % ERRORLEVEL%: разворачивается в строковое представление текущего значения переменной среды ERRORLEVEL.%errorlevel%: Expands into a string representation of the current value of the ERRORLEVEL environment variable. Эта переменная предполагает, что отсутствует существующая переменная среды с именем ERRORLEVEL.This variable assumes that there isn’t already an existing environment variable with the name ERRORLEVEL. Если это так, вместо него будет получено значение ERRORLEVEL.If there is, you’ll get that ERRORLEVEL value instead.

      • % кмдкмдлине%: разворачивается в исходную командную строку, которая была передана Cmd. exe до любой обработки Cmd.exe.%cmdcmdline%: Expands into the original command line that was passed to Cmd.exe prior to any processing by Cmd.exe. Предполагается, что отсутствует существующая переменная среды с именем КМДКМДЛИНЕ.This assumes that there isn’t already an existing environment variable with the name CMDCMDLINE. Если это так, вы получите вместо этого значение КМДКМДЛИНЕ.If there is, you’ll get that CMDCMDLINE value instead.

      • % кмдекстверсион%: разворачивается в строковое представление текущего значения кмдекстверсион.%cmdextversion%: Expands into the string representation of the current value of cmdextversion. Предполагается, что отсутствует существующая переменная среды с именем КМДЕКСТВЕРСИОН.This assumes that there isn’t already an existing environment variable with the name CMDEXTVERSION. Если это так, вы получите вместо этого значение КМДЕКСТВЕРСИОН.If there is, you’ll get that CMDEXTVERSION value instead.

    • Предложение else необходимо использовать в той же строке, что и команда после оператора If.You must use the else clause on the same line as the command after the if.

    ПримерыExamples

    Чтобы отобразить сообщение не удается найти файл данных если не удается найти файл Product. dat, введите:To display the message Cannot find data file if the file Product.dat cannot be found, type:

    if not exist product.dat echo Cannot find data file
    

    Чтобы отформатировать диск в диске а и вывести сообщение об ошибке при возникновении ошибки в процессе форматирования, введите в пакетный файл следующие строки:To format a disk in drive A and display an error message if an error occurs during the formatting process, type the following lines in a batch file:

    :begin
    @echo off
    format a: /s
    if not errorlevel 1 goto end
    echo An error occurred during formatting. 
    :end
    echo End of batch program.
    

    Чтобы удалить файл Product. dat из текущего каталога или отобразить сообщение, если Product. dat не найден, введите в пакетном файле следующие строки:To delete the file Product.dat from the current directory or display a message if Product.dat is not found, type the following lines in a batch file:

    IF EXIST Product.dat (
    del Product.dat
    ) ELSE (
    echo The Product.dat file is missing.
    )
    

    Примечание

    Эти строки можно объединить в одну строку следующим образом:These lines can be combined into a single line as follows:

    IF EXIST Product.dat (del Product.dat) ELSE (echo The Product.dat file is missing.)
    

    Чтобы вывести значение переменной среды ERRORLEVEL после выполнения пакетного файла, введите в пакетный файл следующие строки:To echo the value of the ERRORLEVEL environment variable after running a batch file, type the following lines in the batch file:

    goto answer%errorlevel%
    :answer1
    echo The program returned error level 1
    goto end
    :answer0
    echo The program returned error level 0
    goto end
    :end
    echo Done!
    

    Чтобы вернуться к метке «хорошо», если значение переменной среды ERRORLEVEL меньше или равно 1, введите:To go to the okay label if the value of the ERRORLEVEL environment variable is less than or equal to 1, type:

    if %errorlevel% LEQ 1 goto okay
    

    Дополнительные ссылкиAdditional References

    Условный оператор IF — как грамотно оформить код | SafeZone

    Koza Nozdri, видел твои коды.
    Очень красивы, но Имхо, бессмысленны с точки зрения отладки ошибок и понимания логики переходов по условиям.

    Очень рекомендую множество вложенных условий формировать по уровням,
    как это делается на ЯВУ (языках высокого уровня).

    Иначе, большая вероятность, потерять скобку.

    if "%test%"=="result" (
        тут блок команд
        if "%A%"=="%B%" (
            тут скрипт vbs
        ) else (
            echo error...
        )
    ) else (
        echo test не равнялся result
    )

    Т.е. простейший IF для строк (с игнорированием регистра букв — ключ /i ) будет:
    if /i "%A%"=="%B%" (
        echo Удача
    ) else (
        echo Неудача
    )
    Для оператора возврата кода ошибки:
    :: генерируем произвольный код ошибки
    cmd /c Exit /B 1
    
    if errorlevel 1 (
        echo Была ошибка
    ) else
        echo Не было ошибок
    )

    Оператор errorlevel 1 — означает что мы сравниваем %errorlevel% с 1. Если код ошибки >= 1, то условие выполняется (true).Для логического сравнения чисел кавычки убираем:

    @echo off
    set X=1
    set Y=2
    if %Y% GTR %X% (
        echo Y больше X
    ) else (
        echo Y меньше, либо равен X
    )

    Справка if /?

    EQL — равно (или просто знак == )
    NEQ — не равно
    LSS — меньше
    LEQ — меньше или равно
    GTR — больше
    GEQ — больше или равно,Не забывай, что:
    = это знак присвоения. Работает только с Set.
    == это знак сравнения. Работает в операторе IF.Посмотри в коде Рекурсивный Dir /X (под спойлером) на сколько хорошо прослеживается логика вложенных условий.

     

    Статья — Переменные в CMD, команда SET и арифметика | SafeZone

    Переменные. Команда SET


    Задание переменных

    Вручную

    Ввод с клавиатуры
    set /p x="BBeduTe cTpoky: "

    Типы переменных

    Тип строка

    Ограничение 8184 символа. 17)-1)

    set /a random10=%random%/3277
    Выводит случайное число от 0 до 9.
    У меня это число по нелепой псевдослучайности цифру секунды
    %CD% — раскрывается в строку текущей директории.
    %DATE% — раскрывается в текущую дату, используя тот же формат команды DATE.
    %TIME% — раскрывается в текущую дату, используя формат команды TIME.
    %ERRORLEVEL% — раскрывается в текущее значение ERRORLEVEL.
    Уровень ошибки, 0 — это нет ошибки, 1 — это есть ошибка, а другие это номера ошибки.

    Чтобы получить полный список переменных и их значений введите команду SET

    Операции со строковыми или численными переменными

    Соединение 2-ух строковых переменных

    set x=Gaz
    set y=Prom
    echo %x%%y%
    (GazProm)

    Вывод определенного(ых) символа(ов) из строки
    Символы номеруются начиная с 0!
    Вывод 1-ого символа

    Вывод 3-х символов с конца строки

    Вывод всей строки кроме 2-ух первых символов

    Вывод всей строки кроме 2-ух последних символов

    Вывод 3-х символов начиная с 3

    Удаление подстроки из строки
    set str=babywka
    echo %str:ba=%
    (bywka)

    Замена подстроки из строки на другую подстроку
    set str=babywka
    echo %str:bab=xlop%
    (xlopywka)

    Удаление кавычек(«) из строки
    set str2="qwerty"
    echo %str2:"=%
    (qwert)
    В данном случае: если кавычки в начале и конце строки — можно юзать
    echo %str2:~1,-1%
    (qwert)

    Существуют 2 способа использовать переменную в переменной, например: вывод n-ого символа

    Первый способ с call set

    call set x=%%str:~%n%,1%%
    echo %x%

    Второй способ с for и setlocal enabledelayedexpansion
    setlocal enabledelayedexpansion
    for /l %%i in (%n%,1,%n%) do (set x=!str:~%%i,1!)
    echo %x%
    тут неважно что в for писать, главное писать в do
    С циклами мы разберемся в следующей статье.
    Но, пока уточню: если код второго способа юзать в пакетном файле (BATнике), то вместо %i юзаем %%i.

    Операции с числовыми переменными

    Увеличивание на единицу


    Увеличивание в 2 раза
    аналогично

    Возведение в квадрат

    Возведение в куб

    Деление
    Деление в CMD является целочисленным!(то есть делится до целого числа)
    set /a x=15
    set /a y=4
    set /a xy=%x%/%y%
    (3)

    Сложение
    set /a x=5
    set /a y=-6
    set /a xy=%x%+%y%
    (5+(-6)=5-6=-1)

    Вычитание
    set /a x=5
    set /a y=-6
    set /a xy=%x%-%y%
    (5-(-6)=5+6=11)

    Вычисление остатка

    Унарные операторы

    Логическое отрицание (Logical NOT)

    дает результат(%y%) 1 (True), если переменная(%x%) равна 0 (False), и 0 (False) (%y%) в любых других случаях
    Например
    set /a x=5
    set /a y="!"%x%
    (0)
    set /a x=0
    set /a y="!"%x%
    (1)

    Побитовая инверсия (Bitwise NOT):
    дает результат -1-%x% (%y%)
    Например
    set /a x=5
    set /a y="~"%x%
    (-1-5=-(1+5)= -6)
    set /a x=-3
    set /a y="~"%x%
    (-1-(-3)=-1+3=3-1= 2)

    Унарный минус (устанавливает/сбрасывает знаковый бит)
    дает результат 0-%x% (%y%)
    Например
    set /a x=5
    set /a y="-"%x%
    (-5)
    set /a x=-3
    set /a y="-"%x%
    (3)

    Двоичные операторы
    set x=3
    (в двоичной системе счисления - 0011)
    set y=5
    (в двоичной системе счисления - 0101)

    Побитовое И (AND)

    Побитовое И — это бинарная операция, действие которой эквивалентно применению логического И к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов.
    Другими словами, если оба соответствующих бита операндов равны 1, результирующий двоичный разряд равен 1; если же хотя бы один бит из пары равен 0, результирующий двоичный разряд равен 0.

    set /a xy=%x%"&"%y%
    (1, в двоичной системе счисления - 0001)

    Побитовое ИЛИ (OR)

    Побитовое ИЛИ — это бинарная операция, действие которой эквивалентно применению логического ИЛИ к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов.
    Другими словами, если оба соответствующих бита операндов равны 0, двоичный разряд результата равен 0; если же хотя бы один бит из пары равен 1, двоичный разряд результата равен 1.

    set /a xy=%x%"|"%y%
    (7, в двоичной системе счисления - 0111)

    Побитовое исключающее ИЛИ (XOR)

    Побитовое исключающее ИЛИ (или побитовое сложение по модулю два) — это бинарная операция, действие которой эквивалентно применению логического исключающего ИЛИ к каждой паре битов, которые стоят на

    одинаковых позициях в двоичных представлениях операндов. «%y% (6, в двоичной системе счисления — 0110)
    К битовым операциям также относят битовые сдвиги. При сдвиге значения битов копируются в соседние по направлению сдвига.
    Различают сдвиг влево (в направлении от младшего бита к старшему) и вправо (в направлении от старшего бита к младшему).
    При логическом сдвиге значение последнего бита по направлению сдвига теряется (копируясь в бит переноса), а первый приобретает нулевое значение.

    Двоичный арифметический сдвиг

    Арифметический сдвиг аналогичен логическому, но значение слова считается знаковым числом, представленным в дополнительном коде.
    Так, при правом сдвиге старший бит сохраняет свое значение. Левый арифметический сдвиг идентичен логическому.

    Вправо

    set /a xy=%x%">>"1
    (1, в двоичной системе счисления - 0011->0001)
    set /a xy2=%y%">>"1
    (2, в двоичной системе счисления - 0101->0010)
    set /a n=13
    (в двоичной системе счисления - 1101)
    set /a xn=%n%">>"2
    (3, в двоичной системе счисления - 1101->0011)
    set /a my=-%y%">>"1
    (-3, в двоичной системе счисления - 1011(-5)->1101(-3))

    Влево
    set /a xy=%x%"<<"1
    (6, в двоичной системе счисления - 0011->0110)
    set /a xy2=%y%"<<"1
    (10, в двоичной системе счисления - 0101->1010)
    set /a xy3=%y%"<<"4
    (80, в двоичной системе счисления - 0101->1010000)
    set /a my=-%y%"<<"1
    (-10, в двоичной системе счисления - 1011(-5)->10110(-10))

    Максимальный размер отдельной переменной среды составляет 8192 байта. (у меня выходило только 8184, наверное это вместе с названием…)
    Максимальный общий размер всех переменных среды, включая имена переменных и знак равенства, составляет 65 536 Кбайт.

    И я забыл, про 8-ричную и 16-ричную систему счисления в CMD

    Системы счисления

    Числовые значения рассматриваются как десятичные, если перед ними не стоит префикс 0x для шестнадцатеричных чисел, и 0 для восьмеричных чисел. Например, числа 0x12, и 022 обозначают десятичное число 18.

    Обратите внимание на запись восьмеричных числе: 08 и 09 не являются допустимыми числами, так как в восьмеричной системе исчисления цифры 8 и 9 не используются.

    Восьмеричная система счисления

    set /a x=022
    (Это 22 в восьмеричной системе счисления, и 18 в десятичной)
    Можно производить все операции, также как и с десятеричными числами.
    Но после задания значения переменной, значение хранится в десятичной системе счисления.
    Например, сложение
    set /a xy=022+07
    (Это 22+7=31 в восьмеричной системе счисления, и 31 в десятичной)

    Шестнадцатеричная система счисления
    set /a x=0x3A
    (Это 3A в восьмеричной системе счисления, и 58 в десятичной)
    Вычитание
    set /a xy=0x3A-0x66
    (Это 3A-66=-54 в восьмеричной системе счисления, и -44 в десятичной)

    Сохранение в переменной вывода программы
    К сожаление, передача вывода программ на вход команды set не работает:
    echo 1|set /p AA=""
    set AA
    Поэтому можно воспользоваться временным сохранением в файл:
    echo 1> 0. <rar.log.tmp') do @echo %%J >rarfilename.tmp
    set /p rarfilename="" <rarfilename.tmp
    del rarfilename.tmp

    Узнать имя последнего изменённого файла в папке:
    dir /b /a-d /o-d *.* >%temp%\0.tmp
    set /p lastfile="" <%temp%\0.tmp
    del %temp%\0.tmp
    echo "%lastfile%"

    Комментарий от Dragokas :
    По сути эта команда считывает в переменную первую строку файла:

    Комментарий от m00slim25:
    Эти операции, как и все остальные, поддерживают кавычный синтаксис:
    set /a "y=!%x%"
    set /a "y=~%x%"
    set /a "y=-%x%"

    Оператор == используется только для строчного сравнения. Кавычки необходимы если в переменной/операнде имеются пробелы.
    Для арифметического сравнения необходимо использовать арифметические операторы:
    EQU : Равно (=)
    NEQ : Не равно (!=)
    LSS : Меньше (
    LEQ : Меньше или равно (
    GTR : Больше (>)
    GEQ : Больше или равно (>=)
    Использовать операторы, указанные в скобках, не представляется возможным, потому что, например, операторы < и > являются указателями перенаправления ввода-вывода. }$/ { print NR; exit }’ Filename.c >…

  • -bash: cmd: команда не найдена

    У меня есть это в /etc/init.d/unicorn #!/bin/bash # /etc/init.d/unicorn # ### BEGIN INIT INFO # chkconfig: 2345 95 016 # processname: unicorn # dscription: Stop/start unicorn ### END INIT INFO export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin cmd() { cd /vagrant unicorn -p…



  • 1

    Вот и вся альтернатива:

    if not exist "c:\windows\system32\format.dll" (
            start "" startuperror.vbs
        ) else (
            echo The dll exists.
    )
    pause
    

    Поделиться foxidrive     24 марта 2014 в 01:50



    1

    пробовать

    if exist c:\system32\format.dll goto start
    start startuperror.vbs
    goto :end
    
    :start
    rem Whatever you want to do here if the dll exists. 
    
    :end
    echo Quitting. Press a key
    pause
    

    Но в следующий раз. Сначала начните cmd . В командной строке вы можете перейти в нужный каталог и запустить свой скрипт. Это позволит вам увидеть фактический результат. Кроме того, большинство команд имеют некоторую встроенную документацию, если вы добавляете /? . Например, if /? .

    Поделиться GolezTrol     23 марта 2014 в 19:03


    Похожие вопросы:


    R CMD проверьте NOTEs на ggplot, подмножестве и т. д

    При использовании ggplot или subset команда R CMD check в моем пакете генерирует следующие Примечания: * checking R code for possible problems … NOTE foo: no visible binding for global variable…


    Команда Git не работает в Windows CMD

    Я пытаюсь выполнить нижеприведенную команду в Windows CMD для машины Bitnami Gitlab VM в Windows 10. git clone [email protected]:user/project.git Он работает в Git Bash, но та же команда не работает…


    Многословный пользователь Input по сравнению с переменной в пакете

    У меня возникли некоторые проблемы с сравнением многословной строки input пользователем со строковой переменной в пакете. Вот что у меня есть: set twowordstring=Pi Rocks echo What do you think about…


    команда gawk в CMD с оператором && не работает

    Я отдаю команду gawk от Windows CMD, но она просто застряла там. Та же команда прекрасно работает в Cygwin Terminal. Я пытаюсь найти первое вхождение конечной скобки } в первом столбце файла после…


    -bash: cmd: команда не найдена

    У меня есть это в /etc/init.d/unicorn #!/bin/bash # /etc/init.d/unicorn # ### BEGIN INIT INFO # chkconfig: 2345 95 016 # processname: unicorn # dscription: Stop/start unicorn ### END INIT INFO…


    CMD команда-имя пользователя

    Я новичок в командах CMD, и я действительно ценю любую помощь в этом отношении. Я делаю команду CMD, чтобы удалить один определенный файл на диске C со следующим путем:…


    vbsscript run cmd команда с параметрами

    У меня есть папка, в которой записаны файлы .pcl и .ps. Я хочу, чтобы эти файлы были напечатаны, и единственная возможность сделать это, если она будет найдена, — это команда cmd LPR сценарий таков:…


    CMD команда для «Git Bash здесь»

    В Windows я могу запустить Git Bash Here в текущем каталоге, открыв меню правой кнопки мыши. Я хочу поместить gitbashhere.bat в путь по умолчанию, чтобы команды имели легкий доступ из стандартного…


    Генератор паролей в пакете cmd

    Я пытаюсь создать простой генератор паролей с помощью пакета. Я знаю, что было бы намного проще, если бы я попробовал использовать реальный язык, но мне нужно, чтобы он был в пакете cmd. Мне нужно,…


    Открытие окна cmd, в котором выполняется команда

    Я хочу открыть окно cmd, в котором уже выполняется команда, например что-то вроде cmd echo Hello, world! или что-то в этом роде.

    Cmd if else примеры

    Формат командной строки:

    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

    )

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

    Обработка условий в пакетных программах

    Синтаксис

    Если расширения командного процессора разрешены, следует использовать следующий синтаксис:

    Параметры

    not Задает выполнение команды только в случае невыполнения условия. errorlevelчисло Условие выполняется, если предыдущая команда, обработанная интерпретатором команд Cmd.exe, завершилась с кодом, равным или большим числа. команда Команда, которая должна быть обработана в случае выполнения условия. строка1==строка2 Условие выполняется, если строки строка1 и строка2 совпадают. Строки могут быть заданы явно или могут быть пакетными переменными (например, %1). Явно заданные строки нет необходимости заключать в кавычки. existимя_файла Условие выполняется, если существует файл с именем имя_файла. оп_сравнения Трехзначный оператор сравнения. В следующей таблице перечислены допустимые значения оп_сравнения.

    ОператорОписание
    EQUравно
    NEQне равно
    LSSменьше
    LEQменьше или равно
    GTRбольше
    GEQбольше или равно

    /i Сравнение строк без учета регистра знаков. Параметр /i можно использовать в конструкции string1==string2 команды if. Эти сравнения являются общими. Если и строка1, и строка2 состоят из цифр, строки преобразовываются в числа и выполняется сравнение чисел. cmdextversion число Условие выполняется, только если номер внутренней версии, связанный с расширениями командного процессора Cmd.exe, равен или больше числа. первая версия имела номер 1. Номер версии увеличивается на 1 при внесении в расширения командного процессора значительных изменений. Условие с cmdextversion не выполняется, если расширения командного процессора запрещены (по умолчанию они разрешены). defined переменная Условие выполняется, если переменная определена. выражение Команда и все ее параметры для обработке в командной строке при выполнении оператора else. /? Отображение справки в командной строке.

    Заметки

    • Если условие, заданное в команде if, выполняется, будет выполнена команда, следующая за условием. Если условие не выполняется, команда, заданная в операторе if, пропускается, а управление переходит к команде оператора else, если она задана.
    • Когда программа завершается, она возвращает код завершения. С помощью параметра errorlevel коды завершения можно использовать в качестве условий.
    • Использование команды definedпеременная

    При использовании команды defined переменная добавляются следующие три переменные: %errorlevel%, %cmdcmdline% и %cmdextversion%.

    %errorlevel% замещается строковым представлением текущего значения errorlevel, если только уже не существует переменная среды с именем ERRORLEVEL. В этом случае будет использовано ее значение. В следующем примере показано использование значения errorlevel после выполнения пакетной программы:

    Операторы сравнения оп_сравнения также можно использовать следующим образом:

    %cmdcmdline% замещается исходной командной строкой, переданной Cmd. exe, до ее обработки в Cmd.exe, если только уже не существует переменная среды с именем cmdcmdline. В этом случае будет использовано значение cmdcmdline.

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

    Использование оператора else

    Оператор else должен размещаться в той же строке, что и команда if. Пример:

    Приведенный ниже пример не будет работать, поскольку команда del должна заканчиваться новой строкой:

    Приведенный ниже пример не будет работать, поскольку команда else должна находиться в той же строке, что и команда if:

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

    Примеры

    Если файл Product.dat не удается найти, появится следующее сообщение:

    Если в приведенном ниже примере при форматировании диска в дисководе A возникнет ошибка, будет выведено сообщение об ошибке:

    Если ошибка не возникнет, сообщение об ошибке выведено не будет.

    Команда if не может быть использована непосредственно для проверки существования каталога, но в каждом каталоге существует устройство (NUL). Следовательно, существование каталога может быть проверено, как показано ниже. В следующем примере проверяется наличие каталога:

    Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).

    Conditionally perform a command.

    IF will only parse numbers when one of (EQU, NEQ, LSS, LEQ, GTR, GEQ) is used.
    The == comparison operator always results in a string comparison.

    ERRORLEVEL

    There are two different methods of checking an errorlevel, the first syntax ( IF ERRORLEVEL . ) provides compatibility with ancient batch files from the days of Windows 95.
    The second method is to use the %ERRORLEVEL% variable providing compatibility with Windows 2000 or newer.

    IF ERRORLEVEL n statements should be read as IF Errorlevel >= number
    i. e.
    IF ERRORLEVEL 0 will return TRUE whether the errorlevel is 0, 1 or 5 or 64
    IF ERRORLEVEL 1 will return TRUE whether the errorlevel is 1 or 5 or 64
    IF NOT ERRORLEVEL 1 means if ERRORLEVEL is less than 1 (Zero or negative).
    This is not very readable or user friendly and does not easily account for negative error numbers.

    Using the %ERRORLEVEL% variable is a more logical method of checking Errorlevels:

    IF %ERRORLEVEL% NEQ 0 Echo An error was found
    IF %ERRORLEVEL% EQU 0 Echo No error found

    IF %ERRORLEVEL% EQU 0 (Echo No error found) ELSE (Echo An error was found)
    IF %ERRORLEVEL% EQU 0 Echo No error found || Echo An error was found

    This allows you to trap errors that can be negative numbers, you can also test for specific errors:
    IF %ERRORLEVEL% EQU 64 .

    To deliberately raise an ERRORLEVEL in a batch script use the EXIT /B command.

    It is possible (though not a good idea) to create a string variable called %ERRORLEVEL% (user variable)
    if present such a variable will prevent the real ERRORLEVEL (a system variable) from being used by commands such as ECHO and IF.

    Test if a variable is empty

    To test for the existence of a command line parameter – use empty brackets like this

    IF [%1]==[] ECHO Value Missing
    or
    IF [%1] EQU [] ECHO Value Missing

    When comparing against a variable that may be empty, we include a pair of brackets [ ] so that if the variable does happen to be empty the IF command still has something to compare: IF [] EQU [] will return True.

    You can in fact use almost any character for this a ‘

    ‘ or curly brackets, < >or even the number 4, but square brackets tend to be chosen because they don’t have any special meaning.
    When working with filenames/paths you should always surround them with quotes, if %_myvar% contains «C:Some Path» then your comparison becomes IF [«C:Some Path»] EQU []
    if %_myvar% could contain empty quotes, «» then your comparison should become IF [%_myvar%] EQU [«»]

    if %_myvar% will never contain quotes, then you can use quotes in place of the brackets IF «%_myvar%» EQU «»
    However with this pattern if %_myvar% does unexpectedly contain quotes, you will get IF «»C:Some Path»» EQU «» those doubled quotes, while not officially documented as an escape will still mess up the comparison.

    Test if a variable is NULL

    In the case of a variable that might be NULL – a null variable will remove the variable definition altogether, so testing for a NULL becomes:

    IF NOT DEFINED _example ECHO Value Missing

    IF DEFINED will return true if the variable contains any value (even if the value is just a space)

    To test for the existence of a user variable use SET VariableName , or IF DEFINED VariableName

    Test the existence of files and folders

    IF EXIST filename Will detect the existence of a file or a folder.

    The script empty.cmd will show if the folder is empty or not (this is not case sensitive).

    Parenthesis

    Parenthesis can be used to split commands across multiple lines. This enables writing more complex IF… ELSE… commands:

    When combining an ELSE statement with parentheses, always put the opening parenthesis on the same line as ELSE.
    ) ELSE ( This is because CMD does a rather primitive one-line-at-a-time parsing of the command.

    When using parentheses the CMD shell will expand [read] all the variables at the beginning of the code block and use those values even if the variables value has just been changed. Turning on DelayedExpansion will force the shell to read variables at the start of every line.

    Pipes

    When piping commands, the expression is evaluated from left to right, so

    IF SomeCondition Command1 | Command2 is equivalent to:

    (IF SomeCondition Command1 ) | Command2
    The pipe is always created and Command2 is always run, regardless whether SomeCondition is TRUE or FALSE

    You can use brackets and conditionals around the command with this syntax:

    IF SomeCondition (Command1 | Command2)
    If the condition is met then Command1 will run, and its output will be piped to Command2.

    The IF command will interpret brackets around a condition as just another character to compare (like # or @) for example:
    IF (%_var1%==(demo Echo the variable _var1 contains the text demo

    Placing an IF command on the right hand side of a pipe is also possible but the CMD shell is buggy in this area and can swallow one of the delimiter characters causing unexpected results.
    A simple example that does work:

    Echo Y | IF red==blue del *.log

    Chaining IF commands (AND).

    The only logical operator directly supported by IF is NOT , so to perform an AND requires chaining multiple IF statements:

    If either condition is true (OR)

    This can be tested using a temporary variable:

    Set «_tempvar=»
    If SomeCondition Set _tempvar=1
    If SomeOtherCondition Set _tempvar=1
    if %_tempvar% EQU 1 Command_to_run_if_either_is_true

    Delimiters

    If the string being compared by an IF command includes delimiters such as [Space] or [Comma], then either the delimiters must be escaped with a caret ^ or the whole string must be «quoted».
    This is so that the IF statement will treat the string as a single item and not as several separate strings.

    Test Numeric values

    IF only parses numbers when one of the compare-op operators ( EQU, NEQ, LSS, LEQ, GTR, GEQ ) is used.
    The == comparison operator always results in a string comparison.

    This is an important difference because if you compare numbers as strings it can lead to unexpected results: «2» will be greater than «19» and «026» will be less than «10».

    Correct numeric comparison:
    IF 2 GEQ 15 echo «bigger»

    Using parentheses or quotes will force a string comparison:
    IF (2) GEQ (15) echo «bigger»
    IF «2» GEQ «15» echo «bigger»

    This behaviour is exactly opposite to the SET /a command where quotes are required.

    Wildcards

    Wildcards are not supported by IF, so %COMPUTERNAME%==SS6* will not match SS64

    A workaround is to retrieve the substring and compare just those characters:
    SET _prefix=%COMPUTERNAME:

    0,3%
    IF %_prefix%==SS6 GOTO they_matched

    If Command Extensions are disabled IF will only support direct comparisons: IF ==, IF EXIST, IF ERRORLEVEL
    also the system variable CMDEXTVERSION will be disabled.

    IF does not, by itself, set or clear the Errorlevel.

    IF is an internal command.

    You see things; and you say ‘Why?’ But I dream things that never were; and I say ‘why not?’

    George Bernard Shaw

    Using parentheses to group and expand expressions.
    Conditional execution syntax (AND / OR)
    SET – Display or Edit environment variables.
    ECHO – Display message on screen.
    EXIT – Set a specific ERRORLEVEL.
    IFMEMBER – group member (Resource kit).
    SC – Is a Service running (Resource kit).
    Powershell: if – Conditionally perform a command.
    Equivalent bash command (Linux): if – Conditionally perform a command.

    Условия в bat файле

    Бывает, что при написании командного файла (пакетного файла, bat файла, cmd файла) требуется записать в условном операторе IF более сложное условие, составленное с помощью операторов И и ИЛИ.

    Как известно, bat файлы не имеют таких логических операторов, поэтому в них нельзя написать конструкции типа:

    Эта статья рассказывает, как в bat файле реализовать логику операторов И / ИЛИ другими доступными способами.

    Надо сказать, что всё-таки командные файлы Windows предназначены для пакетного выполнения консольных команд, и задачи по расчету или обработке данных лучше писать в скриптах (PowerShell, WSH / JScript / VBScript), вызывая их из bat файла.

    Ссылки для скачивания файлов находятся в конце статьи.

    Оператор IF с логическим И (AND) в bat файле

    Самый простой вариант – вложенное выполнение двух операторов IF:

    То есть вместо and мы просто пишем if. Можно использовать не только проверку значения переменной, но и проверку наличия файла. Условий может быть больше двух.

    Оператор IF с логическим ИЛИ (OR) в bat файле

    С оператором OR так просто не получится, причем есть разные способы.

    Способ 1 – через последовательные ИЛИ

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

    В примере ниже значение переменной a сравнивается с тремя значениями, и для любого из value1, value2, value3 условие будет выполнено. А если задать a какое-то другое значение, например, set a=value4, то условие выполнено не будет, что нам и нужно:

    Способ 2 — через И и НЕ

    Этот способ основан на том факте, что логическую операцию ИЛИ можно представить через операции И и НЕ, например, a OR b эквивалентно NOT ( NOT A AND NOT B ). Оператор NOT уже есть в bat файлах, а оператор AND можно представить через последовательные IF, как мы видели выше.

    Поэтому тот же результат можно получить по-другому:

    Этот способ занимает немного меньше строк, чем предыдущий.

    Файлы для скачивания

    Все файлы, описанные в статье, можно скачать с Яндекс.Диска.

    Обработка условий в пакетных программах.

    Синтаксис

    Если расширения командного процессора разрешены, следует использовать следующий синтаксис:

    Параметры

    not Задает выполнение команды только в случае невыполнения условия. errorlevel число Условие выполняется, если предыдущая команда, обработанная интерпретатором команд Cmd. exe, завершилась с кодом, равным или большим числа. команда Команда, которая должна быть обработана в случае выполнения условия. строка1==строка2 Условие выполняется, если строки строка1 и строка2 совпадают. Строки могут быть заданы явно или могут быть пакетными переменными (например, %1). Явно заданные строки нет необходимости заключать в кавычки. exist имя_файла Условие выполняется, если существует файл с именем имя_файла. оп_сравнения Трехзначный оператор сравнения. В следующей таблице перечислены допустимые значения оп_сравнения.

    ОператорОписание
    EQUравно
    NEQне равно
    LSSменьше
    LEQменьше или равно
    GTRбольше
    GEQбольше или равно

    /i Сравнение строк без учета регистра знаков. Параметр /i можно использовать в конструкции string1==string2 команды if. Эти сравнения являются общими. Если и строка1, и строка2 состоят из цифр, строки преобразовываются в числа и выполняется сравнение чисел. cmdextversion число Условие выполняется, только если номер внутренней версии, связанный с расширениями командного процессора Cmd.exe, равен или больше числа. первая версия имела номер 1. Номер версии увеличивается на 1 при внесении в расширения командного процессора значительных изменений. Условие с cmdextversion не выполняется, если расширения командного процессора запрещены (по умолчанию они разрешены). defined переменная Условие выполняется, если переменная определена. выражение Команда и все ее параметры для обработке в командной строке при выполнении оператора else. /? Отображение справки в командной строке.

    Заметки

    • Если условие, заданное в команде if, выполняется, будет выполнена команда, следующая за условием. Если условие не выполняется, команда, заданная в операторе if, пропускается, а управление переходит к команде оператора else, если она задана.
    • Когда программа завершается, она возвращает код завершения. С помощью параметра errorlevel коды завершения можно использовать в качестве условий.
    • Использование команды definedпеременная

    При использовании команды defined переменная добавляются следующие три переменные: %errorlevel%, %cmdcmdline% и %cmdextversion%.

    %errorlevel% замещается строковым представлением текущего значения errorlevel, если только уже не существует переменная среды с именем ERRORLEVEL. В этом случае будет использовано ее значение. В следующем примере показано использование значения errorlevel после выполнения пакетной программы:

    goto answer%errorlevel%
    :answer0
    echo Код возврата программы равен 0
    :answer1
    echo Код возврата программы равен 1
    goto end
    :end
    echo Готово!

    Операторы сравнения оп_сравнения также можно использовать следующим образом:

    %cmdcmdline% замещается исходной командной строкой, переданной Cmd. exe, до ее обработки в Cmd.exe, если только уже не существует переменная среды с именем cmdcmdline. В этом случае будет использовано значение cmdcmdline.

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

    Использование оператора else

    Оператор else должен размещаться в той же строке, что и команда if. Пример:

    Приведенный ниже пример не будет работать, поскольку команда del должна заканчиваться новой строкой:

    IF EXIST имя_файла. del имя_файла. ELSE echo имя_файла. отсутствует

    Приведенный ниже пример не будет работать, поскольку команда else должна находиться в той же строке, что и команда if:

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

    IF EXIST имя_файла (del имя_файла) ELSE echo имя_файла отсутствует

    Примеры

    Если файл Product. dat не удается найти, появится следующее сообщение:

    if not exist product.dat echo Не найден файл данных

    Если в приведенном ниже примере при форматировании диска в дисководе A возникнет ошибка, будет выведено сообщение об ошибке:

    :begin
    @echo off
    format a: /s
    if not errorlevel 1 goto end
    echo Ошибка при форматировании.
    :end
    echo Конец пакетной программы.

    Если ошибка не возникнет, сообщение об ошибке выведено не будет.

    Команда if не может быть использована непосредственно для проверки существования каталога, но в каждом каталоге существует устройство (NUL). Следовательно, существование каталога может быть проверено, как показано ниже. В следующем примере проверяется наличие каталога:

    Далее кратко описаны полезные возможности, которые можно использовать в командных файлах (*.bat;*.cmd aka батники) операционных систем Windows 2000, XP, 2003 и более поздних.

    В этих операционных системах введены существенные расширения возможностей сценариев командной строки, которые позволяют делать, например, следующие вещи:

    • определение для файла полного и короткого пути к нему, имени, расширения, размера, времени модификации
    • выборочная итерация по файлам и каталогам с применением различных команд
    • расширенное перенаправление потоков ввода/вывода
    • использование переменных, вычисление арифметических выражений, манипуляции со подстроками
    • расширенная обработка условий
    • . многое другое

    Более подробную помощь нежели в данном обзоре можно найти в стандартной справке в каталоге Windows.
    (Типичный путь к файлу справки: C:WINDOWSHelp
    tcmds.chm. Если Windows установлена в каталог, отличный от C:WINDOWS, то ссылки на справку из данной страницы работать не будут. Потребуется открыть справку самостоятельно.)
    В частности, крайне полезно почитать следующие разделы:

    Справку по конкретной команде также всегда можно получить набрав в командной строке » /?».
    Например, очень познавательно почитать то, что выдается в результате команд set /?, call /?, for /?, if /?.

    Помощь приводится на языке установленной операционной системы.

    Вывод
    Текущий каталог
    Параметры вызова сценариев

    Например, после вызова будем иметь следующую картину:

    ПараметрЗначение
    %0d:deltalngscompile_all.cmd
    %1sol.dpr
    %2. (точка)
    %3,%4,%5 и т.д.(пусты)
    %*sol.dpr .

    Современные ОС используют расширенный режим обработки параметров, в котором доступны следующие модификаторы:

    МодификаторОписание
    расширение %1 и удаление любых кавычек («»)
    замена %1 полным путем
    замена %1 именем диска
    замена %1 путем без диска и имени файла
    замена %1 именем файла без расширения
    замена %1 расширением имени файла
    замена полным путем, содержащим только короткие имена
    замена %1 атрибутами файла
    замена %1 датой и временем модификации файла
    замена %1 размером файла
    Поиск в каталогах, перечисленных в переменной среды PATH, замена %1 полным именем первого найденного файла. Если переменная среды не определена или поиск не обнаружил файлов, модификатор выдает пустую строку.

    Описанные модификаторы можно применять в различных сочетаниях для всех параметров. Например:

    МодификаторОписание
    полный путь (включая завершающий слэш) к каталогу выполняемого скрипта
    имя файла первого параметра с расширением
    размер файла второго параметра
    замена %1 строкой, аналогичной результату работы программы dir
    Проверка условий

    Проверка существования файла:
    if [not] exist имя_файла команда [else выражение]
    Например: if exist $result$.txt del $result$.txt

    Проверка кода возврата:
    if [not] errorlevel число команда [else выражение]
    Условие верно, если предыдущая обработанная команда завершилась с кодом, равным или большим значения число.
    Например:

    Использование меток

    Есть также особый вариант команды call для повторного вызова текущего скрипта с заданной метки с определенными параметрами.

    Запуск команд

    Инструкция «cmd команда» запускает системный пакетный обработчик cmd. exe для выполнения команды команда.
    Если вызов происходит из консоли, то используется имеющаяся, если нет — создается новая.
    Ключи /c и /k указывают, что по завершении исполнения консоль нужно закрыть или оставить, соответственно.

    Инструкция «start команда» запускает обработку команды команда в отдельном параллельном процессе.
    Соответствующие ключи позволяют изменять приоритет запускаемого процесса.
    Ключ /wait указывает, что запустившему процессу следует дождаться завершения запущенного.

    Запускать новые командные сценарии из командных сценариев можно также двумя способами.
    Первый: Второй:

    Код возврата команд

    Команда exit число прерывает исполнение текущего сценария с возвратом запустившему его процессу заданного кода выхода. По умолчанию производится прерывание сразу всей цепочки вызовов пакетных сценариев. Если необходимо завершить только текущий сценарий и возвратить управление в сценарий, вызвавший его командой call, то нужно использовать ключ /b команды exit. Для выхода из сценария с передачей вызвавшему процессу текущего значения %errorlevel% необходимо использовать команду goto :eof.

    Некоторые команды всегда устанавливают переменную %errorlevel%, некоторые модифицируют ее только при возникновении ошибок, а некоторые вообще ее никогда не меняют.
    Вот пример:

    Копирование

    Проверить, удачно ли выполнилась команда можно по коду возврата %errorlevel%.

    Использование нескольких команд и символов условной обработки

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

    -10%

    0,-2%

    Для установки значений переменных используется команда set.
    Установка значений:
    set переменная=значение
    Показ значений:
    set переменная
    Показ значений всех переменных:
    set (без параметров)
    Проверка наличия переменной с заданным именем:
    if defined переменная команда

    Вычисление арифметических выражений

    В следующей таблице представлены арифметические операторы, поддерживающие параметр /a , в порядке убывания приоритета. заключайте выражение в кавычки.
    Любые нечисловые строки в выражении считаются именами переменной среды, чьи значения преобразуются в числа до обработки. Если указано имя переменной среды, которое не определено в текущем окружении, ей присваивается значение нуля, что позволяет выполнять арифметические операции со значениями переменной среды без использования % для получения значения.

    Пример использования вычисления выражений:

    Потоки ввода/вывода

    Потоки используются в командных сценариях для унифицированного распределения и перенаправления ввода/вывода.

    В следующей таблице представлены стандартные потоки.

    СимволСинтаксисОпределение
    & [. ]команда1 & команда2Выполняется первая команда, затем вторая команда.
    && [. ]команда1 && команда2Вторая команда выполняется, только если первая была выполнена успешно.
    || [. ]команда1 || команда2Вторая команда выполняется, только если первая не была выполнена (полученный код ошибки превышает ноль). или кавычки, если эти символы передаются в качестве аргументов.

    Вот пример специализированного скрипта для сравнения файлов:

    Использование переменных среды

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

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

    Псевдопеременные, такие как %CD%, %DATE%, %TIME%, %RANDOM%, %ERRORLEVEL%, обрабатываются особенным образом в зависимости от определенных условий.

    В следующей таблице приведен выборочный список наиболее интересных переменных среды.

    ПеременнаяТипОписание
    ЛокальнаяВозвращает путь к текущей папке.
    СистемнаяВозвращает имя компьютера.
    СистемнаяВозвращает текущую дату. Использует тот же формат, что и команда date /t .
    СистемнаяВозвращает код ошибки последней использовавшейся команды.
    СистемнаяУказывает путь поиска для исполняемых файлов.
    СистемнаяВозвращает произвольное десятичное число от 0 до 32767.
    СистемнаяВозвращает размещение системного каталога Windows.
    иСистемная и пользовательскаяВозвращает временные папки, по умолчанию используемые приложениями, которые доступны пользователям, выполнившим вход в систему. Некоторые приложения требуют переменную TEMP, другие — переменную TMP.
    СистемнаяВозвращает текущее время. Использует тот же формат, что и команда time /t .
    ЛокальнаяВозвращает имя пользователя, выполнившего вход в систему.

    При использовании переменных можно также использовать выделение подстрок.

    КонструкцияНазначение
    %PATH:

    10,5%

    расширит действие переменной среды PATH, затем использует только 5 символов, которые начинаются с 11-го символа (пропустив 10) расширенного результата. Если длина не указана, по умолчанию используется оставшееся значение переменной. Если оба значения (длина и число пропускаемых символов) отрицательны, следующим используемым значением будет длина значения переменной среды, добавленной к указанному значению пропуска или указанной длины.
    %PATH:
    извлечет последние 10 символов переменной PATH
    %PATH:
    извлечет все символы переменной PATH, за исключением 2-х последних
    ПотокНомер дескриптораОписание
    STDINСтандартный ввод (только чтение)
    STDOUT1Стандартный вывод (только запись)
    STDERR2Вывод ошибок (только запись)

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

    В следующей таблице представлены стандартные устройства.

    УстройствоОписание
    CONКонсоль (чтение с клавиатуры и вывод на экран)
    NULПустота
    PRNПринтер

    В качестве устройств могут также выступать файлы, заданные по имени.
    По умолчанию все стандартные потоки связаны с устройством CON.

    В следующей таблице описаны операторы перенаправления, применимые к потокам и устройствам.

    Оператор перенаправленияОписание
    >Перенаправление вывода с затиранием.
    Перенаправление ввода.
    >>Перенаправление вывода с добавлением.
    >&Считывает данные на выходе одного потока как входные данные для другого потока.
    Считывает входные данные одного потока как выходные данные другого потока.
    |Считывает выходные данные одной команды и записывает их на вход другой команды. Эта процедура известна под названием «канал».

    Некоторые команды, такие как find, sort, more, называются фильтрами, т.к. они занимаются специализированной трансформацией входного потока в выходной.

    Далее приведены некоторые примеры.

    Типичный вызов при тестировании программистских задач.
    (Ввод из input.txt, вывод в output.txt, вывод ошибок в никуда).

    Вызов скрипта компиляции с перенаправлением потоков вывода и ошибок на дописывание в файл compile.log.

    Дописывание содержимого одного файла в конец другого.

    Поэкранный вывод списка элементов текущего каталога.

    Поэкранный вывод имен всех фидошников города Гомеля, отсортированных по алфавиту.

    Организация циклов

    Команда for позволяет произвести запуск некоторой команды для каждого элемента из заданного множества.
    Синтаксис:

    Параметры: < % переменная | %% переменная >Обязательный параметр. Замещаемый параметр. Используйте % переменная для выполнения команды for из командной строки. В пакетных файлах для команды FOR используется запись %%переменная вместо %переменная. Имена переменных учитывают регистр букв (%i отличается от %I). ( множество ) Обязательный параметр. Задает один или несколько файлов, каталогов, диапазон значений или текстовых строк, подлежащих обработке заданной командой. Скобки являются обязательными. команда Обязательный параметр. Задает команду, которая будет выполнена для каждого файла, каталога диапазона значений или текстовой строки, включенной в указанный параметр ( множество ) . ПараметрыКоманднойСтроки Задает параметры командной строки, которые используются с указанной командой.
    Подробнее команда описана в справке. Здесь приведены несколько примеров, иллюстрирующих ее возможности.

    Перебор фиксированного множества параметров.

    Итерация по файлам.

    Итерация по каталогам.

    Итерация и разбор файлов

    Набор содержит имена одного или нескольких файлов, которые по очереди открываются, читаются и обрабатываются. Обработка состоит в чтении файла, разбивки его на отдельные строки текста и выделения из каждой строки заданного числа подстрок (в том числе нуля). Затем найденная подстрока используется в качестве значения переменной при выполнении основного тела цикла. По умолчанию ключ /F выделяет из каждой строки файла первое слово, очищенное от окружающих его пробелов. Пустые строки в файле пропускаются. Необязательный параметр «options» служит для переопределения заданных по умолчанию правил обработки строк.
    Возможные ключевые слова для этого параметра:

    Описание
    eol=cЗадает символ конца строки (только один символ).
    skip=nЗадает число строк, пропускаемых в начале файла.
    delims=xxxЗадает набор разделителей. Заменяет набор разделителей по умолчанию, состоящий из пробела и символа табуляции.
    Задает элементы, передаваемые из каждой строки в тело цикла for при каждой итерации. В результате размещаются дополнительные имена переменных. Форма m-n задает диапазон, указывающий элементы с m -го по n -ый. Если последним символом строки tokens= является звездочка (*), то размещается дополнительная переменная, в которую помещается остаток строки после разбора последнего элемента.
    usebackqЗадает возможность использования кавычек для имен файлов в параметре МножествоИменФайлов . Задает исполнение строки, заключенной в обратные кавычки, как команды, а строки в одиночных кавычках — как команды в символьной строке.

    Поясняющий пример:
    FOR /F «eol=; tokens=2,3* delims=, » %i in (myfile.txt) do @echo %i %j %k
    Эта команда обрабатывает файл myfile.txt, пропускает все строки, которые начинаются с символа точки с запятой, и передает вторую и третью подстроки из каждой строки в тело цикла, причем подстроки разделяются запятыми и/или пробелами. В теле цикла переменная %i используется для второй подстроки, %j – для третьей, а %k получает все оставшиеся подстроки после третьей. Имена файлов, содержащие пробелы, необходимо заключать в двойные кавычки. Для того чтобы использовать двойные кавычки, необходимо использовать параметр usebackq, иначе двойные кавычки будут восприняты как границы строки для обработки.

    Синтаксис команды FOR /F также позволяет обработать отдельную строку, с указанием параметра filenameset, заключенным в одиночные кавычки. Строка будет обработана как единая строка из входного файла.

    Наконец, команда FOR /F позволяет обработать строку вывода другой команды. Для этого следует ввести строку вызова команды в апострофах вместо набора имен файлов в скобках. Строка передается для выполнения обработчику команд CMD.EXE, а вывод этой команды записывается в память и обрабатывается так, как будто строка вывода взята из файла. Например, следующая команда:
    FOR /F «usebackq delims==» %i IN (`set`) DO @echo %i
    выведет перечень имен всех переменных среды, определенных в настоящее время в системе.

    Еще один пример:

    Организация блокировок
    Установка цвета консоли

    (CopyLeft) Vadim Kopichenko

    если | Документы Microsoft

    • 3 минуты на чтение

    В этой статье

    Выполняет условную обработку в пакетных программах.

    Синтаксис

      если [не] УРОВЕНЬ ОШИБКИ <число> <команда> [еще <выражение>]
    if [not]  ==   [else ]
    если [не] существует <имя файла> <команда> [еще <выражение>]
      

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

      if [/ i]     [else ]
    if cmdextversion <число> <команда> [еще <выражение>]
    если определено <переменная> <команда> [иначе <выражение>]
      

    Параметры

    Параметр Описание
    не Указывает, что команда должна выполняться, только если условие ложно.
    уровень ошибки <номер> Указывает истинное условие только в том случае, если предыдущая программа, запущенная Cmd.exe, вернула код выхода, равный или больший, чем номер .
    <команда> Задает команду, которую следует выполнить, если выполнено предыдущее условие.
    == Задает истинное условие, только если строка1 и строка2 совпадают.Эти значения могут быть буквальными строками или пакетными переменными (например, % 1 ). Вам не нужно заключать буквальные строки в кавычки.
    существует <имя файла> Задает истинное условие, если указанное имя файла существует.
    <сравнить> Определяет трехбуквенный оператор сравнения, включая:
    • EQU — равно
    • NEQ — не равно
    • LSS — меньше
    • LEQ — меньше или равно
    • GTR — больше
    • GEQ — больше или равно
    / я Принудительно игнорирует регистр при сравнении строк.Вы можете использовать / i в string1 == string2 форме , если . Эти сравнения являются общими, поскольку если и строка1 , и строка2 состоят только из числовых цифр, строки преобразуются в числа и выполняется числовое сравнение.
    cmdextversion <номер> Задает истинное условие, только если внутренний номер версии связан с функцией расширений команд Cmd.exe больше указанного числа или равно ему. Первая версия — 1. Она увеличивается на единицу при добавлении значительных улучшений в расширения команд. Условие cmdextversion никогда не истинно, если расширения команд отключены (по умолчанию расширения команд включены).
    определено <переменная> Задает истинное условие, если переменная определена.
    <выражение> Задает команду командной строки и любые параметры, передаваемые команде в предложении else .
    /? Отображает справку в командной строке.
    Примечания
    • Если условие, указанное в предложении if , истинно, выполняется команда, следующая за условием. Если условие ложно, команда в предложении if игнорируется, и команда выполняет любую команду, указанную в предложении else .

    • Когда программа останавливается, она возвращает код выхода.Чтобы использовать коды выхода в качестве условий, используйте параметр errorlevel .

    • Если вы используете , определенный , в среду добавляются следующие три переменные: % errorlevel% , % cmdcmdline% и % cmdextversion% .

      • % errorlevel% : заменяется на строковое представление текущего значения переменной среды ERRORLEVEL. Эта переменная предполагает, что еще не существует переменной среды с именем ERRORLEVEL.Если есть, вместо этого вы получите это значение ERRORLEVEL.

      • % cmdcmdline% : заменяется исходной командной строкой, которая была передана в Cmd.exe до любой обработки Cmd.exe. Это предполагает, что еще не существует переменной среды с именем CMDCMDLINE. Если есть, вместо этого вы получите это значение CMDCMDLINE.

      • % cmdextversion% : заменяется на строковое представление текущего значения cmdextversion .Это предполагает, что еще не существует переменной среды с именем CMDEXTVERSION. Если есть, вместо этого вы получите это значение CMDEXTVERSION.

    • Вы должны использовать предложение else в той же строке, что и команда после , если .

    Примеры

    Чтобы отобразить сообщение Не удается найти файл данных, если не удается найти файл Product.dat , введите:

      если товар не существует.dat echo Не удается найти файл данных
      

    Чтобы отформатировать диск в дисководе A и отобразить сообщение об ошибке в случае возникновения ошибки во время процесса форматирования, введите следующие строки в пакетном файле:

     : начало
    @echo off
    формат a: / s
    если нет errorlevel 1 goto end
    echo Произошла ошибка во время форматирования.
    :конец
    echo Конец пакетной программы.
      

    Чтобы удалить файл Product.dat из текущего каталога или отобразить сообщение, если Product.dat не найден, введите следующие строки в пакетном файле:

      ЕСЛИ СУЩЕСТВУЕТ Продукт.dat (
    del Product.dat
    ) ЕЩЕ (
    echo Файл Product.dat отсутствует.
    )
      

    Примечание

    Эти строки можно объединить в одну строку следующим образом:

      ЕСЛИ СУЩЕСТВУЕТ Product.dat (del Product.dat) ELSE (echo Файл Product.dat отсутствует.)
      

    Чтобы отобразить значение переменной среды ERRORLEVEL после запуска пакетного файла, введите в пакетном файле следующие строки:

      перейти к ответу% errorlevel%
    : answer1
    echo Программа вернула ошибку уровня 1
    перейти к концу
    : answer0
    echo Программа вернула уровень ошибки 0
    перейти к концу
    :конец
    эхо Готово!
      

    Чтобы перейти к метке ОК, если значение переменной среды ERRORLEVEL меньше или равно 1, введите:

      если% errorlevel% LEQ 1 перейти в норму
      

    Дополнительные ссылки

    MS-DOS и командная строка Windows, если команда

    Обновлено: 21.05.2018 компанией Computer Hope

    Команда if выполняет условную обработку в пакетных программах.

    Наличие

    Команда if — это внутренняя команда, доступная и используемая в пакетных файлах.

    Если синтаксис

    Windows Vista и более поздние версии синтаксис

     IF [NOT] ERRORLEVEL числовая команда
    IF [НЕ] строка1 == строка2 команда
    ЕСЛИ [НЕ] СУЩЕСТВУЕТ имя файла, команда 
    НЕ Указывает, что Windows 2000 или XP должна выполнять команду, только если условие ложно.
    УРОВЕНЬ ОШИБКИ номер Задает истинное условие, если последний запуск программы вернул код выхода, равный указанному числу или превышающий его.
    строка1 == строка2 Задает истинное условие, если указанные текстовые строки совпадают.
    СУЩЕСТВУЕТ имя файла Задает истинное условие, если указанное имя файла существует.
    команда Задает команду, выполняемую при выполнении условия. За командой может следовать команда ELSE, которая выполнит команду после ключевого слова ELSE, если указанное условие — ЛОЖЬ.

    Предложение ELSE должно находиться в той же строке, что и команда после IF.Например:

     ЕСЛИ СУЩЕСТВУЕТ имя файла. (
     дель имя файла.
    ) ЕЩЕ (
     эхо имя файла. отсутствующий.
    ) 

    Пример ниже НЕ будет работать, потому что команда del должна завершаться новой строкой:

     ЕСЛИ СУЩЕСТВУЕТ имя файла. дель имя файла. ИНАЧЕ echo filename. отсутствует 

    Приведенный ниже пример также не будет работать, потому что команда ELSE должна находиться в той же строке, что и конец команды IF:

     ЕСЛИ СУЩЕСТВУЕТ имя файла. дель имя файла.
    ИНАЧЕ echo filename.отсутствует 

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

     ЕСЛИ СУЩЕСТВУЕТ имя файла. (del filename.) ELSE echo filename. отсутствует 

    Если включены расширения команд, 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 работает так же, как EXISTS, за исключением того, что оно принимает имя переменной среды и возвращает истину, если переменная среды определена.

    % ERRORLEVEL% заменяется строкой текущего значения ERRORLEVEL при условии, что еще не существует переменной среды с именем ERRORLEVEL, и в этом случае вы получите ее значение. После запуска программы в приведенном ниже примере показано использование УРОВНЯ ОШИБКИ:

     перейти к ответу% ERRORLEVEL%
    : answer0
    Программа echo имеет код возврата 0
    : answer1
    Программа echo имеет код возврата 1 

    Вы также можете использовать числовые сравнения ниже:

     IF% ERRORLEVEL% LEQ 1 перейти в норму 

    % CMDCMDLINE% расширяется до командной строки, переданной в CMD.EXE перед любой обработкой CMD.EXE, при условии, что нет переменной среды CMDCMDLINE, и в этом случае вы получите ее значение.

    % CMDEXTVERSION% заменяется строкой значения CMDEXTVERSION при условии, что еще нет переменной среды с именем CMDEXTVERSION, и в этом случае вы получите ее значение.

    Windows XP и более ранний синтаксис

    Выполняет условную обработку в пакетных программах.

     IF [NOT] ERRORLEVEL числовая команда
    IF [НЕ] строка1 == строка2 команда
    ЕСЛИ [НЕ] СУЩЕСТВУЕТ имя файла, команда 
    НЕ Указывает, что Windows должна выполнять команду, только если условие ложно.
    УРОВЕНЬ ОШИБКИ номер Задает истинное условие, если последний запуск программы вернул код выхода, равный указанному числу или превышающий его.
    команда Задает команду, выполняемую при выполнении условия.
    строка1 == строка2 Задает истинное условие, если указанные текстовые строки совпадают.
    СУЩЕСТВУЕТ имя файла Задает истинное условие, если указанное имя файла существует.

    Если примеры

    Дополнительные примеры и использование команды выбора см. На странице справки по пакетному файлу.

    Дополнительная информация
    • См. Наше определение if else для получения дополнительной информации и связанных ссылок по этому термину.

    Условная обработка с помощью команды if

    Windows 7 / Начало работы

    Команда if позволяет запускать определенные команды только при выполнении определенных условий. Если это одно из основных требований настоящего языка программирования, и расширен, если команда, предоставленная CMD, делает язык командного файла намного больше полезнее, чем было во времена COMMAND.COM. Вы используете команду if в пакетных файлах. гораздо чаще, чем непосредственно в командной строке.

    Основные форматы команды if:

    , если команда условия
    а также
        если условие (команда1) еще команда2
     

    Первая версия проверяет какое-то условие и, если оно истинно, выполняет команду. Если условие неверно, команда игнорируется.

    Вторая версия предоставляет вторую команду, которая запускается, если условие ложно. В В этой версии выполняется одна или другая команда, в зависимости от условия.Вы можете сгруппировать несколько команд в операторе if, используя круглые скобки. Например, утверждения

    , если не существует input.dat (
        echo Внимание: создание нового файла input.dat
        dir / b c: \ inputs> input.dat
    )
     

    проверьте, существует ли файл input.dat, и, если его нет, запустите echo и dir. команды. Сгруппированные команды упрощают чтение и запись командных файлов CMD. чем формат DOS, где вам пришлось бы вместо этого написать:

     если существует input.dat goto haveinput
        echo Внимание: создание нового ввода.dat файл
        dir / b c: \ inputs> input.dat
    : haveinput
     

    Вы также можете использовать предложение else с сгруппированными командами в следующем формате:

     если условие (
        команды
        ...
    ) еще (
        команды
        ...
    )
     

    Отступы необязательны; это просто упрощает чтение команд. Вот несколько тестов условий, перечисленных здесь:

    • [not] strng1 == strng2
      Сравнивает strng1 с strng2 и истинно, если строки точно равны, включая дело.Смысл может быть изменен, если перед тестом поставить слово not.
    • [не] номер уровня ошибки
      Проверяет значение статуса выхода последней запущенной программы. Условие Значение true, если статус выхода больше или равен числу. Не меняет смысла; тест верен, если статус выхода меньше числа.
    • [не] существует [путь] имя
      Проверка верна, если указанный файл или каталог существует. Смысл может быть изменен на противоположный. с not. Чтобы проверить каталог, добавьте обратную косую черту (\) в конец каталога. название.Например, если существует c: \ temp \, обнаружит существование каталога c: \ temp, но файл с именем c: \ temp не обманет вас.
    • [/ i] strng1 compareop strng2
      Сравнивает две строки и возвращает результат сравнения. Если оба строки состоят только из цифр, сравнение производится численно; в противном случае это сделано по алфавиту. Если используется / i, в тесте не учитывается регистр. Compareop — одно из следующих:
      EQU-равно
      NEQ-не равно
      LSS-меньше
      LEQ-меньше или равно
      GTR-больше
      GEQ-больше или равно
    • cmdextversion number
      Тест верен, если номер версии расширений CMD больше или равно числу.Номер версии расширения команды для Windows 7, Vista, а XP — 2. Тест всегда ложный, если расширения команд отключены.
    • определено переменная
      Тест верен, если указанная переменная среды определена и не пуста.

    Расширенный оператор if — одно из самых больших улучшений CMD. В сочетании с переменные окружения, у вас есть достойный язык программирования.

    IF … OR IF … в пакетном файле Windows

    Решение zmbq хорошее, но не может использоваться во всех ситуациях, например внутри блока кода, такого как FOR DO (…) петля.

    Альтернативой является использование индикаторной переменной. Инициализируйте его как неопределенное, а затем определите его, только если любое из условий ИЛИ истинно. Затем используйте IF DEFINED в качестве финального теста — нет необходимости использовать отложенное расширение.

      ДЛЯ ..... DO (
      установить "ИСТИНА ="
      ЕСЛИ cond1 устанавливает ИСТИНА = 1
      ЕСЛИ cond2 устанавливает ИСТИНА = 1
      ЕСЛИ определено ИСТИНА (
        ...
      ) еще (
        ...
      )
    )
      

    Вы можете добавить логику ELSE IF, которую использует arasmussen, на том основании, что она может работать немного быстрее, если 1-е условие истинно, но я никогда не беспокоюсь.

    Приложение — Это повторяющийся вопрос с почти идентичными ответами на Использование ИЛИ в операторе IF Пакетный сценарий WinXP

    Заключительное приложение — Я почти забыл свой любимый метод проверки, является ли переменная одним из списков нечувствительных к регистру значений. Инициализируйте тестовую переменную, содержащую список допустимых значений с разделителями, а затем используйте поиск и замену, чтобы проверить, находится ли ваша переменная в списке. Это очень быстро и требует минимального кода для произвольно длинного списка.Это требует отложенного расширения (или трюка CALL %% VAR %%). Также тест НЕ ЧУВСТВИТЕЛЬНЫЙ.

      установить «ТЕСТ =; значение1; значение2; значение3; значение4; значение5;»
    if "! TEST:;% VAR%; =!" neq "! ТЕСТ!" (эхо истина) еще (эхо ложь)
      

    Вышеупомянутое может завершиться ошибкой, если VAR содержит = , поэтому тест не является надежным.

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

      для ... do (
      установить "ТЕСТ =; значение1; значение2; значение3; значение4; значение5;"
      for / f %% A in (";! VAR !;") выполнить, если "! TEST: %% A =!" neq "! ТЕСТ!" (эхо истина) еще (эхо ложь)
    )
      

    FOR такие параметры, как «delims =», могут потребоваться в зависимости от ожидаемых значений в VAR

    Вышеупомянутую стратегию можно сделать надежной даже с = в VAR, добавив немного больше кода.

      установить «ТЕСТ =; значение1; значение2; значение3; значение4; значение5;»
    if "! TEST:;% VAR%; =!" neq "! ТЕСТ!" if "! TEST:;% VAR%; =;% VAR%;" == "! TEST!" эхо верно
      

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

    Наконец, есть более простая версия, которая, на мой взгляд, немного медленнее, потому что она должна выполнять один IF для каждого значения., и и т. Д. Еще одно ограничение этого решения заключается в том, что оно не предоставляет возможности для предложения ELSE, если вы не добавите индикаторную переменную. Преимущества заключаются в том, что он может быть чувствительным к регистру или нечувствительным в зависимости от наличия или отсутствия опции IF / I .

    Проект документации Linux


    Информация о LDP
    FAQ
    Манифест / лицензия
    История
    Волонтеры / сотрудники
    Должностные инструкции
    Списки рассылки
    IRC
    Обратная связь

    Автор / внесение вклада
    Руководство для авторов LDP
    Внесите свой вклад / помогите
    Ресурсы
    Как отправить
    Репозиторий GIT
    Загрузок
    Контакты

    Спонсор сайта LDP
    Мастерская

    LDP Wiki : LDP Wiki — это отправная точка для любой незавершенной работы
    Члены | Авторы | Посетители
    Документы

    HOWTO : тематическая справка
    последние обновления | основной индекс | просматривать по категориям
    Руководства : более длинные, подробные книги
    последние обновления / основной индекс
    Часто задаваемые вопросы : Часто задаваемые вопросы
    последние обновления / основной индекс
    страницы руководства : справка по отдельным командам (20060810)
    Бюллетень Linux : Интернет-журнал
    Поиск / Ресурсы

    Ссылки
    Поиск OMF
    Объявления / Разное


    Обновления документов
    Ссылка на HOWTO, которые были недавно обновлены.

    Как написать сценарий CMD | Small Business

    Если вы каждый раз использовали командную строку или интерфейс CMD, в Windows, вы, вероятно, имеете некоторое представление о мощных вещах, которые она может делать. Создавая собственные сценарии CMD , вы можете сделать еще больше, но быстрее.

    Сценарий CMD делает то же самое, как если бы вы вводили команды в окно CMD. Если вы хотите что-то делать на регулярной основе, например, сказать Windows, чтобы она выключила ваш компьютер через час, вы можете написать сценарий, а затем вы можете активировать его, когда захотите его запустить.

    Общие сведения о CMD и написанных командах

    На заре персональных компьютеров почти все делалось , набирая команду _s в интерфейсе командной строки. Если вы хотели открыть программу, вам нужно было ввести имя программы в командной строке. Сегодня вы можете просто щелкнуть или коснуться значка на экране, чтобы выполнить большинство действий. Но Windows по-прежнему принимает печатные команды в утилите CMD. Вы можете писать команды _ для открытия программ, добавления или изменения разрешений учетной записи, резервного копирования файлов или получения информации о вашем компьютере с помощью окна CMD.

    Общие сведения о сценариях CMD

    Утилиту командной строки в Windows можно открыть в любое время, просто набрав «cmd» в меню Windows Пуск . Здесь вы можете вводить всевозможные команды, чтобы открывать программы, изменять настройки и вносить изменения в работу Windows и ее программ. В долгой истории Microsoft операционных систем CMD i — относительный новичок. В MS-DOS до выпуска Windows, когда вы хотели запустить сценарий, вы сохраняли его как файл.bat файл. Хотя сегодня вы все еще можете сохранять файлы с этим расширением, большинство людей используют расширение .cmd. _

    Использование сценария

    CMD для открытия Блокнота

    Для создания и сохранения переключателя CMD , лучше всего использовать базовый текстовый редактор . Использование текстового процессора, такого как Microsoft Word, затрудняет сохранение файла. Блокнот намного проще в использовании. Итак, чтобы продемонстрировать, как работает CMD , давайте откроем его, чтобы открыть блокнот .

    1. Введите CMD в меню «Пуск» Windows и нажмите Enter , чтобы открыть CMD.exe.
    2. Измените каталог с папки с текущим именем пользователя на базовый каталог, набрав «cd \» и нажав Enter. Теперь перед мигающим курсором должно быть написано «C: \>» .
    3. Введите следующую строку и нажмите Введите: start «c: \ windows \ system32» блокнот.exe

    Как только вы нажмете Enter, вы увидите, что Блокнот открыт. Введенная вами команда сообщила Windows запустить программу notepad.exe , которая находится в папке system32 , которая находится внутри папки Windows на диске C: . Команды CMD не чувствительны к регистру, поэтому вы можете использовать строчные и прописные буквы как взаимозаменяемые.

    Создание вашего первого сценария

    CMD Файл

    Теперь, когда «Блокнот» открыт, создайте свой первый файл сценария CMD, введя в блокнот ту же строку, которую вы использовали в окне CMD: start «c: \ windows \ system32» блокнот.exe

    Сохраните пакетный файл на рабочем столе, выбрав «Сохранить как» в меню «Файл». Назовите файл «firstscript.cmd» и нажмите «Сохранить». Команды сценария блокнота должны быть сохранены с расширением .cmd, а не с расширением .txt по умолчанию.

    Дважды щелкните новый файл CMD на рабочем столе. Вы увидите, что окно CMD открывается на долю секунды, а затем закрывается при запуске Notepad .

    Это вряд ли полезный сценарий, поскольку ярлык на рабочем столе делает то же самое. Чтобы создать что-то более полезное, давайте отредактируем файл так, чтобы он создавал новый текстовый файл на вашем рабочем столе со списком всех ваших программ.

    Использование Echo и Echo Off

    Хотя окно CMD не было открыто достаточно долго, чтобы его увидеть, по умолчанию оно всегда будет отображать текст, введенный в файл CMD при запуске. Для более длинных скриптов это может быть неприятным, поэтому обычно рекомендуется отключить это, используя команду Echo Off в первой строке файла CMD.Само по себе Echo Off отключает отображение любого текста, который следует за ним. Чтобы применить команду Echo Off к самой себе, поместите перед ней символ @. Таким образом, ваш двухстрочный сценарий CMD будет выглядеть следующим образом:

    start «c: \ windows \ system32» notepad.exe

    Создание сценария текстового файла

    Этот сценарий CMD перечислит все файлы, которые есть в ваших программных файлах. папку и поместите этот список в новый текстовый файл.

    1. Откройте Блокнот .Введите « @echo off » в первой строке и нажмите Enter.
    2. Во второй строке введите: dir «C: \ Program Files»> list_of_files.txt
    3. Выберите «Сохранить как » в меню «Файл» и сохраните файл как . list-script.cmd «.
    4. Дважды щелкните новый текстовый файл на рабочем столе, чтобы просмотреть список файлов и папок.

    Текстовый файл появится в той же папке, где находится сам файл сценария.Таким образом, если файл сценария находится на вашем рабочем столе, файл list-of-files.txt также появится на вашем рабочем столе.

    Если вы хотите изменить папку, в которой находится текстовый файл, вы можете указать его собственную папку в скрипте. Например, если вы хотите поместить его в папку «Документы», используйте: dir «C: \ Program Files»> C: \ Users \ David \ Documents \ list_of_files.txt

    Создание сценария системной информации

    Если если вы хотите использовать сценарий для предоставления необходимой информации, не всегда необходимо создавать текстовый документ со сценарием.Вы можете разместить информацию прямо в окне CMD .

    Пример сценария ниже предоставит вам основную информацию о вашем компьютере, включая операционную систему и номер версии, версию BIOS, общий объем физической памяти и сетевой адрес вашего компьютера. Чтобы использовать сценарий, введите или скопируйте приведенные ниже строки в новый файл Блокнота и сохраните его с расширением файла .cmd, , например «my_computer_info».cmd. «

    В этом примере ECHO OFF используется для предотвращения отображения сценария в окне CMD .

    Команда ECHO используется для отображения определенного текста, а также несколько знаков равенства (===) в виде строк для организации информации по разделам

    Чтобы вставить комментарий для вашего собственного использования — не влияя на сценарий и не появляясь в окне CMD — сначала введите два двоеточия.Все, что находится в той же строке после «::» , будет закомментировано в сценарии.

    Команда PAUSE указывает программе CMD оставаться открытой. Нажатие любой клавиши на клавиатуре закроет окно.

    :: Этот сценарий CMD предоставляет вам информацию об операционной системе, оборудовании и сети.

    ECHO Подождите … Сбор системной информации.

    ECHO =========================

    systeminfo | findstr / c: «Имя ОС»

    systeminfo | findstr / c: «Версия ОС»

    ECHO =========================

    systeminfo | findstr / c: «Тип системы»

    ECHO =========================

    systeminfo | findstr / c: «Общая физическая память»

    ECHO =========================

    ECHO ====== ===================

    Использование сценариев для выключения компьютера

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

    При использовании команды выключения необходимо включить два дополнительных переключателя или подкоманды . Первый сообщает компьютеру выключиться или перезагрузиться. Вы можете использовать -s или -r.Второй сообщает компьютеру, сколько секунд ждать перед выполнением команды. Для этого вы используете -t, за которым следует количество секунд.

    Чтобы выключить компьютер за одну секунду, используйте: shutdown -s -t 01

    Чтобы перезагрузить компьютер за восемь секунд, используйте: shutdown -r -t 08

    Чтобы выключить компьютер через два часа, используйте : shutdown -s -t 7200

    Резервное копирование файлов с помощью сценария CMD

    Если вам утомительно создавать резервные копии файлов на втором запоминающем устройстве, с помощью сценария CMD процесс упрощается.Для этого используйте команду Robocopy . Например, если вы хотите создать резервную копию всех файлов в папке «Документы» на съемном запоминающем устройстве, вы можете записать команду в файл CMD, а затем — в конце дня — просто дважды щелкнуть файл, чтобы активировать его. .

    Команда Robocopy должна знать, во-первых, какую папку вы хотите скопировать, а во-вторых, куда вы хотите поместить копию. И источник, и место назначения должны быть заключены в кавычки.

    Если вы не уверены, какие буквы у вас на диске, откройте Проводник и щелкните «Мой компьютер».

    Например, если ваше имя пользователя MyName , ваша папка Documents находится на вашем C: диске , а ваша Backup папка находится на съемном носителе D: диск, , тогда команда будет:

    robocopy D: \ Users \ MyName \ Documents F: \ Backup / XA: H / W: 0 / R: 1> F: \ Backup \ backup.log

    Этот пример немного сложнее, поскольку Robocopy предлагает множество вариантов.

    D: \ Users \ MyName \ Documents: папка, для которой требуется создать резервную копию.

    F: \ Backup: расположение папки резервного копирования.

    / XA: H: игнорирует скрытые файлы.

    / W: 0: ждет 0 секунд между попытками вместо 30 секунд по умолчанию.

    / R: 1 : повторите попытку только один раз, если файл заблокирован.

    > F: \ Backup \ backup.log: создать журнал резервного копирования, помещенный в папку резервного копирования.

    Обратите внимание, что, поскольку это зеркальная резервная копия, если вы удалите файлы из исходной папки, они будут удалены из резервной папки при следующем использовании сценария. Было бы неплохо изучить дополнительные переключатели, доступные для Robocopy, чтобы обеспечить резервное копирование файлов наиболее удобным для вас способом.

    Преобразование сценариев cmd в PowerShell

    Недавно я переместил много сценариев из cmd (.bat или .cmd ) в PowerShell ( .ps1 ). В этом посте я покажу все различия, которые я видел во время миграции. Этот список не является исчерпывающим, поскольку он содержит только случаи, с которыми я столкнулся в перенесенных скриптах.

    # Зачем использовать PowerShell вместо cmd?

    PowerShell имеет много преимуществ по сравнению с cmd:

    • Обнаружение: PowerShell позволяет легко обнаруживать его функции благодаря автозаполнению, командам Get-Command и Get-Help .
    • Согласованность. Согласованность PowerShell — одно из ее основных преимуществ. Например, если вы научитесь использовать командлет Sort-Object , вы можете использовать эти знания для сортировки вывода любого командлета. Вам не нужно изучать разные процедуры сортировки каждого командлета.
    • Интерактивная среда и среда сценариев: PowerShell объединяет интерактивную оболочку и среду сценариев. PowerShell может получить доступ к инструментам командной строки, COM-объектам и библиотекам классов .NET.
    • Ориентация объекта: PowerShell основан на объекте, а не на тексте.Результатом команды является объект. Вы можете отправить выходной объект через конвейер другой команде в качестве входных данных.
    • Кросс-платформенность: PowerShell работает в Windows, Linux и Mac.

    Если у вас все еще есть сомнения по поводу использования PowerShell вместо cmd, Rich Turner ясно объясняет, что будущее за PowerShell:

    Cmd находится в режиме обслуживания. Его задача — сохранить обратную совместимость с древними и неизменными скриптами. Вот и все. Период. Его не следует использовать для интерактивной работы оболочки.

    PowerShell — это будущее.

    Rich Turner , старший менеджер программ, консоль Windows и командная строка

    # Существует 2 варианта PowerShell

    Существует 2 варианта PowerShell:

    • PowerShell ( powershell.exe ) is компонент Windows. Эта версия работает только в Windows и не получит никаких новых функций.
    • PowerShell Core ( pwsh.exe ) доступно на GitHub. Этот вариант работает в Windows, Linux и Mac.Это версия, над которой работает Microsoft.

    Если у вас есть выбор, используйте последнюю версию pwsh . Вы можете найти его на GitHub: Загрузите PowerShell .

    Примечание: Суффикс «Core» был удален в последней версии, новое имя — PowerShell 7

    # различия cmd / PowerShell

    ## Развернуть переменные среды

       echo% test% 
    echo $ env: test  

    Если имя переменной содержит сложные символы, вам необходимо использовать фигурные скобки ( $ {env: name} )

       echo% ProgramFiles (x86)% 
    echo $ {env: ProgramFiles (x86)}  

    При использовании переменной среды в качестве аргумента поведение отличается.cmd разверните переменные среды, а затем выполните командную строку. Итак, вам нужно избегать аргументов.

      $ test = "a b"
    sample.exe $ test # 1 аргумент
    
    $ test = @ ("a", "b") # Объявить массив
    sample.exe $ test # 2 аргумента  

    ## Установить переменную среды

       set test = abc 
    $ env: test = "abc"
    Set-Item -Path Env: test -Value "abc"  
       set / p test = 
    $ env: test = Get-Content MyFilename.txt -First 1 # Чтение только первой строки для соответствия поведению cmd  

    Вы можете установить переменные среды для текущего пользователя или компьютера, используя C #:

      # Получить значение
    $ path = [Environment] :: GetEnvironmentVariable ('PSModulePath', 'Machine') # Пользователь или компьютер
    
    # Установить значение
    [Environment] :: SetEnvironmentVariable ("PSModulePath", $ newpath, 'Machine')  

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

      $ test = "abc "# переменная действительна только в текущем скрипте
    echo $ test  

    ## Список переменных среды

       set 
    Get-ChildItem env:  

    ## Получить текущий каталог

       echo% cd% 
    echo $ pwd  

    ## Получить каталог сценария

       echo% ~ dp0 
    echo $ PSScriptRoot  

    ## Получить код выхода

      ping 127.0.0.1
      echo% errorlevel% 
    echo $ lastexitcode  

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

      PS> Get-ChildItem
    PS> echo $?
    True  

    Документация:

    ## Выполнить исполняемый файл в текущем каталоге

    Чтобы выполнить файл, который находится в текущем каталоге, вам нужно добавить к имени префикс . \

       myexe.exe 
    . \ myexe.exe  

    ## echo имеет другое поведение

    В cmd echo печатает аргумент как есть. В PowerShell echo — это псевдоним для Write-Output , который печатает каждый аргумент в строке.

      $> эхо а б в
    а б в
    
    PS> эхо a b c
    а
    б
    c
    
    PS> эхо "a b c"
    а б в
    
    PS> echo a b c | Строка соединения-разделитель ""
    a b c  

    Документация:

    ## Перенаправление вывода в файл

    Синтаксис тот же, вы можете использовать команду > имя_файла , за исключением того, что перед >

       ping 127 должен быть пробел.0.0.1> output.txt 
    ping 127.0.0.1> output.txt # Перед ">" должен быть пробел
    
      пинг 127.0.0.1 >> output.txt 
    ping 127.0.0.1 >> output.txt # Перед ">>" должен быть пробел  

    Вы также можете использовать командлет Out-File , который предоставляет дополнительные параметры, такие как кодирование файла:

       ping 127.0. 0.1> output.txt 
    ping 127.0.0.1 | Out-файл output.txt
    
      пинг 127.0.0.1 >> output.txt 
    Пинг 127.. В PowerShell вы можете использовать префикс  ` для любого символа, чтобы избежать его. Экранирующий символ позволяет: 

    • Удалить особое значение символа

        PS> $ def = "variable"
      PS> Write-Host "Значение` $ def: $ def "
      Значение $ def: переменная
      
      PS> Write-Host abc` | def
      abc | def
      
      PS> Write-Host "abc`" def "
      abc "def
      
      PS> Write-Host "abc``def"
      abc`def  
    • Для представления специального символа

      • `0 : null
      • ` a : Alert
      • `b : Backspace
      • ` e : Escape
      • `f : Подача страницы
      • ` n : Новая строка
      • ` r : Возврат каретки
      • ` t : Горизонтальная табуляция
      • ` v : Вертикальная табуляция
      • ` u {x} : Управляющая последовательность Unicode ( `u {2195} представляет собой символ стрелки вверх-вниз (↕))

    Документация:

    ## Аргументы цитирования

    Правила цитирования не совпадают в cmd и PowerShell.В основном потому, что в PowerShell есть понятие выражения и особое поведение для аргументов, начинающихся с тире . В режиме аргументов каждое значение обрабатывается как расширяемая строка, если оно не начинается с одного из следующих специальных символов: знак доллара ( $ ), знак at ( @ ), одинарная кавычка ( '), двойные кавычки. знак ( ") или открывающую скобку ( (). В этих случаях значение обрабатывается как выражение и оценивается.

      PS> эхо 2 + 2
    2 + 2
    
    PS> эхо (2 + 2)
    4
    
    PS> эхо "(2 + 2)"
    (2 + 2)
    
    PS> $ a = 2 + 2
    PS> эхо $ a
    4  

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

      PS> echo arg = abc.txt # 1 аргумент
    arg = abc.txt
    
    PS> echo -arg = abc.txt # 2 аргумента
    -arg = abc
    .текст
    
    PS> echo "-arg = abc.txt"
    -arg = abc.txt  

    Параметр - - это специальный параметр, который указывает, что после этого параметры не следует связывать.

      PS> Запись-вывод -InputObject
    Запись-вывод: отсутствует аргумент для параметра «InputObject». Укажите параметр типа System.Management.Automation.PSObject и повторите попытку.
    
    PS> Запись-Вывод - -InputObject
    -InputObject  

    Символ остановки анализа ( -% ) предписывает PowerShell воздерживаться от интерпретации ввода как команд или выражений PowerShell. Когда он встречает символ остановки анализа, PowerShell обрабатывает оставшиеся символы в строке как литерал.Единственная интерпретация, которую он выполняет, - это замена значений переменных среды, использующих стандартную нотацию Windows, например % USERPROFILE% . Символ остановки анализа действует только до следующего символа новой строки или конвейера. Например, две следующие команды являются эквивалентами:

      PS> icacls X: \ VMS / grant Dom \ HVAdmin: `(CI`)` (OI`) F
    PS> icacls X: \ VMS -% / grant Dom \ HVAdmin: (CI) (OI) F  

    Документация:

    ## call command

    Оператор call позволяет запускать команды, которые хранятся в переменных и представлены строками или блоками скрипта.

       вызов% exe% 
    & $ env: exe  

    Это также необходимо, если команда должна быть процитирована:

      PS> & ". \ script name with space.ps1"  

    Documentation:

    ## call a bat script

    Вы можете вызвать сценарий bat с помощью cmd.exe :

       myscript.bat 
    cmd.exe / c myscript.bat  
       папка / myscript.bat 
    cmd.exe / c folder \ myscript.bat # необходимо использовать обратную косую черту в Windows  

    Обратите внимание, что переменные среды, заданные в сценарии bat, не будут доступны на узле PowerShell после выполнения сценария.

    ## если блок

       установить a = 0 
     , если% a% == 0 (
      истинное эхо 
     ) остальное (
      эхо ложное 
     ) 
    $ a = 0
    если ($ a -eq 0)
    {
        эхо верно
    }
    еще
    {
        эхо ложное
    }  

    Вы можете заменить , если определено ПЕРЕМЕННАЯ , на командлет Test-Path :

      , если определено TEST (действие) else (действие) 
    if (Test-Path env: TEST) {действие} else {действие}
    
     , если не определено ТЕСТ (действие) 
    if (-not (Test-Path env: TEST)) {action}  

    Документация:

    ## Объединение команд с помощью && и ||

    Эти 2 оператора позволяют комбинировать команды.Они поддерживаются начиная с PowerShell 7 . Если вы используете старую версию, вам необходимо заменить их операторами if .

      # Test-Command '1' || Тестовая команда '2'
    Тест-команда «1»; if (-not $?) {Test-Command '2'}
    
    # Test-Command '1' && Test-Command '2'
    Тест-команда «1»; if ($?) {Test-Command '2'}  

    Документация:

    ## Манипуляции со строками

    Для управления строками можно использовать любые функции .NET. Итак, вы можете подстроки, заменить и т. Д.используя методы System.String. * .

       эхо% var: ~ 0,3% 
    echo $ var.Substring (0, 3)  
       echo% var: ~ -3% 
    echo $ var.Substring ($ var.Length - 3)  
       set test = 123meziantou 
      echo% test: 123 = Hello% 
    $ test = "123meziantou"
    echo $ test.Replace ("123", "Hello")  

    Документация:

    ## Подождите несколько секунд

    В cmd обычно используется ping 127.0.0.1 подождать несколько секунд. В PowerShell вы можете использовать командлет Sleep :

      Start-Sleep -Seconds 5  

    ## Проверить, доступен ли компьютер

    Вы можете проверить доступность удаленного компьютера перед выполнением действия с помощью Командлет Test-Connection :

      if (Test-Connection -TargetName Server01 -Quiet)
    {
        Новый-PSSession -ComputerName Server01
    }  

    # Заменить exe на командлет

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

    • rmdir / s / q C: \ MyFolder Remove-Item C: \ MyFolder -Recurse -Force
    • del / s / q file.txt Remove-Item file.txt -Recurse -Force
    • sc Get-Service / Start-Service / Stop-Service / New-Service / Remove-Service / и т.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *