Скрытые возможности пакетных файлов Windows

что некоторые из меньших знают, но важные и полезные функции пакетных файлов Windows?

рекомендации:

  • одна функция на ответ
  • дайте оба коротких описание функции и пример, а не просто ссылку на документацию
  • ограничить ответы родной funtionality, т. е. не требует дополнительного программного обеспечения, как Ресурс Windows Кит!--17-->

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

(см. также: пакетные файлы Windows: .bat vs .cmd?)

30 ответов


продолжения строки:

call C:\WINDOWS\system32\ntbackup.exe ^
    backup ^
    /V:yes ^
    /R:no ^
    /RS:no ^
    /HC:off ^
    /M normal ^
    /L:s ^
    @daily.bks ^
    /F daily.bkf

PUSHD path

доставит вас в каталог, указанный путь.

POPD

возвращает вас в каталог "отодвинули" от.


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

C:\some_directory> start .

Это откроет проводник Windows в папке "some_directory".

Я нашел это большой экономии времени.


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

REM blah blah blah

легче читать:

:: blah blah blah

переменной строки:

> set str=0123456789
> echo %str:~0,5%
01234
> echo %str:~-5,5%
56789
> echo %str:~3,-3%
3456

команда FOR! Хотя я ненавижу писать пакетные файлы, я благодарен за это.

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

будет анализировать каждую строку в myfile.txt, игнорируя строки, начинающиеся с точки с запятой, передавая 2-й и 3-й токены из каждой строки в тело for, с токенами, разделенными запятыми и / или пробелами. Обратите внимание на ссылку на операторы for body %i для получения 2-го маркера, %j для получения 3-го маркера и %k для получения всех оставшихся маркеров после 3-го.

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


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

@echo OFF
goto :START

Description of the script.

Usage:
   myscript -parm1|parm2 > result.txt

:START

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


путь (с диском), где находится скрипт: ~dp0

set BAT_HOME=%~dp0
echo %BAT_HOME%
cd %BAT_HOME%

часть %~dp0 уже упоминалась, но на самом деле это больше: символ(Ы) после ~ определяет информацию, которая извлекается.
Ни одна буква не приводит к возвращению имени файла исправления
d-возвращает букву диска
p-возвращает путь
s-возвращает короткий путь
x-возвращает расширение файла
Поэтому, если вы выполните тест сценария.летучая мышь ниже c:\Temp\long dir name\ folder,

@echo off
echo %0
echo %~d0
echo %~p0
echo %~dp0
echo %~x0
echo %~s0
echo %~sp0

вы получаете следующие вывод

test
c:
\Temp\long dir name\
c:\Temp\long dir name\
.bat
c:\Temp\LONGDI~1\test.bat
\Temp\LONGDI~1\

и если параметр передается в ваш скрипт как
тест c:\temp\mysrc\test.cpp
те же манипуляции можно выполнить с переменной %1.

но результат расширения %0 зависит от местоположения!
На "верхнем уровне" пакета он расширяется до текущего имени файла пакета.
В функции (вызове) она расширяется до имени функции.

@echo off
echo %0
call :test
goto :eof

:test
echo %0
echo %~0
echo %~n0

выход (batchfile начали с myBatch.летучая мышь )

myBatch.bat
:test
:test
myBatch

используя CALL, EXIT / B, SETLOCAL & ENDLOCAL, вы можете реализовать подпрограммы с локальными переменными.

пример:

@echo off

set x=xxxxx
call :sub 10
echo %x%
exit /b

:sub
setlocal
set /a x=%1 + 1
echo %x%
endlocal
exit /b

выводит

11
xxxxx

хотя: sub изменяет x.


подлый трюк, чтобы ждать N секунд (не является частью cmd.exe, но не является дополнительным программным обеспечением, поскольку он поставляется с Windows), см. строку ping. Вам нужно N+1 пинг, так как первый пинг выходит без задержки.

    echo %time%
    call :waitfor 5
    echo %time%
    goto :eof
:waitfor
    setlocal
    set /a "t = %1 + 1"
    >nul ping 127.0.0.1 -n %t%
    endlocal
    goto :eof

побег "сантехника":

echo ^| ^< ^> ^& ^\ ^^

возможность запускать команды и обрабатывать выходные данные (например, backticks '$()' в bash).

for /f %i in ('dir /on /b *.jpg') do echo --^> %i

Если в именах файлов есть пробелы, используйте это:

for /f "tokens=*" %i in ('dir /on /b *.jpg') do echo --^> %i

создание пустого файла:

> copy nul filename.ext

чтобы скрыть все выходные данные из команды redirect в >nul 2>&1.

например, некоторые программы командной строки отображают выходные данные, даже если вы перенаправляете на >nul. Но, если вы перенаправляете вывод, как строка ниже, все выходные данные будут подавлены.

PSKILL NOTEPAD >nul 2>&1

редактировать: см.игнорирование вывода команды для объяснения того, как это работает.


PAUSE

останавливает выполнение и отображает следующее приглашение:

Press any key to continue . . .

полезно, если вы хотите запустить пакет, дважды щелкнув его в Проводнике Windows и хотите фактически увидеть вывод, а не просто вспышку окна команды.


эквивалент bash (и других оболочек)

echo -n Hello # or
echo Hello\c

на выходе "Hello" без завершающего символа новой строки. Взлом cmd для этого:

<nul set /p any-variable-name=Hello

set /p это способ запросить пользователя для ввода. Он выдает заданную строку, а затем ждет (в той же строке, т. е. без CRLF), чтобы пользователь ввел ответ.

<nul просто трубы пустой ответ на , в результате излучаемый строку запроса. (Используемая переменная остается неизменным из-за пустого ответа.)

проблемы: невозможно вывести ведущий знак равенства, а на Vista ведущие пробелы удаляются, но не на XP.


поиск и замена при установке переменных окружения:

> @set fname=%date:/=%

...удаляет " / " из даты для использования в именах файлов с временной меткой.

и подстрок тоже...

> @set dayofweek=%fname:~0,3%

целочисленная арифметика:

> SET /A result=10/3 + 1
4

разделители команд:

cls & dir
copy a b && echo Success
copy a b || echo Failure

во второй строке команда после & & запускается только в том случае, если первая команда выполнена успешно.

в 3-й строке команда после | / выполняется только в случае сбоя первой команды.


выведите пустую строку:

echo.

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

if foo if bar baz

для быстрого преобразования текстового файла Unicode (16bit/char) в файл ASCII DOS (8bit / char).

C:\> type unicodeencoded.txt > dosencoded.txt

в качестве бонуса, если это возможно, символы отображаются правильно.


если блочную структуру:

if "%VS90COMNTOOLS%"=="" (
  echo: Visual Studio 2008 is not installed
  exit /b
)

отложенное расширение переменных (с подстроками, брошенными для хорошей меры):

    @echo off
    setlocal enableextensions enabledelayedexpansion
    set full=/u01/users/pax
:loop1
    if not "!full:~-1!" == "/" (
        set full2=!full:~-1!!full2!
        set full=!full:~,-1!
        goto :loop1
    )
    echo !full!
    endlocal

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

@title Searching for ...
:: processing search
@title preparing search results
:: data processing

нет редактора под рукой и нужно создать пакетный файл?

copy con test.bat

просто введите команды, нажмите enter для новой строки. Нажмите Ctrl-Z и Enter, чтобы закрыть файл.


пример вычитания строки на date и time чтобы получить файл с именем " гггг-ММ-ДД чч: мм: СС.txt"

echo test > "%date:~0,4%-%date:~5,2%-%date:~8,2% %time:~0,2%_%time:~3,2%_%time:~6,2%.txt"

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

цвет XY

где X и Y-шестнадцатеричное значение из 0 в F, где X-фон, Y-текст, когда x = y цвет не изменится.

цвета Z

изменяет цвет текста на " Z "и устанавливает черный фон," цвет 0 " не будет работать

для названий цветов звоните

цвета ?


полный контроль над выходом с интервалом и escape-символами.:

echo.    ^<resourceDir^>/%basedir%/resources^</resourceDir^>

TheSoftwareJedi уже упоминал команду for, но я собираюсь упомянуть ее снова, поскольку она очень мощная.

следующие выходные данные текущей даты в формате YYYYMMDD, я использую это при создании каталогов для резервных копий.

for /f "tokens=2-4 delims=/- " %a in ('DATE/T') do echo %c%b%a