Несколько команд в одной строке, полезной во многих ситуациях:
& Используемый для объединения двух команд, выполняет command1 и затем command2
& & условная комбинация, выполняет command2, если command1 завершается успешно
, В ¦ В ¦ Command2 выполняется, только если command1 не завершается успешно.
Примеры:
:: ** Edit the most recent .TXT file and exit, useful in a .CMD / .BAT **
FOR /F %%I IN ('DIR *.TXT /B /O:-N') DO NOTEPAD %%I & EXIT
:: ** If exist any .TXT file, display the list in NOTEPAD, if not it
:: ** exits without any error (note the && and the 2> error redirection)
DIR *.TXT > TXT.LST 2> NUL && NOTEPAD TXT.LST
Здесь, как создать ПУТЬ К КЛАССУ путем сканирования данного каталога.
setlocal ENABLEDELAYEDEXPANSION
if defined CLASSPATH (set CLASSPATH=%CLASSPATH%;.) else (set CLASSPATH=.)
FOR /R .\lib %%G IN (*.jar) DO set CLASSPATH=!CLASSPATH!;%%G
Echo The Classpath definition is %CLASSPATH%
работы в XP (или лучше). С W2K необходимо использовать несколько Bat-файлов для достижения того же результата (см. , Включают все банки в определение пути к классу).
Это не нужно для 1,6, так как можно определить подстановочный знак непосредственно в ПУТИ К КЛАССУ (напр. - CP ".\lib*").
/c param для cmd.exe сам, говорит ему работать и затем делать эти команды.
я раньше делал часто:
win+r, ВОЗВРАТ cmd, ping google.com ВОЗВРАТ
, но теперь я просто делаю:
win+r, cmd/c проверяют с помощью ping-запросов google.com ВОЗВРАТ
намного быстрее. также полезный при использовании pstools и Вы хотите использовать psexec, чтобы сделать некоторую функцию командной строки на удаленной машине.
РЕДАКТИРОВАНИЕ: Работы/k то же, но листы открытая подсказка. Это могло бы пригождаться чаще.
Я нахожу простоту, с которой можно перенаправить вывод команд в чрезвычайно полезные файлы:
DIR *.txt > tmp.txt
DIR *.exe >> tmp.txt
Одиночная стрелка создает или перезаписывает файл, двойная стрелка добавляет к нему. Теперь я могу открыть tmp.txt в своем текстовом редакторе и сделать все виды хорошего материала.
правильный формат для циклов с числовыми переменными
for /l %%i in (startNumber, counter, endNumber) do echo %%i
[еще 113] детали> http://www.ss64.com/nt/for.html
ВЫБОР командные строки пользователь для одной из нескольких опций (через единственное нажатие клавиши)
@echo off
echo Please choose one of the following options
echo 1. Apple
echo 2. Orange
echo 3. Pizza
echo a, b, c. Something else
choice /c:123abc /m "Answer?"
set ChoiceLevel=%ErrorLevel%
echo Choice was: %ChoiceLevel%
%ChoiceLevel%
будет энной выбранной опцией (в вышеупомянутом примере, b=5
).
Для парсинга stdin из сценария Вы нуждаетесь в том приеме с ДЛЯ и НАХОДИТЕ команды:
for /f "tokens=*" %%g in ('find /V ""') do (
:: do what you want with %%g
echo %%g
)
Перенаправление произвело к консоли, даже если вывод пакета уже перенаправляется в файл через > con
синтаксис.
Пример: foo.cmd:
echo a
echo b > con
Вызов:
foo.cmd > output.txt
Это приведет к "a"
движение к output.txt
все же "b"
движение к консоли.
SHIFT
Это - способ выполнить итерации через переменное количество аргументов, переданных в сценарий (или подпрограмма) на командной строке. В его самом простом использовании это смещается %2, чтобы быть %1, %3, чтобы быть %2, и так далее. (Можно также передать в параметре SHIFT для пропуска нескольких аргументов.) Это делает команду "разрушительной" (т.е. %1 уходит навсегда), но она позволяет Вам избегать жесткого кодирования максимальное количество поддерживаемых аргументов.
Вот короткий пример для обработки параметров командной строки по одному:
:ParseArgs
if "%1"=="" (
goto :DoneParsingArgs
)
rem ... do something with %1 ...
shift
goto :ParseArgs
:DoneParsingArgs
rem ...
Опция подкаталога на 'удаляет каталог':
rd /s /q junk
Быстрый режим редактирования в cmd.exe является моим фаворитом. Это немного вне темы, но при взаимодействии с командным процессором это может быть спаситель. Нет, я не являюсь гиперболическим - Вы будете только видеть caret-capitol-v определенное число времен перед смертью; чем больше Вы видите, тем быстрее Вы умираете.
(Можно установить это от UI также, который является, вероятно, лучшим путем. См. комментарии для инструкций. Также существует хороший один сценарий строки, чтобы сделать это также.)
Теперь, для копирования, просто щелкают левой кнопкой и перетаскивают, чтобы выбрать и щелкнуть правой кнопкой для копирования. Для вставки просто щелкните правой кнопкой.
[еще 117] ^V^V^V^V^V^V^V^V^V^V^V^V^V^V!!!
Дерьмо, я думаю, что просто уничтожил кого-то. Извините!
Подпрограммы (выводы 42):
@echo off
call :answer 42
goto :eof
:do_something
echo %1
goto :eof
и подпрограммы, возвращая значение (выводы 0, 1, 2, и так далее):
@echo off
setlocal enableextensions enabledelayedexpansion
call :seq_init seq1
:loop1
if not %seq1%== 10 (
call :seq_next seq1
echo !seq1!
goto :loop1
)
endlocal
goto :eof
:seq_init
set /a "%1 = -1"
goto :eof
:seq_next
set /a "seq_next_tmp1 = %1"
set /a "%1 = %seq_next_tmp1% + 1"
set seq_next_tmp1=
goto :eof
Относительно использования ::
вместо REM
для комментариев: будьте осторожны! ::
особый случай маркировки ВЫЗОВА, которая действует как комментарий. Когда используется в скобках, например, в ДЛЯ или ЕСЛИ цикл, функция преждевременно выйдет. Очень печальный для отладки!
См. http://www.ss64.com/nt/rem.html для полного описания.
(добавляющий как новый ответ вместо комментария к первое упоминание об этом выше , потому что я еще не достоин комментария:0)
Поиск исполняемого файла на пути (или другая подобная пути строка при необходимости):
c:\> for %i in (cmd.exe) do @echo. %~$PATH:i
C:\WINDOWS\system32\cmd.exe
c:\> for %i in (python.exe) do @echo. %~$PATH:i
C:\Python25\python.exe
c:\>
Можно использовать вызов для оценки имен позже, ведя к некоторым полезным свойствам.
call set SomeEnvVariable_%extension%=%%%somevalue%%%
Используя вызов для установки переменных, имена которых зависят от других переменных. Если используется с некоторыми переменными правилами именования, можно эмулировать сборы данных как массивы или словари при помощи тщательных правил именования. Тройной % вокруг somevalue так, это оценит к одному имени переменной, окруженному единственным % после вызова и прежде чем набор будет вызван. Это означает, что два % подряд выходят вниз к единственному символу %, и затем он развернет его снова, таким образом, somevalue будет эффективно указателем имени.
call set TempVar=%%SomeEnvVariable_%extension%%%
Используя его с временной переменной для получения значения, которое можно тогда использовать в логике. Это самое полезное, когда используется в сочетании с задержанным переменным расширением.
Для использования этого метода правильно задержанное переменное расширение должно быть включено. Поскольку это прочь по умолчанию, лучше включать его в рамках сценария путем помещения этого как одной из первых инструкций:
setlocal EnableDelayedExpansion
Я бы сказал, что DEBUG.EXE - ОЧЕНЬ полезная и ОЧЕНЬ малоиспользуемая функция пакетных файлов.
Команда DEBUG позволяет ...
Короче говоря, этот инструмент ОЧЕНЬ мощный. В наши дни она, возможно, мало используется, но возможность вызова и управления этой функцией из пакетного сценария добавляет ошеломляющие возможности пакетному сценарию.
ПРИМЕЧАНИЕ. Microsoft удалила эту команду из 64-разрядных версий Windows. Xp и Vista и намеревается полностью удалить его из Windows 7, насколько я слышал.
В наши дни многие люди используют GOTO: EOF для завершения работы своих командных файлов, но вы также можете использовать EXIT / B для этой цели.
Преимущество использования EXIT / B заключается в том, что вы можете добавить уровень ошибки после EXIT / B, и он выйдет с этим уровнем ошибки.
Локальные переменные все еще анализируются для строки, которую использует ENDLOCAL. Это позволяет использовать такие приемы, как:
ENDLOCAL & SET MYGLOBAL=%SOMELOCAL% & SET MYOTHERGLOBAL=%SOMEOTHERLOCAL%
Это полезный способ передачи результатов в вызывающий контекст. В частности,% SOMELOCAL% выходит из области видимости, как только ENDLOCAL завершается, но к тому времени% SOMELOCAL% уже развернут, поэтому MYGLOBAL назначается в вызывающем контексте с локальной переменной.
По той же причине, если вы решите что нужно сделать:
ENDLOCAL & SET MYLOCAL=%MYLOCAL%
Вы обнаружите, что ваша новая переменная MYLOCAL теперь используется как обычная переменная среды, а не как локализованная переменная, которую вы, возможно, планировали использовать.
Удобный трюк, когда вы хотите копировать файлы между ветвями:
C:\src\branch1\mydir\mydir2\mydir3\mydir4>xcopy %cd:branch1=branch2%\foo*
Overwrite C:\src\branch1\mydir\mydir2\mydir3\mydir4\foo.txt (Yes/No/All)? y
C:\src\branch2\mydir\mydir2\mydir3\mydir4\foo.txt
Здесь используется как переменная среды% cd%, так и подстановка переменной среды.
Вы можете использовать уровень ошибок, чтобы проверить, доступна ли данная программа в системе (текущий каталог или путь), где будет запускаться ваш пакетный файл. Чтобы это работало, программа, которую вы тестируете, должна запуститься, выйти и установить код выхода, когда это произойдет. В примере, который я использую -? в качестве аргумента для myExe большинство программ CLI имеют аналогичный аргумент, такой как -h, --help, -v и т. д., это гарантирует, что он просто запускается и завершает работу, оставляя или устанавливая уровень ошибки 0
myExe -? >nul 2>&1
Set errCode=%errorlevel%
@if %errCode% EQU 0 (
echo myExe -? does not return an error (exists)
) ELSE (
echo myExe -? returns an error (does not exist)
)
Да, вы можете проверить уровень ошибок напрямую вместо того, чтобы назначать его errCode, но таким образом у вас могут быть команды между тестом и условием, и вы повторно проверяете условие по мере необходимости.
Позволяет Вам изменять каталог на основе переменной среды, не имея необходимость указывать директиву '%'. Если указанная переменная не существует, затем пробуют имя каталога.
@if defined %1 (call cd "%%%1%%") else (call cd %1)
Этот пакетный файл работает оба с простым каталоги, файлов а также как параметры командной строки (можно смешать их в любом порядке). Цикл выполняет команду ('эхо' в этом примере) на любом указанном файле, если параметр является каталогом, это выполняет команду рекурсивно на каждом файле в нем.
@echo off
for /f "delims=" %%f in ('dir %* /a-d /b /s') do echo %%f
Очень старое (приблизительно 1990) обманывает для получения общего размера переменных среды:
set > test
dir test
del test
При использовании расширения команды опции оболочки в сценарии, ВЫСОКО предложено сделать следующий прием в начале сценариев.
- информация, вставляемая от http://www.ss64.com/nt/setlocal.html
, SETLOCAL установит ERRORLEVEL, если дали аргумент. Это будет нуль, если один из двух допустимых аргументов будет дан и один иначе.
можно использовать это в пакетном файле, чтобы определить, доступны ли расширения команды, с помощью следующей техники:
VERIFY errors 2>nul
SETLOCAL ENABLEEXTENSIONS
IF ERRORLEVEL 1 echo Unable to enable extensions
Это работает, потому что "ПРОВЕРЯЮТ, что ошибки" устанавливают ERRORLEVEL на 1, и затем SETLOCAL не сбросит значение ERRORLEVEL, если расширения не будут доступны (например, если сценарий будет работать в соответствии с command.com)
, Если Расширения Команды будут пожизненно нетрудоспособны тогда, то SETLOCAL ENABLEEXTENSIONS не восстановит их.
HELP
При работе с различной версией ОС важно знать, какие команды доступны исходно. Ввод СПРАВКИ в командной строке показывает, какие команды доступны с кратким описанием того, что они делают.
cmd.exe /?
Это перечислит все параметры командной строки для запуска командной строки, а также тонких настроек реестра то изменение поведение в масштабе всей системы.
вот один прием, который я использую для выполнения Моего сценария Сборки Nant последовательно, не имея необходимость нажимать пакетный файл много раз.
:CODELINE
NANT.EXE -buildfile:alltargets.build -l:build.log build.product
@pause
GOTO :CODELINE
то, Что произойдет, - то, что после того, как Ваше решение закончило создавать, оно будет приостановлено. И затем при нажатии какой-либо клавиши, она повторно выполнит сценарий сборки снова. Очень удобный я должен сказать.
Для циклов с числовыми счетчиками (выводы 1 - 10):
for /l %i in (1,1,10) do echo %i
Команда IF! Без него мой командный файл был нежелательным!
@echo off
IF exist %windir%\system32\iexplore.exe goto end
echo Hmm... it seems you do not have Internet Explorer.
echo Great! You seem to understand ;)
:end
echo Hmm... You have Internet Explorer.
echo That is bad :)
Мне очень нравится этот справочник Команды Windows XP , а также ссылка Синтаксис вверху; он охватывает многие советы и приемы, уже найденные в других ответах.
Также есть команда EDLIN. Хотя это может быть старый ублюдочный инструмент, когда-то использовавшийся для построчного редактирования текста, тот факт, что им можно управлять из командной строки, делает его весьма полезным для пакетного написания сценариев, в основном потому, что, как и в любом другом случае, вы бы использовали EDLIN, он единственный доступный инструмент. В конце концов, EDLIN - это не тот инструмент, который вы обычно хотели бы использовать для редактирования текста, если только вы не являетесь мазохистом. Процитирую Тима Паттерсона (человека, который написал это): «Я был ошеломлен, когда услышал, что IBM использует его, а не выбрасывает его в окно».
ПРИМЕЧАНИЕ: EDLIN добавляет к файлам устаревшие маркеры EOF (1A) он редактирует. Если вам нужно удалить их, вам, вероятно, придется использовать DEBUG.