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

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

Методические рекомендации:

  • Одна особенность за ответ
  • Дайте краткое описание функции и пример, а не просто ссылку на документацию
  • Ограничение ответов на собственную функциональность, т. Е. Не требует дополнительного программного обеспечения, такого как Windows Resource Kit

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

(См. Также: Пакетные файлы Windows: .bat против.cmd?)

91 ответ

Решение

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

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 Explorer в папке "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 /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 - возвращает расширение файла
Так что если вы выполните скрипт 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\

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

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

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

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

Вывод (пакетный файл запускается с myBatch.bat)

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 ^| ^< ^> ^& ^\ ^^

Возможность запуска команд и обработки выходных данных (например, обратных символов '$()' в 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

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

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

PSKILL NOTEPAD >nul 2>&1

РЕДАКТИРОВАТЬ: см. Игнорирование вывода команды для объяснения того, как это работает.

PAUSE

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

Нажмите любую клавишу для продолжения.,,

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

Эквивалент 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.

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

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

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

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

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

echo.

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

if foo if bar baz

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

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

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

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

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

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

    @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

Просто введите команды, нажмите ввод для новой строки. Нажмите 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, но я собираюсь упомянуть ее еще раз, поскольку она очень мощная.

Ниже выводится текущая дата в формате ГГГГММДД, я использую ее при создании каталогов для резервных копий.

for /f "tokens=2-4 delims=/- " %a in ('DATE/T') do echo %c%b%a
Другие вопросы по тегам