Скрытые функции командных файлов Windows

Каковы некоторые из менее известных, но важных и полезных функций пакетных файлов Windows?

Руководство:

  • Одна функция для каждого ответа
  • Дайте краткое описание этой функции и пример, а не только ссылку на документацию
  • Ограничить ответы на родную funtionality, т.е. не требует дополнительного программного обеспечения, например, набора ресурсов Windows

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

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

Ответ 1

Продолжение линии:

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

Ответ 2

PUSHD path

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

POPD

Возвращает вас в каталог, из которого вы "нажали".

Ответ 3

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

C:\some_directory> start .

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

Я нашел это великолепным временем.

Ответ 4

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

REM blah blah blah

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

:: blah blah blah

Ответ 5

Переменные подстроки:

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

Ответ 6

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

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

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

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

Ответ 7

Вместо помех script с REM или:: строками, я делаю следующее в верхней части каждого script:

@echo OFF
goto :START

Description of the script.

Usage:
   myscript -parm1|parm2 > result.txt

:START

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

Ответ 8

Путь (с приводом), где script: ~ dp0

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

Ответ 9

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

@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\

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

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

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

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

Выход (файл batchfile запущен с myBatch.bat)

myBatch.bat
:test
:test
myBatch

Ответ 10

Используя 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.

Ответ 11

Sneaky трюк, чтобы подождать 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

Ответ 12

Выход из "сантехники":

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

Ответ 13

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

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

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

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

Ответ 14

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

> copy nul filename.ext

Ответ 15

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

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

PSKILL NOTEPAD >nul 2>&1

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

Ответ 16

PAUSE

Останавливает выполнение и выводит следующую подсказку:

Press any key to continue . . .

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

Ответ 17

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

echo -n Hello # or
echo Hello\\c

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

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

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

<nul просто передает пустой ответ команде set /p, поэтому итоговым результатом является строка испускаемого приглашения. (Используемая переменная остается неизменной из-за пустого ответа.)

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

Ответ 18

Поиск и замена при настройке переменных среды:

> @set fname=%date:/=%

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

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

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

Ответ 19

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

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

Ответ 20

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

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

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

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

Ответ 21

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

echo.

Ответ 22

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

if foo if bar baz

Ответ 23

Чтобы быстро преобразовать текстовый файл Unicode (16 бит / char) в файл ASCII DOS (8 бит /char).

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

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

Ответ 24

если структура блока:

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

Ответ 25

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

    @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

Ответ 26

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

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

Ответ 27

пример вычитания строк на date и time, чтобы получить файл с именем "YYYY-MM-DD HH: MM: SS.txt"

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

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

цвет XY

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

цвет Z

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

для имен цветов вызывают

цвет?

Ответ 28

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

copy con test.bat

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

Ответ 29

Общий контроль над выходом с помощью символов пробела и пробела.:

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

Ответ 30

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

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

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