Скрытые возможности пакетных файлов 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
Не уверен, насколько это было бы полезно в пакета файл, но это очень удобная команда для использования в командной строке:
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 уже упоминалась, но на самом деле это больше:
символ(Ы) после ~ определяет информацию, которая извлекается.
Ни одна буква не приводит к возвращению имени файла исправления
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
возможность запускать команды и обрабатывать выходные данные (например, 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
чтобы скрыть все выходные данные из команды 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%
разделители команд:
cls & dir
copy a b && echo Success
copy a b || echo Failure
во второй строке команда после & & запускается только в том случае, если первая команда выполнена успешно.
в 3-й строке команда после | / выполняется только в случае сбоя первой команды.
вы можете связать операторы 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