Почему этот пакетный файл никогда не выходит из цикла?
For /L %%f In (1,1,1000000) Do @If Not Exist %%f Goto :EOFНе должен Goto :EOF вырваться из цикла?
Редактировать:
Общие сведения о командном процессоре Windows.
Использование переменных в командных файлах.
Передача параметров командному файлу.
Переходы и метки.
Примеры командных файлов:
– Своя команда для создания новых файлов.
– Присвоение съемному диску одной и той же буквы.
– Создание архива, имя которого содержит дату и время.
– Выполнение только в заданный интервал времени.
– Пример создания архива каталога пользователя.
– Изменение даты и времени для файлов и папок.
– Запуск и остановка служб Windows в командной строке.
– Выдача на экран значения ERRORLEVEL.
– Диалог с пользователем.
– Задержки в командных файлах.
– Определение текущей версии Windows.
– Поиск в локальной сети компьютеров с запущенным приложением.
– Поиск компьютеров с запущенным приложением по списку на основе сетевого окружения.
– Выключение компьютеров по списку, созданному на основе сетевого окружения.
– Поиск в локальной сети включенных компьютеров.
– Работа с дисками, файлами и каталогами.
– Работа с графическими приложениями из командной строки.
– Перекодировка текстовых файлов .
– Часто встречающиеся ошибки при написании командных файлов.
После запуска приглашение командной строки показывает текущий каталог. По умолчанию, это каталог профиля текущего пользователя. Для смены текущего каталога используется специальная команда CD.
Команда CD. Смена текущего каталога.





Чтобы перейти из текущего подкаталога в родительский каталог применяется команда


Таким образом, из вышесказанного следует вывод:
- Для перехода в корень диска применяется команда
- Для перехода в любой каталог диска применяется команда (из корня диска) и команда (из любого каталога или подкаталога).
- Для перехода в подкаталог применяется команда (из каталога) и команда (из корня диска).

Теперь с диска «D» перейдем в папку «Fonts», расположенную в папке «Windows» на диске «C»:
cd /D c:/windows/fonts

Команда СD может записываться как СHDIR. CD и CHDIR являются аналогичными командами и обе являются сокращениями от англ. «change directory» – поменять каталог.
Общие сведения о командном процессоре Windows.
Командные файлы (пакетные файлы, скрипты, сценарии, ”батники”) – это обычные текстовые файлы с расширением .bat или .cmd, строки которых представляют собой специальные команды командного процессора (интерпретатора команд ) и/или имена исполняемых файлов с параметрами. Командный процессор – это специальная программа, являющаяся обязательным элементом практически любой операционной системы, главным назначением которой, является предоставление пользователю возможности выполнения определенных программ без их компиляции и создания исполняемых файлов. Для операционных систем DOS и Windows9X в качестве интерпретатора команд использовался командный процессор command.com, для всех остальных ОС семейства Windows ( NT/2k/XP/Vista/7/8/10 и старше) – cmd.exe.
Несмотря на непрерывное совершенствование средств создания и выполнения сценариев с использованием объектно-ориентированных языков, обычная командная строка и простые командные файлы, по-прежнему остаются основным инструментом для выполнения рутинных действий, диагностики сетевых проблем, автоматизации процессов резервного копирования и т.п. При всех недостатках реализации командного процессора в Windows, он был и остается важнейшим инструментом администрирования, диагностики и управления системой.
Современная реализация командного процессора CMD кроме классического применения, позволяет также использовать возможности Инструментария управления Windows (WMI –Windows Management Instrumentation), сценарии Windows Script Host (WSH) и даже оболочки (shell) операционных систем Linux без установки стороннего программного обеспечения, поскольку в современных Windows, начиная с Windows 10, в качестве стандартного компонента системы может применяться Подсистема Windows для Linux (WSL – Windows Subsystem for Linux), что позволяет объединять в командных файлах исходные тексты CMD и, например, – bash.
Как уже упоминалось выше, командный файл – это обычный текстовый файл с набором команд, которые последовательно выполняются командным процессором CMD Windows (cmd.exe). Командный процессор последовательно считывает и выполняет команды, которые представляют собой своеобразную программу, реализующую определенный алгоритм. Естественно, как и в любой другой среде программирования, программирование в командной строке подчиняется определенным правилам и командные файлы должны им полностью соответствовать.
Как перейти в папку или на другой диск в командной строке
Работая в командной строке (CMD) все действия приходится выполнять при помощи текстовых команд и переход в другую папку не исключение. Для этого
Как перейти в папку в командной строке
cd Users

Для того чтобы вернуться назад (перейти на уровень выше по дереву папок) нужно вводить команду:
cd ..

Для того чтобы быстро перейти в корневый каталог текущего диска нужно выполнить:
cd \

Команду CD можно вводить как СHDIR, логика ее работы от этого не меняется.
Как перейти на другой диск
Если вам нужно перейти на другой диск, например, с диска C на диск D, то команду cd нужно выполнять с параметром /D. Например, если вам нужно перейти с диска C на диск D в папку GAMES, то вам нужно ввести команду:
cd /D d:\games

Также вы можете просто ввести букву диска с двоеточием и таким образом перейти на другой диск:
D: C:

Например, если вы находитесь на диске C и вам нужно перейти на диск D, то вы можете просто ввести команду «».
Как открыть командную строку сразу в нужной папке
Если вам нужно открыть командную строку в определенной папке, то это можно сделать прямо из Проводника Windows. Для этого нужно открыть данную папку в Проводнике и установить курсор в адресную строку, там где указывается путь к папке.

После этого нужно удалить путь к папке, ввести команду «» и нажать на клавишу ввода.

В результате откроется командная строка. При этом в качестве текущей папки уже будет выбранна та папка, из которой вы запускали «».

Таким образом из папки можно запускать не только командную строку, но и другие консоли. Например, PowerShell или bash, если у вас установлен WSL. Данный способ работает в Windows 10 и Windows 11.
Создатель сайта comp-security.net, автор более 2000 статей о ремонте компьютеров, работе с программами, настройке операционных систем.
Задайте вопрос в комментариях под статьей или на странице
«Задать вопрос»
и вы обязательно получите ответ.
При запуске командной строки в Windows 10 по умолчанию открывается папка пользователя. Но, в большинстве случаев для работы она не подходит. Решить эту проблему можно двумя способами. Можно либо сразу открыть командную строку в нужной папке, либо перейти в эту папку позже. Оба этих варианта мы и рассмотрим в данной статье.
Запуск CMD из адресной строки в Проводника Windows 10
Если вам нужно открыть командную строку Windows 10 в определенной папке, то самый простой вариант, это выполнить команду «» в адресной строке в Проводника Windows 10. Делается это следующим образом: открываете любую папку, устанавливаете курсор в адресную строку, вместо адреса вводите команду «» и нажимаете на клавишу «».

После того как вы введете команду «» в нужной вам папки, появится окно командной строки. При этом командная строка будет открыта сразу в текущей папке. Как видно на скриншоте внизу, адрес в Проводнике Windows и в командной строке совпадает.

Аналогичным образом можно открывать не только CMD, но и консоль PowerShell, только в этом случае в адресную строку нужно ввести команду «».
Переход в нужную папку с помощью команды CD
Альтернативный вариант – это использование команды «» (от англ. Change Directory) уже после открытия командной строки. Для этого нужно открыть командную строку любым удобным вам способом. Например, можете просто нажать Win-R и выполнить команду «».

После открытия командной строки нужно ввести команду «» и указать путь к папке. Например, если вы хотите открыть «», то вам нужно ввести «cd /d E:\Games\», как на скриншоте внизу.

Обратите внимание, использование ключа обязательно только при смене диска (например, при переходе с диска на диск ). Если вы переходите в папку на том же диске, то данный ключ можно не вводить. В этом случае нужно просто ввести команду «» и путь к папке.

Также нужно отметить, что при смене диска, вы можете сначала ввести букву диска (например, ) и перейти в его корень. И уже после этого открыть нужную папку с помощью команды «».

Для навигации по папкам в командной строке кроме команды «» вам также понадобится команда «». С ее помощью можно вывести содержимое текущего каталога прямо в консоль.

После вывода содержимого с помощью «» можно будет решить, в какую папку вам нужно перейти дальше и воспользоваться командой «».
Создатель сайта comp-security.net, автор более 2000 статей о ремонте компьютеров, работе с программами, настройке операционных систем.
Задайте вопрос в комментариях под статьей или на странице
«Задать вопрос»
и вы обязательно получите ответ.
Почему этот пакетный файл никогда не выходит из цикла?
For /L %%f In (1,1,1000000) Do @If Not Exist %%f Goto :EOFНе следует ли выйти из цикла Goto :EOF?
Edit:
Ответ 1
На основе Tim second edit и эта страница вы можете сделать это:
@echo off
if "%1"=="loop" ( for /l %%f in (1,1,1000000) do ( echo %%f if exist %%f exit ) goto :eof
)
cmd /v:on /q /d /c "%0 loop"
echo doneЭта страница предлагает способ использования goto внутри цикла, кажется, что он работает, но требуется некоторое время в большом петля. Поэтому внутренне он заканчивает цикл до того, как выполняется goto.
Ответ 2
Код внутри цикла больше не выполняется, но цикл расширяется для всех номеров до конца.
Вот почему это так медленно.
Единственным способом выхода из цикла FOR/L является вариант exit, такой как exsample для Wimmel, но это не очень быстро и полезно для доступа к каким-либо результатам из цикла.
Это показывает 10 расширений, но ни один из них не будет выполнен
echo on
for /l %%n in (1,1,10) do ( goto :eof echo %%n
)Ответ 3
Как jeb отметил, остальная часть цикла пропускается , но оценивается, что делает решение FOR слишком медленным для этой цели. Альтернатива:
set F=1
:nextpart
if not exist "%F%" goto :EOF
echo %F%
set /a F=%F%+1
goto nextpartВозможно, вам придется использовать задержанное расширение и call подпрограммы при использовании этого в циклах.
Ответ 4
Итак, я понимаю, что это уже давно, но после многого разговора я не смог найти ответ, которым я был доволен, поэтому я придумал свое собственное решение для взлома цикла FOR, которое немедленно останавливает итерацию, и подумал, что я ‘d поделиться им.
Он требует, чтобы цикл находился в отдельном файле и использовал ошибку в обработке ошибок CMD, чтобы немедленно сбой пакетной обработки файла цикла при перенаправлении STDOUT DIR в STDIN.
ECHO Simple test demonstrating loop breaking.
ECHO.
CMD /C %~dp0\LOOP.cmd
ECHO.
ECHO After LOOP
PAUSEFOR /L %%A IN (1,1,10) DO ( ECHO %%A IF %%A EQU 3 DIR >&0 2>NUL )
)При запуске создается следующий вывод. Вы заметите, что итерация и выполнение цикла прекращаются, когда% A = 3.
:>MainFile.cmd
:>ECHO Simple test demonstrating loop breaking.
Simple test demonstrating loop breaking.
:>ECHO.
:>CMD /C Z:\LOOP.cmd
:>FOR /L %A IN (1 1 10) DO (
ECHO %A IF %A EQU 3 DIR 1>&0 2>NUL
)
:>(
ECHO 1 IF 1 EQU 3 DIR 1>&0 2>NUL
)
1
:>(
ECHO 2 IF 2 EQU 3 DIR 1>&0 2>NUL
)
2
:>(
ECHO 3 IF 3 EQU 3 DIR 1>&0 2>NUL
)
3
:>ECHO.
:>ECHO After LOOP
After LOOP
:>PAUSE
Press any key to continue . . .Пример (с использованием того же файла LOOP.cmd, как указано выше):
@ECHO OFF
ECHO.
ECHO Simple test demonstrating loop breaking.
ECHO.
FOR /F "delims=" %%L IN ('CMD /C %~dp0\LOOP.cmd') DO SET VARIABLE=%%L
ECHO After LOOP
ECHO.
ECHO %VARIABLE%
ECHO.
PAUSE:>MainFile.cmd
Simple test demonstrating loop breaking.
After LOOP
3
Press any key to continue . . .Если вам нужно сохранить несколько переменных, вам необходимо перенаправить их во временные файлы, как показано ниже.
@ECHO OFF
ECHO.
ECHO Simple test demonstrating loop breaking.
ECHO.
CMD /C %~dp0\LOOP.cmd
ECHO After LOOP
ECHO.
SET /P VARIABLE1=<%TEMP%\1
SET /P VARIABLE2=<%TEMP%\2
ECHO %VARIABLE1%
ECHO %VARIABLE2%
ECHO.
PAUSE@ECHO OFF
FOR /L %%A IN (1,1,10) DO ( IF %%A EQU 1 ECHO ONE >%TEMP%\1 IF %%A EQU 2 ECHO TWO >%TEMP%\2 IF %%A EQU 3 DIR >&0 2>NUL
):>MainFile.cmd
Simple test demonstrating loop breaking.
After LOOP
ONE
TWO
Press any key to continue . . .Я надеюсь, что другие находят это полезным для прерывания циклов, которые в противном случае слишком долго выходили бы из-за продолжения итерации.
Ответ 5
Немного исследовал это, кажется, что вы выполняете цикл от 1 до 2147483647 с шагом в 1.
(1, 1, 2147483647): первым номером является начальный номер, следующим числом является шаг, а последний номер – конечный номер.
Отредактировано для добавления
Похоже, что цикл работает до завершения независимо от условий тестирования. Я тестировал
FOR /L %%F IN (1, 1, 5) DO SET %%F=6И он работал очень быстро.
Так как это единственная строка в пакетном файле, вы можете попробовать команду EXIT:
FOR /L %%F IN (1, 1, 2147483647) DO @IF NOT EXIST %%F EXITОднако это также закроет окно подсказки DOS.
Ответ 6
Предполагая, что OP вызывает командный файл с cmd.exe, чтобы правильно выйти из цикла for, просто перейдите к метке;
For /L %%f In (1,1,1000000) Do If Not Exist %%f Goto :EOFFor /L %%f In (1,1,1000000) Do If Not Exist %%f Goto:fileError
.. do something
.. then exit or do somethign else
:fileError
GOTO:EOFЕще лучше, добавьте сообщение об ошибке:
set filename=
For /L %%f In (1,1,1000000) Do( set filename=%%f If Not Exist %%f set tempGoto:fileError
)
.. do something
.. then exit or do somethign else
:fileError
echo file does not exist '%filename%'
GOTO:EOFЯ считаю, что это полезный сайт о малоизвестных функциях и приемах командного файла cmd.exe/DOS: https://www.dostips.com/
Ответ 7
вам не нужен отдельный командный файл для выхода из цикла с использованием exit/b, если вы используете call вместо goto наподобие
call :loop
echo loop finished
goto :eof
:loop
FOR /L %%I IN (1,1,10) DO ( echo %%I IF %%I==5 exit /b
)в этом случае “exit/b” выйдет из “вызова” и продолжит со строки после “вызова”
Итак, вывод такой:
1
2
3
4
5
loop finishedПередача параметров командному файлу.
Очень полезной особенностью работы с командными файлами является
возможность получать значения параметров командной строки и использовать их
в операциях внутри самого командного файла.
params.bat FIRST second “two words”
Параметры командной строки, содержащие пробелы должны заключаться в двойные кавычки.
При обработке входных параметров необходимо знать, были ли они вообще заданы в командной строке. Для проверки наличия каких-либо входных параметров, передаваемых
командному файлу, можно проверить, является ли значение переменной %1
пустым, что можно сделать, заключив ее, например в двойные кавычки, и проверив полученный результат на наличие этих кавычек, следующих подряд:
REM пробел текст
Строки, начинающиеся с REM пробел, считаются комментариями и командным процессором игнорируются.
Создание архива, имя которого содержит дату и время.
Решим следующую задачу – нужно создать архив файлов, находящихся в каталоге
C:\Program Files\FAR. Имя архивного файла должно состоять из текущего времени
(часы.минуты.секунды – ЧЧ.ММ.СС.rar), и помещен он должен в новый каталог, имя которого должно состоять из текущей даты
(день.месяц.год – ДД.ММ.ГГГГ). Для архивирования будем использовать архиватор RAR.
Формат запуска для создания архива:
RAR a -r < путь и имя архива > < Путь и имя архивируемых данных >
a – команда создания архива.
-r – ключ, определяющий архивирование подкаталогов (т.к. в исходной папке есть подкаталоги).
Таким образом, для решения задачи нужно правильно создать имена и пути для RAR. Для чего
воспользуемся следующими исходными данными:
Причина в том, что при создании командных файлов вы
использовали текстовый редактор, в котором русские символы представлены
не в DOS-кодировке. Если в приведенном выше примере перезапуска службы “DNS-клиент”
вы используете неверную кодировку, то русская часть имени службы не будет опознана
из-за неверной кодировки и будет выдано сообщение, что указанная служба не
установлена. Чтобы избежать проблем с русскими символами в командных файлах,
используйте редактор с поддержкой DOS-кодировки, например, встроенный редактор
файлового менеджера Far Manager. Переключение между кодировками в редакторе осуществляется нажатием F8 . С помощью FAR можно легко осуществлять перекодировку, скопировав (вырезав) текст в буфер обмена, затем
нажав F8 и вставив текст из буфера.
Переходы и метки.
В командных файлах можно использовать команды условного перехода,
меняющие логику их работы в зависимости от возникновения определенных условий.
В качестве примера создадим командный
файл, целью которого будет присвоение заранее определенной буквы для
съемных носителей.
Исходные данные: имеется 2 съемных диска, один из которых должен быть виден в проводнике как диск X: , а второй – как диск Y: независимо от того, в какой порт USB они подключены и какие буквы присвоены им операционной системой. Для назначения букв дискам можно воспользоваться командой SUBST.
Будем считать, что реальные диски могут быть подключены как F: или G:
Опознавание дисков будем выполнять по наличию файла с определенным именем
(лучше всего такой файл сделать скрытым в корневом каталоге съемного диска и назвать его как-нибудь необычно):
Flashd1.let – на первом диске
Flashd2.let – на втором
Таким образом, задача командного файла заключается в том, чтобы проверить
наличие на сменных дисках F: и G: файлов Flashd1.let
или Flashd2.let и, в зависимости от того, какой из них присутствует,
присвоить диску букву X: или Y:
Для поиска файла на диске воспользуемся командой :
IF EXIST имя_файла команда
В качестве команды, которая будет выполнена при удовлетворении условия используем , которая предназначена для сопоставления каталога и виртуального диска.
SUBST X: C:\ – – создать виртуальный диск
X:, содержимым которого будет корневой каталог диска C:
Для решения поставленной задачи, создаем командный файл, например с именем setletter.bat, следующего содержания:
setletter.bat
В качестве метки используется строка символов, начинающаяся
с двоеточия. Сделаем изменения в нашем командном файле, чтобы не возникало
сообщений об ошибке:
При выполнении измененного таким образом командного файла, сообщение об
ошибке при выполнении SUBST исчезнет.
Конечно, данный пример очень примитивен, но главная его цель заключается не в написание оптимального командного сценария, а в демонстрации принципов использования меток и переходов. Во всех последующих примерах, насколько это возможно, используется именно такой подход – важна не оптимальность исходного текста, а его максимальная простота для понимания.
Одним из важнейших приемов при написании сложных командных файлов
является анализ успешности выполнения конкретной команды или программы.
Признаки ошибок при выполнении команд можно отслеживать, анализируя
специальную переменную ,
значение которой формируется при завершении работы большинства программ.
Обычно ERRORLEVEL равно нулю, если программа завершилась без ошибок и
единице – при возникновении ошибки. Могут быть и другие значения, если они
предусмотрены в выполняемой программе.
В качестве команды в строке командного файла можно использовать также
командный файл. Причем, для передачи с возвратом обратно к точке выполнения
вызывающего командного файла используется
команда CALL. Попробуйте создать командный файл test.bat, следующего содержания:
– приостановить выполнение командного файла до
нажатия любой клавиши.
Если же в файле test.bat убрать CALL, оставив “1.bat”, то , выполнится командный файл 1.bat, и возврат в test.bat выполняться не будет.
Вызываемый командный файл может создавать переменные и присваивать им
определенные значения, которые будут доступны для обработки в вызывающем
файле. Попробуйте изменить файл test.bat следующим образом:
Переменные вызываемого файла будут доступны в вызывающем файле.
Кстати, используя передачу управления командному файлу, можно организовать
его зацикливание. Попробуйте добавить в конец файла test.bat строку:
Выйти из зацикливания командного файла можно по нажатию комбинации
CTRL+Break.
Команда CALL может использоваться не только для вызова другого командного файла, но и для вызова внутренней подпрограммы. В этом случае в качестве аргумента используется не имя внешнего файла, а метка:
Использование переменных окружения в командных файлах.
При работе с командными файлами невозможно обойтись без переменных окружения (environments) – переменных, значения которых определяют среду, в которой выполняются команда или пакетный файл. Часто их называют переменными среды. Значения, принимаемые этими переменными формируются при
загрузке Windows, регистрации пользователя в системе, старте или завершении
некоторых приложений, и, кроме того, могут быть заданы с помощью специальной
команды
SET переменная = значение
SETX переменная = значение
Первая присваивает значение переменной, действующее до завершения текущей сессии командной строки. Вторая – значение, действующее постоянно.
Как уже упоминалось выше, значение, присвоенное какой-либо переменной, доступно для обработки в командной строке или в командном файле с использованием ее имени, заключенного в знаки процента – % . Системные переменные позволяют получить сведения об аппаратной и программной среде, в которой выполняется командный файл, что позволяет реализовать его исполнение на разных компьютерах, независимо от их конкретной конфигурации и пользовательских настроек. Например, в командном файле используется вывод содержимого системного каталога C:\Windows :
DIR C:\Windows
Алгоритм, реализуемый данным командным файлом, будет прекрасно выполняться до тех пор пока не встретится компьютер с Windows установленной не на диск C:, а например, на D:. Чтобы этого не происходило, желательно использовать системную переменную WINDIR, принимающую значение пути системного каталога:
На практике, с помощью команды SET обычно задается и модифицируется путь поиска исполняемых программ
– переменная окружения PATH.
SET PATH=C:\Windows; C:\windows\system32
Данная команда определяет, что поиск исполняемых файлов будет выполняться в
каталоге C:\Windows и, если результат неуспешен, в
C:\windows\system32
При необходимости выполнить программу, например, myedit.exe, размещенную в
каталоге C:\NewProgs необходимо либо указать полный путь исполняемого файла, либо сделать текущим каталогом каталог с программой и использовать только его имя. Если в командной строке не задан полный путь, а только имя
исполняемого файла – myedit.exe
то сначала будет выполняться поиск файла myedit.exe в текущем каталоге, и если
он не будет найден – в каталогах, список которых определяется значением переменной
PATH. Символ ; является разделителем элементов в списке путей поиска.
Если в приведенном примере, текущим каталогом не является
C:\NewProgs, и в остальных каталогах, заданных значением переменной
PATH, нет исполняемого файла myedit.exe, то попытка его запуска
завершится ошибкой. Однако, если модифицировать значение переменной PATH, добавив в нее требующийся каталог, то указание полного пути исполняемого файла становится необязательным.
Команда
изменит текущее значение PATH,
добавив каталог C:\NewProgs в начало списка. Для добавления каталога в конец списка используется несколько иная конструкция:
SET PATH=%path%; C:\NewProgs
Выполнение команды SET без параметров позволяет получить текущие
значения переменных окружения:
NUMBER_OF_PROCESSORS=1 – количество процессоров
OS=Windows_NT- тип ОС
Path=C:\WINDOWS\system32; C:\WINDOWS;C:\Program Files\Far – путь поиска исполняемых файлов.
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE; .JS;.JSE;.WSF;.WSH – расширения для исполняемых файлов.
PROCESSOR_ARCHITECTURE=x86 – архитектура процессора.
PROCESSOR_IDENTIFIER=x86 Family 6 Model 8 Stepping 1, AuthenticAMD – идентификатор процессора.
PROCESSOR_LEVEL=6 – уровень (номер модели) процессора.
PROCESSOR_REVISION =0801 – версия процессора.
ProgramFiles=C:\Program Files – путь к папке “Program Files”
PROMPT=$P$G – формат приглашения командной строки $P – путь для текущего каталога $G – знак “>”.
SystemDrive=C: – буква системного диска.
SystemRoot= C:\WINDOWS – каталог ОС Windows.
Значения некоторых переменных по команде SET не отображаются, хотя и присутствуют в системе. В основном, это переменные, принимаемые значения которых динамически изменяются:
%CD% – Принимает значение строки текущего каталога.
%DATE% – Принимает значение текущей даты.
%TIME% – Принимает значение текущего времени.
%RANDOM% – Принимает значение случайного десятичного числа в диапазоне 1 -32767.
%ERRORLEVEL% – Принимает текущее значение кода завершения задачи ERRORLEVEL
%CMDEXTVERSION% – Принимает значение версии командного процессора CMD.EXE для расширенной обработки команд.
%CMDCMDLINE% – Принимает значение строки, которая вызвала
командный процессор.
Значения, принимаемые переменными окружения, могут быть расширены с помощью
специального признака – символа ” ~ “, что позволяет получить их частичное
значение, или изменить его подменой какой-либо части. Практические примеры использования расширений переменных будут рассмотрены ниже.
Подробное описание команд с примерами их использования имеется в разделе Список команд CMD Windows.
Примеры командных файлов.
Использование утилит командной строки и командных файлов нередко позволяют
решить многие проблемы связанные с повседневной эксплуатацией компьютерной
техники. Большинство системных администраторов и грамотных пользователей
продолжают ими пользоваться, несмотря на то, что в Windows проявилось новое,
более мощное и современное средство управления системой – WMI
(Windows Management Instrumentation) и многофункциональная оболочка пользователя Power Shell. Очевидно, не в последнюю очередь, это
обусловлено простотой реализации и достаточной
эффективностью командной строки для решения повседневных задач обслуживания системы.
Ниже приведены простые
примеры с комментариями, которые демонстрируют некоторые возможности и
способы применения .cmd и .bat
Специальные символы CMD
Работа с командным процессором предполагает использование двух стандартных устройств – устройства ввода (клавиатура) и устройства вывода (дисплей). Однако, имеется возможность изменить стандартно используемые устройства ввода-вывода с помощью специальных символов – символов перенаправления
– перенаправление вывода
– перенаправление ввода
Для вывода справки не на экран а, например, в файл с именем help.txt, можно использовать следующую команду:
HELP > help.txt
При выполнении данной команды, в текущем каталоге будет создан файл с именем help.txt, содержимым которого будет результат вывода команды HELP. Если файл help.txt существовал на момент выполнения команды, его содержимое будет перезаписано. Для того, чтобы дописать данные в конец существующего файла, используют удвоение символа перенаправления вывода – “>>”
HELP GOTO > myhelp.txt – в файл myhelp.txt будет выдана справка по использованию команды GOTO
HELP COLOR >> myhelp.txt – в конец файла myhelp.txt будет дописана справка по использованию команды COLOR
Простейший пример перенаправления ввода:
cmd.exe < commands.txt – командный процессор не будет ожидать ввода команд с клавиатуры, а считает их из файла commands.txt. Фактически, указанный текстовый файл в данном случае является командным файлом.
При запуске командного процессора можно указать конкретную команду в качестве аргумента командной строки:
cmd.exe /C HELP FOR – выполнить команду HELP FOR и завершиться (параметр командной строки или ключ /C)
cmd.exe /K HELP FOR – выполнить команду HELP FOR и перейти в режим ожидания дальнейшего ввода команд (ключ /K)
Подробную справку по использованию cmd.exe можно получить, введя в качестве аргумента ключ /?
& – одиночный амперсанд используется для разделения нескольких команд в одной командной строке.
команда1 & команда2 – выполняется первая команда, затем вторая команда.
&& – удвоенный амперсанд между двумя командами, означающий условное выполнение второй команды. Она будет выполнена, если код завершения (или код возврата) первой команды равен нулю, т.е. команда выполнена успешно. Успешность
выполнения команды определяется значением специальной переменной среды ERRORLEVEL.
команда1 && команда2 – выполняется команда1, а команда2 выполняется, только если первая была выполнена успешно.
Команду, следующую после знаков объединения, не нужно заключать в
двойные кавычки, иначе командный процессор удвоит их и сообщит об ошибке.
Выполнение командной строки
cmd.exe /C “HELP IF” & ”HELP IF”
Завершится выполнением первой команды и сообщением об ошибке для второй:
“”HELP” не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
Как и в любом другом языке программирования, в сценариях CMD невозможно обойтись без переменных. Для получения их значения применяется специальный символ – знак процента % . Строка, заключенная в знаки процента интерпретируется как значение переменной, например:
Символ ^ , являющийся последним символом строки, используется как признак продолжения предыдущей. Это относится как к тексту, так и к командам.
Своя команда для создания новых файлов.
В составе операционной системы Windows нет специальной команды для создания нового файла, но без нее можно легко обойтись несколькими способами:
Копирование с клавиатуры в файл
COPY CON myfile.txt
При выполнении этой команды данные с клавиатуры (стандартное устройство CON – консоль) будут заноситься в файл myfile.txt текущего каталога. Нажатие клавиши F6 или комбинации CTRL-Z завершит вывод.
При выполнении этой команды будет создан файл myfile.txt, содержащий символ “1”
Комбинация перенаправления ввода и перенаправления вывода:
COPY CON > myfile.txt < xyz
При выполнении этой команды, как и в первом случае, используется копирование
с консоли в файл, но вместо ручного ввода данных с клавиатуры используется ввод с
несуществующего файла (устройства) xyz. Система выдаст сообщение, о том, что такого
устройства или файла
не существует, но пустой файл myfile.txt будет успешно создан.
Обычно, для создания пустого файла используется команда копирования из фиктивного устройства nul в файл. Использование устройства nul позволяет обойти стандартные операции ввода-вывода, которые для него реально не выполняются. При выполнении копирования с фиктивного устройства в файл будет создан пустой файл без каких-либо сообщений об ошибке.
COPY NUL myfile.txt
При работе в командной строке часто приходится создавать новые пустые
файлы, поэтому, стоит подготовить свой командный файл (например, с
именем nf.bat),
а имя нового создаваемого файла передавать ему в качестве параметра при
запуске.
Для удобства использования, можно поместить этот командный файл в системный каталог
(например, в C:\windows\system32) или любой другой, существующий в путях
поиска, задаваемых значением переменной PATH). Теперь, в командной строке, находясь в любом каталоге можно одной командой создавать пустые файлы.
Возможность создания файлов в системных каталогах зависит от настроек безопасности системы и прав пользователя, в контексте учетной записи которого выполняется команда. Многие команды могут быть выполнены только пользователем с правами администратора.
Расширение командного файла (.bat) можно не набирать и команда еще больше упрощается:
В тексте командного файла присутствует проверка, задано ли имя
создаваемого файла в командной строке (if “%1%” EQU “” goto error), и если не
задано – выводится сообщение об ошибке и командный файл завершает
свою работу.
В плане совершенствования функционала, можно добавить в этот командный файл проверку
на существование файла с именем, указанным в командной строке и предупреждением пользователя о его возможной перезаписи.
Присвоение съемному диску одной и той же буквы.
Задача заключается в том, чтобы съемный USB диск (флэш диск) был доступен
всегда под одной и той же буквой, независимо от того, на каком компьютере он
используется и каким образом он был подключен. Для ее решения воспользуемся уже упоминаемой выше командой SUBST, но реализуем присвоение новой буквы диску с
помощью подстановочного значения переменной %0, создаваемой
системой при каждом запуске командного файла.
Выберем для съемного диска желаемую букву, например – X.
Некоторые из переменных окружения, в том числе и переменная %0,
принимающая значение пути и имени выполняющегося командного файла, позволяют
при определенной модификации с использованием специального признака –
символа ” ~ “, получить ее частичное значение (расширение переменной).
Например, не полный путь
файла, а только его имя, или каталог расположения, или букву диска, с
которого он был запущен или еще около десятка различных элементов, связанных
с подстановочными значениями переменной %0.
Дополнительное представление о подстановочных значениях
переменной %0 можно получить из командного файла следующего
содержания:
Команды CMD
Строки командных файлов могут содержать как команды самого
процессора команд CMD, так и имена исполняемых модулей (программ или командных файлов).
– исполняемый файл ping.exe с параметром yandex.ru. Расширение .exe можно не указывать, и данная команда может быть записана так:
Список стандартных команд можно получить, введя команду:
Справочную информацию по конкретной команде можно получить, указав ее название в качестве параметра команды HELP:
HELP Имя команды
В русифицированной версии Windows необходимо учитывать, что в среде командного процессора символы национального алфавита отображаются в DOS-кодировке, в соответствии с кодовой страницей (code page) 866. При необходимости, для переключения между кодовыми страницами Windows и DOS используется команда
CHCP номер страницы
– использовать кодовую страницу 866 (DOS)
– использовать кодовую страницу 1251 (WINDOWS)
Внешний вид окна CMD.EXE (консоли Windows) можно изменить с помощью команды
В качестве аргументов для команды используются 2 шестнадцатеричные цифры, задающие цвет фона и цвет символа.
– символы белого цвета на черном фоне (используется по умолчанию).
– черные символы на белом фоне.
– светло-желтые символы на черном фоне.
– подсказка для команды COLOR.
9
ответов
На основании второго редактирования Тима и этой страницы вы можете сделать это:
@echo off
if "%1"=="loop" ( for /l %%f in (1,1,1000000) do ( echo %%f if exist %%f exit ) goto :eof
)
cmd /v:on /q /d /c "%0 loop"
echo doneЭта страница предлагает способ использовать goto внутри цикла, кажется, он работает, но в большом цикле это занимает некоторое время. Так что внутренне он завершает цикл перед выполнением goto.
Код внутри цикла больше не выполняется, но цикл расширяется для всех чисел до конца.
Вот почему это так медленно.
Единственный способ выйти из цикла FOR /L – это вариант exit как пример Wimmel, но это не очень быстро и не полезно для доступа к каким-либо результатам из цикла.
Это показывает 10 расширений, но ни одно из них не будет выполнено
echo on
for /l %%n in (1,1,10) do ( goto :eof echo %%n
)Мой ответ
Используйте вложенныеfor петли, чтобы обеспечить точки останова для for /l петля.
for %%a in (0 1 2 3 4 5 6 7 8 9) do ( for %%b in (0 1 2 3 4 5 6 7 8 9) do ( for /l %%c in (1,1,10) do ( if not exist %%a%%b%%c goto :continue ) )
)
:continueПояснениеДля правильного использования вложенных циклов необходимо значительно изменить код. Например, написанное будет иметь ведущие нули.
“Обычный”for петли можно сразу разорвать простым goto команда, где for /lпетли не могут. Этот самый сокровенный кодfor /lцикл не может быть немедленно прерван, но общая точка прерывания присутствует после каждых 10 итераций (как написано). Самый внутренний цикл не обязательно должен состоять из 10 итераций – вам просто нужно правильно учесть математику, если вы выберете 100, 1000 или 2873 в этом отношении (если математика вообще имеет значение для цикла).
История Я нашел этот вопрос, пытаясь выяснить, почему определенный скрипт работает медленно. Оказывается, я использовал несколько циклов с традиционной структурой цикла:
set cnt=1
:loop
if "%somecriteria%"=="finished" goto :continue
rem do some things here
set /a cnt += 1
goto :loop
:continue
echo the loop ran %cnt% timesЭтот файл сценария стал довольно длинным и запускался с сетевого диска. Этот тип файла цикла вызывался, может быть, 20 раз, и каждый раз он повторялся 50-100 раз. Файл сценария запускался слишком долго. У меня возникла блестящая идея попытаться преобразовать его вfor /lпетля. Количество необходимых итераций неизвестно, но меньше 10000. Моя первая попытка была такой:
setlocal enabledelayedexpansion
set cnt=1
for /l %%a in (1,1,10000) do ( if "!somecriteria!"=="finished" goto :continue rem do some things here set /a cnt += 1
)
:continue
echo the loop ran %cnt% timesПримечание. Оказывается,for /lцикл можно немного ускорить, просто убедившись, что у него нет вывода. Мне удалось сделать это для заметного увеличения скорости:
setlocal enabledelayedexpansion
set cnt=1
@for /l %%a in (1,1,10000) do @( if "!somecriteria!"=="finished" goto :continue rem do some things here set /a cnt += 1
) > nul
:continue
echo the loop ran %cnt% timesВам не нужен отдельный командный файл для выхода из цикла с помощью exit /b, если вы используете call вместо goto, например
call :loop
echo loop finished
goto :eof
:loop
FOR /L %%I IN (1,1,10) DO ( echo %%I IF %%I==5 exit /b
)в этом случае “exit /b” завершит “вызов” и продолжит работу со строки после “вызова”. Таким образом, результат будет следующим:
1
2
3
4
5
loop finishedТак что я понимаю, что это довольно старо, но после долгих поисков я не смог найти ответ, который мне понравился, поэтому я нашел собственное решение для разрыва цикла FOR, которое немедленно останавливает итерацию, и подумал, что я поделюсь этим Это.
Он требует, чтобы цикл находился в отдельном файле, и использует ошибку в обработке ошибок CMD для немедленного сбоя пакетной обработки файла цикла при перенаправлении STDOUT DIR в STDIN.
ECHO Simple test demonstrating loop breaking.
ECHO.
CMD /C %~dp0\LOOP.cmd
ECHO.
ECHO After LOOP
PAUSEFOR /L %%A IN (1,1,10) DO ( ECHO %%A IF %%A EQU 3 DIR >&0 2>NUL )
)При запуске это приводит к следующему выводу. Вы заметите, что итерация и выполнение цикла прекращаются, когда%A = 3.
:>MainFile.cmd
:>ECHO Simple test demonstrating loop breaking.
Simple test demonstrating loop breaking.
:>ECHO.
:>CMD /C Z:\LOOP.cmd
:>FOR /L %A IN (1 1 10) DO (
ECHO %A IF %A EQU 3 DIR 1>&0 2>NUL
)
:>(
ECHO 1 IF 1 EQU 3 DIR 1>&0 2>NUL
)
1
:>(
ECHO 2 IF 2 EQU 3 DIR 1>&0 2>NUL
)
2
:>(
ECHO 3 IF 3 EQU 3 DIR 1>&0 2>NUL
)
3
:>ECHO.
:>ECHO After LOOP
After LOOP
:>PAUSE
Press any key to continue . . .Пример (используется тот же файл LOOP.cmd, что и выше):
@ECHO OFF
ECHO.
ECHO Simple test demonstrating loop breaking.
ECHO.
FOR /F "delims=" %%L IN ('CMD /C %~dp0\LOOP.cmd') DO SET VARIABLE=%%L
ECHO After LOOP
ECHO.
ECHO %VARIABLE%
ECHO.
PAUSE:>MainFile.cmd
Simple test demonstrating loop breaking.
After LOOP
3
Press any key to continue . . .Если вам нужно сохранить несколько переменных, вам нужно перенаправить их во временные файлы, как показано ниже.
@ECHO OFF
ECHO.
ECHO Simple test demonstrating loop breaking.
ECHO.
CMD /C %~dp0\LOOP.cmd
ECHO After LOOP
ECHO.
SET /P VARIABLE1=<%TEMP%\1
SET /P VARIABLE2=<%TEMP%\2
ECHO %VARIABLE1%
ECHO %VARIABLE2%
ECHO.
PAUSE@ECHO OFF
FOR /L %%A IN (1,1,10) DO ( IF %%A EQU 1 ECHO ONE >%TEMP%\1 IF %%A EQU 2 ECHO TWO >%TEMP%\2 IF %%A EQU 3 DIR >&0 2>NUL
):>MainFile.cmd
Simple test demonstrating loop breaking.
After LOOP
ONE
TWO
Press any key to continue . . .Я надеюсь, что другие найдут это полезным для прерывания циклов, которые в противном случае заняли бы слишком много времени из-за продолжающейся итерации.
Невозможно выйти из a до того, как он завершит все итерации.
Я отладил выполнениеFOR /Lпо процессу.
Microsoft могла бы документировать это лучше и избавить нас от всех этих усилий.
- Цикл — это просто
while (TRUE)иbreakпроисходит только при достижении предела итераций. - Когда
EXIT /bилиGOTOвстречается, никакие команды не выполняются до конца итераций. - Когда
EXITвстречается, процесс завершается.
FOR /L %%G in (1,1,5000000) do (ECHO Only once & GOTO :EOF) FOR /L %%G in (1,1,5000000) do (ECHO Only once & EXIT /b)0 секунд, но это завершаетcmd.exeпроцесс
FOR /L %%G in (1,1,5000000) do (ECHO Only once & EXIT)Как отметил jeb, остальная часть цикла пропускается, но оценивается, что делает FOR Решение слишком медленное для этой цели. Альтернатива:
set F=1
:nextpart
if not exist "%F%" goto :EOF
echo %F%
set /a F=%F%+1
goto nextpartВозможно, вам придется использовать отложенное расширение и call подпрограммы при использовании этого в циклах.
Чтобы правильно выйти из цикла for в DOS, просто перейдите на метку;
For /L %%f In (1,1,1000000) Do If Not Exist %%f Goto :EOFFor /L %%f In (1,1,1000000) Do If Not Exist %%f Goto:fileError
.. do something
.. then exit or do somethign else
:fileError
GOTO:EOFА еще лучше, добавить сообщения об ошибках:
set filename=
For /L %%f In (1,1,1000000) Do( set filename=%%f If Not Exist %%f set tempGoto:fileError
)
.. do something
.. then exit or do somethign else
:fileError
echo file does not exist '%filename%'
GOTO:EOFСделал небольшое исследование по этому вопросу, кажется, что вы цикл от 1 до 2147483647, с шагом 1.
(1, 1, 2147483647): первый номер – это начальный номер, следующий номер – шаг, а последний номер – конечный номер.
Отредактировано, чтобы добавить
Похоже, что цикл запускается до завершения независимо от условий тестирования. Я проверял
FOR /L %%F IN (1, 1, 5) DO SET %%F=6И это бежало очень быстро.
Поскольку это единственная строка в командном файле, вы можете попробовать команду EXIT:
FOR /L %%F IN (1, 1, 2147483647) DO @IF NOT EXIST %%F EXITОднако это также закроет окно приглашения DOS.



