Скрытые возможности пакетных файлов 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
Возможность запуска команд и обработки выходных данных (например, обратных символов '$()' в bash).
for /f %i in ('dir /on /b *.jpg') do echo --^> %i
Если в именах файлов есть пробелы, используйте это:
for /f "tokens=*" %i in ('dir /on /b *.jpg') do echo --^> %i
Чтобы скрыть весь вывод команды перенаправить на>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%
Разделители команд:
cls & dir
copy a b && echo Success
copy a b || echo Failure
Во 2-й строке команда после && выполняется только в том случае, если первая команда выполнена успешно.
На 3-й строке команда после || запускается только в случае сбоя первой команды.
Вы можете соединять операторы 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