Перейти к главному содержимому

Windows Batch files

Файлы с тем же путём, где расположен сам bat-файл

@echo off
:: Path to this file itself
set PP=%~dp0
:: Do something on file *doc.txt* which saved in the same folder
do something %PP%doc.txt %*

Файлы с тем же именем, но другим расширением (или без него), что и сам bat-файл

Например, такой bat-файл подходит для запуска bash-скрипта с тем же именем, но без расширения:

@echo off
set NM=%~n0
bash %NM% %*

Файлы с тем же путём и с тем же именем, что вызывающий bat-файл

@echo off
set PP=%~dp0
set NM=%~n0
:: Run python script with same name as .bat file
python %PP%%NM%.py %*

Пробел в конце переменной

Создать пустую переменную и через пробел подставить её в другую переменную.

set EMPTY=
set NINJA_STATUS=[%%p %%f/%%t] %EMPTY%

ninja %*

Выйти из файла если возникла ошибка в команде

command || echo ERROR && exit /b %errorlevel%

Функции

@echo off
SETLOCAL
CALL :MyFunction 55 , 1
EXIT /B %ERRORLEVEL%

:MyFunction
echo The value of parameter 1 is %~1
echo The value of parameter 2 is %~2
EXIT /B 0

Обработка параметров

Если запустить for /? в командной строке, то там будет, в том числе, описание расширенной обработки параметров. Частично эти сведения уже использованы в примерах выше. Цитата:

Операции подстановки ссылок на переменные команды FOR
также расширены. Допускается применение следующих
синтаксических конструкций:

    %~I         - из переменной %I удаляются обрамляющие кавычки (")
    %~fI        - переменная %I расширяется до полного имени файла
    %~dI        - из переменной %I выделяется только имя диска
    %~pI        - из переменной %I выделяется только путь к файлу
    %~nI        - из переменной %I выделяется только имя файла
    %~xI        - из переменной %I выделяется расширение имени файла
    %~sI        - полученный путь содержит только короткие имена
    %~aI        - переменная %I расширяется до атрибутов файла
    %~tI        - переменная %I расширяется до даты /времени файла
    %~zI        - переменная %I расширяется до размера файла
    %~$ПУТЬ:I   - проводится поиск по каталогам, заданным в
                         переменной среды ПУТЬ, и переменная %I
                         заменяется на полное имя первого найденного
                         файла.  Если переменная ПУТЬ не определена или
                          в результате поиска не найден ни один файл,
                          то этот модификатор заменяется на пустую
                          строку.

При объединении нескольких операторов можно получить
следующие результаты:

    ~dpI       - переменная I раскрывается в имя диска и путь
    ~nxI       - переменная I раскрывается в имя файла и его
                       расширение
    ~fsI        - переменная I раскрывается в полный путь с
                       короткими именами
    ~dp$ПУТЬ:I - проводится поиск по каталогам, заданным в
                       переменной среды ПУТЬ, и переменная I
                       раскрывается в имя диска и путь к первому
                       найденному файлу.
    ~ftzaI     - переменная I раскрывается в строку, подобную
                       выдаваемой командой DIR


В приведенных выше примерах переменные I и ПУТЬ можно
заменить на другие допустимые значения. Синтаксическая
конструкция с символами ~ заканчивается допустимым именем
переменной цикла FOR.
Для имен переменных рекомендуется использовать заглавные
буквы, например, I, что делает эту конструкцию более удобной
для чтения и предотвращает ошибочное принятие их за
модификаторы, которые не различают регистр.

Полезные ссылки: https://dl.gsu.by/doc/use/ntcmds.htm, https://github.com/Lifailon/Batch-Commands