Cmd windows if exist
Обработка условий в пакетных программах.
Синтаксис
Если расширения командного процессора разрешены, следует использовать следующий синтаксис:
Параметры
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). Следовательно, существование каталога может быть проверено, как показано ниже. В следующем примере проверяется наличие каталога:
if exist c:mydir\nul goto process
Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).
Новый раздел о средствах командной строки в рамках этого же проекта расположен здесь
if if
Выполняет условную обработку в пакетных программах. Performs conditional processing in batch programs.
Синтаксис Syntax
Если расширения команд включены, используйте следующий синтаксис: If command extensions are enabled, use the following syntax:
Параметры Parameters
Параметр Parameter | Описание Description |
---|---|
not not | Указывает, что команда должна выполняться, только если условие имеет значение false. Specifies that the command should be carried out only if the condition is false. |
ERRORLEVEL errorlevel | Задает истинное условие, только если предыдущая программа, выполненная 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. |
Указывает команду, которая должна быть выполнена при выполнении предыдущего условия. Specifies the command that should be carried out if the preceding condition is met. | |
== | Задает истинное условие, только если строка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. |
существующие exist | Указывает истинное условие, если указанное имя файла существует. Specifies a true condition if the specified file name exists. |
Задает оператор сравнения из трех букв, включая: Specifies a three-letter comparison operator, including:
| |
/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. |
кмдекстверсион cmdextversion | Задает истинное условие, только если внутренний номер версии, связанный с компонентом расширения команд 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 defined | Указывает истинное условие, если переменная определена. Specifies a true condition if variable is defined. |
Задает команду командной строки и все параметры, которые будут переданы команде в предложении 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:
Чтобы отформатировать диск в диске а и вывести сообщение об ошибке при возникновении ошибки в процессе форматирования, введите в пакетный файл следующие строки: 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:
Чтобы удалить файл 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:
Эти строки можно объединить в одну строку следующим образом: These lines can be combined into a single line as follows:
Чтобы вывести значение переменной среды ERRORLEVEL после выполнения пакетного файла, введите в пакетный файл следующие строки: To echo the value of the ERRORLEVEL environment variable after running a batch file, type the following lines in the batch file:
Чтобы вернуться к метке «хорошо», если значение переменной среды ERRORLEVEL меньше или равно 1, введите: To go to the okay label if the value of the ERRORLEVEL environment variable is less than or equal to 1, type:
CMD — If exists
The below commands (with debug lines added — indented) should only redirect the echo’s output to a file, should it already exist, according to my understanding.
However, it would seem that if exist %test0% always fills the file (creating it if non-existant) with the echo’s output.
Does anyone know what is wrong?
And the file gets created(!)
EDIT: This above was a simplified example, and unfortunately MSalters answer doesn’t help me solve the full command (I had hoped it would). The full one line if statement is:
if exist %test0% (echo.&echo.&echo ————————————————-&echo.&echo.) else (set /p .= >%test0%&set errorlevel=0||set errorlevel=1
How would I have whichever condition of the if matched output to the file (Hopefully with only one reference to the file, i.e., not one in each if conditional), and have the errorlevel set based on the exist ance of the file?
Could anyone help with the actual full command issue?
2 Answers 2
You should never set ERRORLEVEL directly. That name is reserved for reporting on the results of the prior command. When you set the value directly, you override the intended functionality and it ceases to expand to the actual ERRORLEVEL, it expands to the value you set instead. That can break all kinds of code.
You can force the ERRORLEVEL to a value by running a command with known result, redirecting output to nul if necessary: ver >nul sets ERRORLEVEL to 0, set /p .= sets ERRORLEVEL to 1.
You can force the ERRORLEVEL to any particular value of your choosing by using cmd /c exit /b N , where N is an integral value.
You also have faulty logic. Your IF command succeeds (has no error) regardless whether the condition evaluates to TRUE or FALSE. If you want to set the ERRORLEVEL, then you need to do it within your parenthesized blocks.
There is nothing wrong with putting everything on one line, but I find the code easier to read when using multiple lines for complex statements like yours. I believe the following is what you are looking for.
Edit in response to comments