Exist bat if: windows — How to check if a file exists from inside a batch file

bat if · GitHub

Оператор условного выполнения команд в пакетном файле.
IF [NOT] ERRORLEVEL число команда
IF [NOT] строка1==строка2 команда
IF [NOT] EXIST имя_файла команда
NOT Обращает истинность условия: истинное условие
становится ложным, а ложное — истинным.
ERRORLEVEL число Условие является истинным, если код возврата последней
выполненной программы не меньше указанного числа.
строка1==строка2 Это условие является истинным, если указанные строки
совпадают.
EXIST имя_файла Это условие является истинным, если файл с указанным
именем существует.
команда Задает команду, выполняемую при истинности условия.
За этой командой может следовать ключевое слово 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 применяется подобно условию EXISTS, но принимает в качестве
аргумента имя переменной среды и возвращает истинное значение, если эта
переменная определена.
Строка %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; в подобном случае подставляется
значение этой переменной.

5 операторов IF для использования в более интеллектуальных пакетных сценариях Windows

Если вы много работаете с пакетными файлами Windows, оператор IF предлагает очень мощный способ повысить гибкость ваших сценариев.

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

Если вы готовы начать писать сценарии, давайте начнем.

1. Сравните значения

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

Допустим, вы хотите написать пакетный сценарий, который ежедневно проверяет размер жесткого диска вашего компьютера. Если он меньше 3 ГБ, вы хотите получить отчет по электронной почте с надписью «На жестком диске слишком мало места».

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

 @echo off 
set DriveLimit=300000000
for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value`) do set FreeSpace=%%x
Echo FreeSpace="%FreeSpace%"
Echo Limit="%DriveLimit%"
If %FreeSpace% GTR %DriveLimit% (
 Echo Достаточно свободного места.
) else (
 Echo Недостаточно свободного места пробел
)

В сценарии WMIC — это компонент Windows Management Instrumentation (WMI), который поставляется с набором команд, которые можно использовать для получения информации с ПК.

Вот как команда «wmic» в этом скрипте вызывает пространство логического диска и помещает его в переменную FreeSpace .

Теперь вы можете просто заменить строку Echo Недостаточно свободного места командой для отправки вам оповещения по электронной почте. Настройте скрипт на ежедневный запуск.

2. Сравнение строк

Еще одно ценное сравнение IF, которое вы можете выполнить в пакетном задании, — это сравнение строк.

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

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

Вот как выглядит этот скрипт:

 @echo off 
for /f "tokens=4-5 delims=. " %%i in ('ver') do set VERSION=%%i.%%j
if "%version%" == "6.0" эхо Windows Vista.
, если "%version%" == "6.1" echo Windows 7
, если "%version%" == "6.2" echo Windows 8
, если "%version%" == "6.3" echo Windows 8.1
if "%version%" == "10.0" echo Windows 10.

Вот как выглядит вывод этого скрипта:

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

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

3. Проверка существования файла

Другая полезная ситуация, когда оператор IF в пакетном файле проверяет наличие файла данных.

Во многих случаях пакетное задание является просто инструментом мониторинга, который можно запланировать для проверки новых входящих файлов данных в определенном каталоге. Затем вы можете либо скопировать этот файл в другое место, либо запустить какой-либо сценарий Windows, который преобразует файл в вывод Excel.

С помощью пакетного файла можно быстро и легко проверить, существует ли файл в каталоге. Вот как выглядит этот сценарий:

 @echo off 
если существует c:\temp\datafile.txt (
 %WINDIR%\SysWOW64\cmd.exe
 cscript LoadToExcel.vbs
) else (
 rem файл не существует
)

Сравнение ЕСЛИ СУЩЕСТВУЕТ полезно во многих случаях.

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

4. Проверить, если команда завершилась неудачно

Один из аспектов написания сценариев пакетных файлов, которым пользуются очень немногие ИТ-специалисты или программисты, — это проверка на наличие ошибок.

Существует множество пакетных заданий, выполняющих важные ИТ-задачи, такие как резервное копирование важных файлов или выполнение операций копирования файлов. Когда эти пакетные задания терпят неудачу, системы выходят из строя, и люди обычно это замечают.

Гораздо разумнее получать оповещения, когда пакетное задание не выполнило команду до того, как люди это заметят. Таким образом, вы можете заранее решить проблему.

Это можно сделать, используя переменную %errorlevel%, которую большинство приложений и команд возвращают после запуска. Все, что вам нужно сделать, это следовать вашей команде с помощью ЕСЛИ %ERRORLEVEL% команда.

 @echo off 
xcopy C:\somefolder E:\backupfolder
IF %ERRORLEVEL% NEQ 0

Если приложение или команда возвращает ноль, все в порядке. Если нет, то вам нужно отправить себе электронное письмо.

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

Кроме того, если вы предпочитаете использовать оператор IF для проверки конкретных кодов ошибок, Windows предлагает довольно обширный список кодов системных ошибок.

5. Проверка отсутствия параметров

Последний полезный оператор IF предназначен не для конкретной команды, а для проверки того, что сценарий получил соответствующие входные параметры.

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

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

 @echo off 
IF [%1]==[] (
GOTO sub_message
) ELSE (
xcopy %1 E:\backupfolder
)
GOTO eof
:sub_message
echo Вы забыли указать свой путь.
:eof

Если вы никогда раньше не использовали параметры с пакетными сценариями, символ процента, за которым следует число, представляет переменную параметра. %1 — первый параметр, %2 — второй и т. д.

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

Пакетные задания могут быть мощными

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

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

«если не существует» с «goto» не работает (просто пропускает) и вариант «else» тоже не работает (пакетный файл Windows)

Я пытаюсь создать команды в пакетном файле, где, если определенный Файл nVidia существует, он будет кодировать видео с помощью видеокарты, но если этого файла nVidia нет, он переходит к другой метке, чтобы использовать другую команду.

Это не переходит к метке :SOFTWARE_ENCODE , если nvcuda.dll не существует в расположении:

, если существует "%SYSTEMDRIVE%\Windows\System32\nvcuda.dll" перейти к :NVIDIA_ENCODE
если не существует "%SYSTEMDRIVE%\Windows\System32\nvcuda.dll", перейдите к: SOFTWARE_ENCODE
 

Если nvcuda.dll существует, то описанное выше работает, и он переходит к метке :NVIDIA_ENCODE .

Я погуглил и увидел, что кто-то решил эту проблему, используя else со скобками, но это тоже не работает:

, если существует "%SYSTEMDRIVE%\Windows\System32\nvcuda.dll" (перейдите к NVIDIA_ENCODE), иначе перейдите к SOFTWARE_ENCODE
 

Тот же результат, кажется, просто пропустить остальную часть командного файла, если nvcuda. dll не существует.

Я знаю, что кодирование nVidia и программное кодирование работают для кодирования видео, потому что я закомментировал , если существует , и , если не существует частей, тестируя каждую (ffmpeg) команду кодирования по отдельности.

(я переименовываю nvcuda.dll в «.bak» при тестировании программного кодирования).

Я помню, что это происходило в прошлом, и понятия не имею, почему он игнорирует перейти к , если используется с , если не существует .

Приветствуется любое решение.

РЕДАКТИРОВАТЬ: Вот весь командный файл…

 если не DEFINED IS_MINIMIZED установите IS_MINIMIZED=1 && start "" /min "%~dpnx0" %* && exit
:: ------------------------------------------------ ------------------------------
:: Эта часть меняет местами первые и последние 4 символа...
:: (Это обрабатывает все файлы в подпапках, но я хочу, чтобы он обрабатывал только файлы рядом с пакетным файлом). > !secondfour!!firstfour!!имя файла:~8!%%~xf
ren %%f !secondfour!!firstfour!!имя файла:~8!%%~xf
)
установить / индекс = 1
:: ------------------------------------------------ ------------------------------
:: Эта часть переименовывает файлы 001, 002, 003 и так далее.
для /r %%i в (*.mp4) сделать (
    rem, если число меньше 10, добавить 9к имени файла
    если !Индекс! меньше 10 (
        переименуйте "%%i" 00"!Index!.mp4"
    ) еще (
        переименовать "%%i" "0!Index!.mp4"
    )
    
    установить / индекс + = 1
)
:: ------------------------------------------------ ------------------------------
:: Удалить ненужные файлы...
дель "*.LRV"
удалить "*.THM"
:: ------------------------------------------------ ------------------------------
rem Создать папку TEMP для файлов, которые будут созданы в...
если не существует "TEMP" md "TEMP"
:: ------------------------------------------------ ------------------------------
:: Используйте nVidia для кодирования, если этот файл драйвера установлен. ..
:: Не работает, но будет работать, если есть nvcuda.dll...
:: если существует %SYSTEMDRIVE%\Windows\System32\nvcuda.dll (перейдите к NVIDIA_ENCODE), иначе перейдите к SOFTWARE_ENCODE
:: Исходные строки тоже не работают...
если существует "%SYSTEMDRIVE%\Windows\System32\nvcuda.dll", перейдите к :NVIDIA_ENCODE
если не существует "%SYSTEMDRIVE%\Windows\System32\nvcuda.dll", перейдите к: SOFTWARE_ENCODE
:: ------------------------------------------------ ------------------------------
:: Конвертировать в 1080p...
:NVIDIA_ENCODE
rem Конвертировать видеофайлы...
FOR /F "tokens=*" %%G IN ('dir /b *.mp4') DO start /wait /min ffmpeg.exe -y -i "%%G" -vcodec hevc_nvenc -vf scale=1920:-2,fps=23.976 -b:v 4000k -acodec aac -b:a 192k -ar 44100 -ac 2 "TEMP\%%~nG.mp4" -hide_banner
перейти к : JOIN_FILES
:ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ_ENCODE
rem Конвертировать видеофайлы...
FOR /F "tokens=*" %%G IN ('dir /b *.mp4') DO start /wait /min ffmpeg.exe -y -i "%%G" -vcodec libx265 -vf scale=1920:- 2,fps=23.976 -b:v 4000k -acodec aac -b:a 192k -ar 44100 -ac 2 "TEMP\%%~nG. mp4" -hide_banner
перейти к : JOIN_FILES
:: ------------------------------------------------ ------------------------------
:: Объединить файлы в одно видео...
:JOIN_FILES
(для %%i в (TEMP\*.mp4) выполните команду @echo file '%%i') > mp4_file_list.txt
Для %%a IN ("TEMP\*.mp4") НЕОБХОДИМО установить "mp4file=%%~na"
start /wait/min ffmpeg.exe -y -f concat -safe 0 -i mp4_file_list.txt -c копировать "%mp4file%_JOINED.mp4" -hide_banner
дел mp4_file_list.txt
:: ------------------------------------------------ ------------------------------
:: Удалить папку TEMP...
rd /s /q "TEMP\"
:: ------------------------------------------------ ------------------------------
:: Переименуйте файл "*_JOINED.mp4", указав сегодняшнюю дату и "- GoPro Video" в конце.
:: (Метод датирования соответствует формату: ГГГГ-ММ-ДД) [Может не работать в системах, отличных от Великобритании]
Для /f "tokens=1-3 delims=/" %%a in ('date/t') do (set mydate=%%c-%%b-%%a)
ren "*_JOINED.mp4" "%mydate% - GoPro Video.mp4"
:: Создайте папку «Конвертированное видео» и переместите в нее только что преобразованный видеофайл. 
если не существует "Конвертированное видео" md "Конвертированное видео"
MOVE /Y "%mydate% - GoPro Video.mp4" "Конвертированное видео"
:: ------------------------------------------------ ------------------------------
:: Переименуйте все старые файлы обратно в mp4, которые были перемещены/переименованы в начале...
для /r %%x в (*.S6C8JHVh3E7L4BX9) сделать ren "%%x" *.mp4
:: ------------------------------------------------ ------------------------------
:: Открыть папку с готовым видео...
проводник "Конвертированное видео"
:: ------------------------------------------------ ------------------------------
Выход
 

Если я запущу это самостоятельно с MP4 в папке, то это сработает:

 :: -------------------------- -------------------------------------------------- --
:: Используйте nVidia для кодирования, если этот файл драйвера установлен...
если существует "%SYSTEMDRIVE%\Windows\System32\nvcuda.dll", перейдите к :NVIDIA_ENCODE
если не существует "%SYSTEMDRIVE%\Windows\System32\nvcuda.