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

232
задан 12 revs, 3 users 30% 23 May 2017 в 02:34
поделиться

66 ответов

Несколько команд в одной строке, полезной во многих ситуациях:

& Используемый для объединения двух команд, выполняет 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
1
ответ дан 2 revs, 2 users 91% 23 November 2019 в 03:33
поделиться

Здесь, как создать ПУТЬ К КЛАССУ путем сканирования данного каталога.

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*").

1
ответ дан 3 revs 23 November 2019 в 03:33
поделиться

/c param для cmd.exe сам, говорит ему работать и затем делать эти команды.

я раньше делал часто:

win+r, ВОЗВРАТ cmd, ping google.com ВОЗВРАТ

, но теперь я просто делаю:

win+r, cmd/c проверяют с помощью ping-запросов google.com ВОЗВРАТ

намного быстрее. также полезный при использовании pstools и Вы хотите использовать psexec, чтобы сделать некоторую функцию командной строки на удаленной машине.

РЕДАКТИРОВАНИЕ: Работы/k то же, но листы открытая подсказка. Это могло бы пригождаться чаще.

2
ответ дан 2 revs 23 November 2019 в 03:33
поделиться

Я нахожу простоту, с которой можно перенаправить вывод команд в чрезвычайно полезные файлы:

DIR *.txt > tmp.txt
DIR *.exe >> tmp.txt

Одиночная стрелка создает или перезаписывает файл, двойная стрелка добавляет к нему. Теперь я могу открыть tmp.txt в своем текстовом редакторе и сделать все виды хорошего материала.

2
ответ дан raven 23 November 2019 в 03:33
поделиться

правильный формат для циклов с числовыми переменными

for /l %%i in (startNumber, counter, endNumber) do echo %%i
[еще 113] детали> http://www.ss64.com/nt/for.html

3
ответ дан 2 revs, 2 users 83% 23 November 2019 в 03:33
поделиться

ВЫБОР командные строки пользователь для одной из нескольких опций (через единственное нажатие клавиши)

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

[еще 118] детали в ВЫБОР ссылочная страница на SS64.com .

3
ответ дан NicJ 23 November 2019 в 03:33
поделиться

Для парсинга stdin из сценария Вы нуждаетесь в том приеме с ДЛЯ и НАХОДИТЕ команды:

for /f "tokens=*" %%g in ('find /V ""') do (
     :: do what you want with %%g
     echo %%g
)
3
ответ дан Philibert Perusse 23 November 2019 в 03:33
поделиться

Перенаправление произвело к консоли, даже если вывод пакета уже перенаправляется в файл через > con синтаксис.

Пример: foo.cmd:

echo a
echo b > con

Вызов:

foo.cmd > output.txt

Это приведет к "a" движение к output.txt все же "b" движение к консоли.

4
ответ дан NicJ 23 November 2019 в 03:33
поделиться
SHIFT

Это - способ выполнить итерации через переменное количество аргументов, переданных в сценарий (или подпрограмма) на командной строке. В его самом простом использовании это смещается %2, чтобы быть %1, %3, чтобы быть %2, и так далее. (Можно также передать в параметре SHIFT для пропуска нескольких аргументов.) Это делает команду "разрушительной" (т.е. %1 уходит навсегда), но она позволяет Вам избегать жесткого кодирования максимальное количество поддерживаемых аргументов.

Вот короткий пример для обработки параметров командной строки по одному:

:ParseArgs

if "%1"=="" (
    goto :DoneParsingArgs
)

rem ... do something with %1 ...

shift

goto :ParseArgs


:DoneParsingArgs

rem ...
4
ответ дан reuben 23 November 2019 в 03:33
поделиться

Опция подкаталога на 'удаляет каталог':

rd /s /q junk
4
ответ дан paxdiablo 23 November 2019 в 03:33
поделиться

Быстрый режим редактирования в cmd.exe является моим фаворитом. Это немного вне темы, но при взаимодействии с командным процессором это может быть спаситель. Нет, я не являюсь гиперболическим - Вы будете только видеть caret-capitol-v определенное число времен перед смертью; чем больше Вы видите, тем быстрее Вы умираете.

  1. Открывают regedit (осторожность, не мой отказ, "синий" экран, и т.д.)
  2. Переходят к Набору HKCU/Console
  3. QuickEdit к 1

(Можно установить это от UI также, который является, вероятно, лучшим путем. См. комментарии для инструкций. Также существует хороший один сценарий строки, чтобы сделать это также.)

Теперь, для копирования, просто щелкают левой кнопкой и перетаскивают, чтобы выбрать и щелкнуть правой кнопкой для копирования. Для вставки просто щелкните правой кнопкой.

[еще 117] ^V^V^V^V^V^V^V^V^V^V^V^V^V^V!!!

Дерьмо, я думаю, что просто уничтожил кого-то. Извините!

5
ответ дан 3 revs 23 November 2019 в 03:33
поделиться

Подпрограммы (выводы 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
5
ответ дан 2 revs 23 November 2019 в 03:33
поделиться

Относительно использования :: вместо REM для комментариев: будьте осторожны! :: особый случай маркировки ВЫЗОВА, которая действует как комментарий. Когда используется в скобках, например, в ДЛЯ или ЕСЛИ цикл, функция преждевременно выйдет. Очень печальный для отладки!

См. http://www.ss64.com/nt/rem.html для полного описания.

(добавляющий как новый ответ вместо комментария к первое упоминание об этом выше , потому что я еще не достоин комментария:0)

7
ответ дан 2 revs 23 November 2019 в 03:33
поделиться

Поиск исполняемого файла на пути (или другая подобная пути строка при необходимости):

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:\>
7
ответ дан paxdiablo 23 November 2019 в 03:33
поделиться

Можно использовать вызов для оценки имен позже, ведя к некоторым полезным свойствам.

call set SomeEnvVariable_%extension%=%%%somevalue%%%

Используя вызов для установки переменных, имена которых зависят от других переменных. Если используется с некоторыми переменными правилами именования, можно эмулировать сборы данных как массивы или словари при помощи тщательных правил именования. Тройной % вокруг somevalue так, это оценит к одному имени переменной, окруженному единственным % после вызова и прежде чем набор будет вызван. Это означает, что два % подряд выходят вниз к единственному символу %, и затем он развернет его снова, таким образом, somevalue будет эффективно указателем имени.

call set TempVar=%%SomeEnvVariable_%extension%%%

Используя его с временной переменной для получения значения, которое можно тогда использовать в логике. Это самое полезное, когда используется в сочетании с задержанным переменным расширением.

Для использования этого метода правильно задержанное переменное расширение должно быть включено. Поскольку это прочь по умолчанию, лучше включать его в рамках сценария путем помещения этого как одной из первых инструкций:

setlocal EnableDelayedExpansion
8
ответ дан 3 revs 23 November 2019 в 03:33
поделиться

Я бы сказал, что DEBUG.EXE - ОЧЕНЬ полезная и ОЧЕНЬ малоиспользуемая функция пакетных файлов.

Команда DEBUG позволяет ...

  1. Собирать и дизассемблировать 16-битный код
  2. Память для чтения / записи (современная защищенная память делает это значительно менее полезным.)
  3. Чтение секторов данных с жесткого диска в необработанном виде
  4. Hex edit

Короче говоря, этот инструмент ОЧЕНЬ мощный. В наши дни она, возможно, мало используется, но возможность вызова и управления этой функцией из пакетного сценария добавляет ошеломляющие возможности пакетному сценарию.

ПРИМЕЧАНИЕ. Microsoft удалила эту команду из 64-разрядных версий Windows. Xp и Vista и намеревается полностью удалить его из Windows 7, насколько я слышал.

1
ответ дан 23 November 2019 в 03:33
поделиться

В наши дни многие люди используют GOTO: EOF для завершения работы своих командных файлов, но вы также можете использовать EXIT / B для этой цели.

Преимущество использования EXIT / B заключается в том, что вы можете добавить уровень ошибки после EXIT / B, и он выйдет с этим уровнем ошибки.

6
ответ дан 23 November 2019 в 03:33
поделиться

Локальные переменные все еще анализируются для строки, которую использует ENDLOCAL. Это позволяет использовать такие приемы, как:

ENDLOCAL & SET MYGLOBAL=%SOMELOCAL% & SET MYOTHERGLOBAL=%SOMEOTHERLOCAL%

Это полезный способ передачи результатов в вызывающий контекст. В частности,% SOMELOCAL% выходит из области видимости, как только ENDLOCAL завершается, но к тому времени% SOMELOCAL% уже развернут, поэтому MYGLOBAL назначается в вызывающем контексте с локальной переменной.

По той же причине, если вы решите что нужно сделать:

ENDLOCAL & SET MYLOCAL=%MYLOCAL%

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

6
ответ дан 23 November 2019 в 03:33
поделиться

Удобный трюк, когда вы хотите копировать файлы между ветвями:

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%, так и подстановка переменной среды.

3
ответ дан 23 November 2019 в 03:33
поделиться

Вы можете использовать уровень ошибок, чтобы проверить, доступна ли данная программа в системе (текущий каталог или путь), где будет запускаться ваш пакетный файл. Чтобы это работало, программа, которую вы тестируете, должна запуститься, выйти и установить код выхода, когда это произойдет. В примере, который я использую -? в качестве аргумента для 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, но таким образом у вас могут быть команды между тестом и условием, и вы повторно проверяете условие по мере необходимости.

4
ответ дан 23 November 2019 в 03:33
поделиться

Позволяет Вам изменять каталог на основе переменной среды, не имея необходимость указывать директиву '%'. Если указанная переменная не существует, затем пробуют имя каталога.

@if defined %1 (call cd "%%%1%%") else (call cd %1)
1
ответ дан 2 revs, 2 users 83%Paul Hobbs 23 November 2019 в 03:33
поделиться

Этот пакетный файл работает оба с простым каталоги, файлов а также как параметры командной строки (можно смешать их в любом порядке). Цикл выполняет команду ('эхо' в этом примере) на любом указанном файле, если параметр является каталогом, это выполняет команду рекурсивно на каждом файле в нем.

@echo off
for /f "delims=" %%f in ('dir %* /a-d /b /s') do echo %%f
0
ответ дан Sascha 23 November 2019 в 03:33
поделиться

Очень старое (приблизительно 1990) обманывает для получения общего размера переменных среды:

set > test
dir test
del test
0
ответ дан some 23 November 2019 в 03:33
поделиться

При использовании расширения команды опции оболочки в сценарии, ВЫСОКО предложено сделать следующий прием в начале сценариев.

- информация, вставляемая от 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 не восстановит их.

0
ответ дан Philibert Perusse 23 November 2019 в 03:33
поделиться
HELP

При работе с различной версией ОС важно знать, какие команды доступны исходно. Ввод СПРАВКИ в командной строке показывает, какие команды доступны с кратким описанием того, что они делают.

cmd.exe /? 

Это перечислит все параметры командной строки для запуска командной строки, а также тонких настроек реестра то изменение поведение в масштабе всей системы.

0
ответ дан Mark Arnott 23 November 2019 в 03:33
поделиться

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

:CODELINE
NANT.EXE -buildfile:alltargets.build -l:build.log build.product
@pause
GOTO :CODELINE

то, Что произойдет, - то, что после того, как Ваше решение закончило создавать, оно будет приостановлено. И затем при нажатии какой-либо клавиши, она повторно выполнит сценарий сборки снова. Очень удобный я должен сказать.

0
ответ дан RWendi 23 November 2019 в 03:33
поделиться

Для циклов с числовыми счетчиками (выводы 1 - 10):

for /l %i in (1,1,10) do echo %i
0
ответ дан paxdiablo 23 November 2019 в 03:33
поделиться

Команда 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 :)
0
ответ дан 23 November 2019 в 03:33
поделиться

Мне очень нравится этот справочник Команды Windows XP , а также ссылка Синтаксис вверху; он охватывает многие советы и приемы, уже найденные в других ответах.

0
ответ дан 23 November 2019 в 03:33
поделиться

Также есть команда EDLIN. Хотя это может быть старый ублюдочный инструмент, когда-то использовавшийся для построчного редактирования текста, тот факт, что им можно управлять из командной строки, делает его весьма полезным для пакетного написания сценариев, в основном потому, что, как и в любом другом случае, вы бы использовали EDLIN, он единственный доступный инструмент. В конце концов, EDLIN - это не тот инструмент, который вы обычно хотели бы использовать для редактирования текста, если только вы не являетесь мазохистом. Процитирую Тима Паттерсона (человека, который написал это): «Я был ошеломлен, когда услышал, что IBM использует его, а не выбрасывает его в окно».

ПРИМЕЧАНИЕ: EDLIN добавляет к файлам устаревшие маркеры EOF (1A) он редактирует. Если вам нужно удалить их, вам, вероятно, придется использовать DEBUG.

0
ответ дан 23 November 2019 в 03:33
поделиться