Разное

For bat цикл: Циклы в языке сценариев Batch

Содержание

Выход из цикла FOR в цикле batch file?

Почему этот batch file никогда не выходит из цикла?

For /L %%f In (1,1,1000000) Do @If Not Exist %%f Goto :EOF

Разве Goto :EOF не должен вырваться из петли?

Редактировать:

Наверное, мне следовало спросить более определенно… как я могу вырваться из петли?

batch-file

for-loop

break

Поделиться

Источник


user541686    

18 июля 2011 в 05:02

8 ответов




10

Основываясь на второй правке Тима и этой странице вы могли бы сделать это:

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

Поделиться


wimh    

18 июля 2011 в 08:13



8

Вы можете просто использовать echo on , и вы увидите, что goto :eof или даже exit /b не работает так, как ожидалось.

Код внутри цикла больше не выполняется, но цикл расширяется для всех чисел до конца.

Вот почему это так медленно.

Единственный способ выйти из цикла FOR /L, по-видимому, является вариантом exit , как пример Виммеля, но это не очень быстро и не полезно для доступа к каким-либо результатам из цикла.

Это показывает 10 расширений, но ни одно из них не будет выполнено

echo on
for /l %%n in (1,1,10) do (
  goto :eof
  echo %%n
)

Поделиться


jeb    

18 июля 2011 в 08:39



3

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

Он требует, чтобы цикл находился в отдельном файле, и использует ошибку в обработке ошибок CMD, чтобы немедленно завершить пакетную обработку файла цикла при перенаправлении STDOUT из DIR в STDIN.

MainFile.cmd

ECHO Simple test demonstrating loop breaking.
ECHO.
CMD /C %~dp0\LOOP.cmd
ECHO.
ECHO After LOOP
PAUSE

LOOP.cmd

FOR /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 . . .

Если вам нужно сохранить одну переменную из цикла, сделайте цикл ECHO результатом переменной и используйте цикл FOR /F в MainFile.cmd для анализа выходных данных файла LOOP.cmd.

Пример (используя тот же файл LOOP.cmd, что и выше):

MainFile.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 . . .

Если вам нужно сохранить несколько переменных, вам нужно будет перенаправить их во временные файлы, как показано ниже.

MainFile.cmd

@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

LOOP.cmd

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

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

Поделиться


John Hofmann    

19 декабря 2016 в 08:44


  • Windows batch file необъяснимо переименовывает имя файла в цикле FOR

    Windows batch file необъяснимо переименовывает имя файла в цикле FOR У меня есть маленький Windows 7 batch file, чтобы переименовать библиотеку из MP3 имен файлов. Я включил в этот вопрос только последние несколько строк кода. Он отлично работает, за исключением одной проблемы с разделом кода,…

  • Установите неопределенные переменные в цикле batch file FOR

    В A batch file перечислено произвольное число переменных, некоторые определены, другие нет. Как я могу установить неопределенные (не заданные ни в какое значение) переменные с именами, начинающимися от _ до 1, в цикле FOR или другим итеративным способом? Приведенный ниже код печатает только…



2

Как отметил джеб , rest цикла пропускается , но оценивается, что делает решение FOR слишком медленным для этой цели. Альтернатива:

set F=1
:nextpart
if not exist "%F%" goto :EOF
echo %F%
set /a F=%F%+1
goto nextpart

Возможно, вам придется использовать задержанное расширение и подпрограммы call при использовании этого в циклах.

Поделиться


Michel de Ruiter    

28 января 2016 в 16:17



2

вам не нужен отдельный batch file для выхода из цикла с помощью exit /b, если вы используете call вместо goto like

call :loop

echo loop finished

goto :eof

:loop
FOR /L %%I IN (1,1,10) DO (
    echo %%I
    IF %%I==5 exit /b
)

в этом случае «выход /b»» выйдет из ‘call’ и продолжит работу с строки после ‘call’
Итак, выход таков:

1
2
3
4
5
loop finished

Поделиться


Nico van der Stok    

23 сентября 2019 в 19:56



2

Мой ответ

Используйте вложенные циклы 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

Объяснение
код должен быть значительно изменен, чтобы правильно использовать вложенные циклы. Например, то, что написано, будет иметь ведущие нули.

«Regular» for петли могут быть немедленно разорваны с помощью простой команды goto , где for /l петли не могут. Самый внутренний цикл for /l этого кода не может быть немедленно разорван, но общая точка останова присутствует после каждых 10 итераций (как написано). Самый внутренний цикл не должен иметь be 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

Включив echo , я быстро обнаружил, что цикл for /l все еще делает … что- то …, фактически ничего не делая. Он работал намного быстрее, но все же медленнее, чем я думал could/should. поэтому я нашел этот вопрос и закончил с идеей вложенного цикла, представленной выше.

Боковое замечание
оказывается, что цикл 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

Поделиться


avery_larry    

25 февраля 2020 в 19:31



0

Проведя небольшое исследование по этому вопросу, оказалось, что вы зацикливаетесь от 1 до 2147483647 с шагом 1.

(1, 1, 2147483647): первое число-это начальное число, следующее число-это шаг, а последнее число-это конечное число.

Отредактированы, Чтобы Добавить

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

FOR /L %%F IN (1, 1, 5) DO SET %%F=6

И он бежал очень быстро.

Второй Редактировать

Поскольку это единственная строка в batch file, вы можете попробовать команду EXIT:

FOR /L %%F IN (1, 1, 2147483647) DO @IF NOT EXIST %%F EXIT

Однако это также закроет окно приглашения DOS.

Поделиться


Tim    

18 июля 2011 в 05:08



0

Предполагая, что OP вызывает batch file с cmd.exe, чтобы правильно вырваться из for loop, просто получите метку;

Изменить это:

For /L %%f In (1,1,1000000) Do If Not Exist %%f Goto :EOF

До настоящего времени:

For /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 batch file: https://www.dostips.com/

Поделиться


The Coordinator    

12 апреля 2015 в 23:43


Похожие вопросы:

for loop в batch file

Возможный Дубликат : Случайная величина, не изменяющаяся в цикле “for” в цикле windows batch file У меня есть текстовый файл со списком файлов, которые я хочу переименовать. Это мой код:…

Как получить вывод цикла FOR в переменную в цикле batch file

У меня есть такой файл, который нужно разобрать и извлечь номер версии. [assembly: AssemblyTrademark()] [assembly: AssemblyCulture()] // Setting ComVisible to false makes the types in this assembly…

Batch file переменные, инициализированные в a for loop

У меня есть batch file, который инициализирует переменные через SET внутри for loop для набора файлов на диске: for %%f in (%MYTARGETDIR%\*config.xml) do ( SET TMPFILE=%%F.tmp echo In loop %TMPFILE%…

Как сделать петлю в Windows batch file?

Каков синтаксис цикла FOR в цикле Windows batch file?

Windows batch: вызов более одной команды в цикле FOR?

Возможно ли в Windows batch file вызвать более одной команды в одном цикле FOR ? Допустим например я хочу напечатать имя файла и после удалить его: @ECHO OFF FOR /r %%X IN (*.txt) DO (ECHO %%X DEL…

Windows batch file необъяснимо переименовывает имя файла в цикле FOR

Windows batch file необъяснимо переименовывает имя файла в цикле FOR У меня есть маленький Windows 7 batch file, чтобы переименовать библиотеку из MP3 имен файлов. Я включил в этот вопрос только…

Установите неопределенные переменные в цикле batch file FOR

В A batch file перечислено произвольное число переменных, некоторые определены, другие нет. Как я могу установить неопределенные (не заданные ни в какое значение) переменные с именами, начинающимися…

Выход из вложенного batch file

У меня есть 4 пакетных файла, предположим a.bat, b.bat, c.bat и d.bat. Теперь эти пакетные файлы вызываются таким образом, что a.bat вызывает b.bat, b.bat вызывает c.call и так далее. Если я получаю…

Установите переменную в цикле for /f, не работающую вне цикла

Введите описание изображения здесь я пытаюсь SET одну или две переменные в цикле for /f и использовать их вне цикла, но до сих пор мне это не удалось, после нескольких часов попыток я наконец сдался. ..

Batch file: передать имя файла в sub из цикла FOR

Этот вопрос касается правильного синтаксиса передачи аргументов имени файла подпрограмме в batch file. Мне кажется, что этот вопрос должен был быть задан раньше, но я не могу найти правильного…

Чтение переменной в файле for loop в файле bat

Я пытаюсь напечатать строки из файла в приведенном ниже for loop:

SET my-file="C:\tmp\xxx.txt"
@echo off
for /f "tokens=*" %%a in (%my-file%) do (
  echo line=%%a
)

Где:
C:\tmp\xxx.txt содержит:

a
b
c
d

Но %my-file% не расширяется. Как использовать переменную в for loop?

windows

batch-file

Поделиться

Источник


u123    

20 апреля 2015 в 12:36

2 ответа


  • Ошибка с FOR LOOP в файле BAT (WINDOWS)

    Вот for loop в файле bat, этот цикл принимает числа от 1 до 100 и использует оператор mod для каждого целого числа. У меня возникли трудности с вычислением среднего значения после окончания цикла? может ли кто-нибудь помочь мне с этим? Я попробовал это утверждение: echo VAR / 100 echo !VAR! / 100…

  • Bat-файл не выполняется For loop

    У меня есть следующие строки в файле .bat, когда они запускаются в командной строке, они все работают, но когда я запускаю файл .bat, он попадает в первый for loop, а затем заканчивается. Я пытаюсь воссоздать структуру папок, а затем только скопировать файлы .pdf в новое место. После чего я хочу…



1

Ставя кавычки вокруг пути, переменная рассматривается как строка, а не путь. Таким образом, %my-file% будет содержать имя файла, а не его содержимое.

вы можете использовать тот же код без кавычек (если путь позволяет это) или использовать type для чтения содержимого файла :

SET my-file="C:\tmp\xxx. txt"
@echo off
for /f "tokens=*" %%a in ('type %my-file%') do (
  echo line=%%a
)

Поделиться


Loïc MICHEL    

20 апреля 2015 в 13:03



0

Ваш код работает. Если у вас есть проблемы, удалите эхо — сигнал, который показывает вам, что он работает.

Это ваша программа в ее сущности.

for /f "tokens=*" %%a in ("C:\tmp\xxx.txt") do echo line=%%a

И он должен печататься, потому что кто-то поставил его в кавычки, C:\tmp\xxx.txt так как кавычки означают, что строка-это содержание. Ни одна цитата single или double не является именем файла. Одинарная кавычка — это команда.

Если вам нужны кавычки, вы используете опцию UseBackQ для перемещения значений кавычек single/double/no.

увидеть For /?

Большая часть вашей партии — вуду.

Лишние ненужные скобки и вставление литералов в переменные.

Поделиться


Trigger    

20 апреля 2015 в 13:07


Похожие вопросы:

Обработка ошибок в файле .bat

У меня есть файл .bat, который запускает два файла SQL и перемещает файлы. Мне нужно иметь некоторую обработку ошибок в этом файле .bat. Я хочу, чтобы он взял ошибку, сгенерированную в sql, и…

Bat файл для изменения значения переменной в файле

Для файла deferredreportsdaemon.ini он имеет содержание: ApplicationDatabaseClass=com.systems.pool.MySQLConnectionManager ApplicationDatabaseUser=administrator ApplicationDatabasePassword=test…

действительно слияние в файле .bat

Как объединить два текстовых файла в файл .bat? Или, по крайней мере, как прочитать следующую строку/тестовый конец файла в файле .bat? Можно ли объединить два текстовых файла с помощью скрипта…

Ошибка с FOR LOOP в файле BAT (WINDOWS)

Вот for loop в файле bat, этот цикл принимает числа от 1 до 100 и использует оператор mod для каждого целого числа. У меня возникли трудности с вычислением среднего значения после окончания цикла?…

Bat-файл не выполняется For loop

У меня есть следующие строки в файле .bat, когда они запускаются в командной строке, они все работают, но когда я запускаю файл .bat, он попадает в первый for loop, а затем заканчивается. Я пытаюсь…

Передача содержимого переменной в файле .bat в переменную в файле VB

Я пытаюсь написать код VB, где файл .bat загружается из VB, а затем в соответствии с результатом batch file выполняются другие действия из VB. Для запуска файла .bat из VB нет проблем. Моя проблема…

Как получить чтение ввода-вывода из указанной задачи в списке задач в переменную файла bat

Используя файл Windows 7 .bat, я хотел бы получить количество операций ввода-вывода для конкретной задачи в переменную. Я пробовал tasklist.exe, но он показывает только использование памяти, и я не…

Эхо переменной в файле .bat из текстового файла

Добрый день, я все еще новичок в командах DOS, я хочу, если это еще возможно. У меня есть .bat , который я хочу назвать значением из текстового файла. Я имею в виду, что делаю файл .bat…

Вызов функции в файле .bat из другой команды .bat in Windows

Я пытаюсь вызвать функцию, например :dosomething, которая находится в моем файле 1.bat. эта функция существует в файле 2.bat. Как я могу назвать его там ?

Разделитель труб в файле .bat

Я пытаюсь экспортировать таблицу из BigQuery в Google CLoud Storage (GCS) с помощью команды bq в файле bat. Команда имеет параметр для экспорта в виде файла с разделителями каналов. Команда работает…

windows — Простой цикл в bat файле, ввод с клавиатуры, сравнение. Некорректно работает программа

Во программа

@echo off
cls
 for /l %%i in (0,1,2) do (
  set /p v="Enter Yes or No: "
  if "%v%"=="Yes" (
    echo RIGHT
  ) else (
    echo WRONG
 )
)

Собственно я с клавиатуры ввожу либо Yes либо No и в зависимости от того что я ввёл у меня выполняется условие, проблема в том что запустив первый раз программу у меня запоминается первое значение v и далее независимо что я введу у меня в переменной v будет сохраняться значение которое я вводил в последнем запуске программы в конце.
Приведу пример:
1-й запуск:

Enter Yes or No: No
WRONG
Enter Yes or No: Yes
WRONG
Enter Yes or No: Yes
WRONG

Я ввёл сначала No оно отработало правильно затем Yes и начиная с этого оно теперь не меняет значение в переменной vв конце я опять ввёл YES и опять получил результат WRONG
2-й запуск:

Enter Yes or No: Yes
RIGHT
Enter Yes or No: No
RIGHT
Enter Yes or No: No
RIGHT

Тут она запомнила последнее значение прошлого запуска где я вводил YES и так далее…
и так далее то есть он запоминает последнее значение из предыдущего запуска программы и везде его пихает
Я пробовал отлаживать и вне цикла у меня это работает великолепно но суть в том что я обрабатываю файл и без цикла я не могу обойтись вот пример как это примерно работает без цикла

@echo off
cls
set /p v="Enter Yes or No: "
if "%v%"=="Yes" (
    echo RIGHT
) else (
    echo WRONG
)
set /p v="Enter Yes or No: "
if "%v%"=="Yes" (
    echo RIGHT
) else (
    echo WRONG
)

set /p v="Enter Yes or No: "
if "%v%"=="Yes" (
    echo RIGHT
) else (
    echo WRONG
)

Тут у меня уже три раза проделывается всё тоже самое что и в цикле но теперь если я пишу Yes он выводит RIGHT затем я пишу No он выводит WRONG и третий раз пишу Yes он выводит RIGHT, в общем всё работает как и подразумевалось.
Вот программа которая должна работать с файлом я просто беру и обрабатываю текстовый документ и должен вводит либо да либо нет в зависимости от считанных данных

@echo off
cls
set files=C:
for /f "delims=,  eol=; skip=1 tokens=1,2" %%i in (users.txt) do (
    echo User: %%i  
    set /p %choice%="Enter: "
    if "%choice%"=="Yes" (
        echo %choice%
        echo %%j
    ) else (
        echo %choice%
        echo ERRRAIRI
    )
)

Я уже не могу понять как сделать что бы это работало всё в цикле правильно как и задумывалось.

batch-file — Пакетный вложенный цикл не работает

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

Используемая команда это loadMods.bat mod1.txt mod2.txt ... modN.txt

Это код, который я использую

setlocal EnableDelayedExpansion
set /p outputFile="Output File:"

for %%x in (%*) do (
    echo Applying mod from file %%x
    for /f "delims=" %%y in (%%x) do echo %%y >> %fileOutput%
)
echo Finished.
pause

Второй цикл работает нормально, если он находится вне первого цикла, но когда я использую вложенные циклы, я получаю ошибку The syntax of the command is incorrect. во втором цикле.

1

Teodor Vecerdi

24 Июн 2017 в 17:19

2 ответа

Лучший ответ

Как сказал @SomethingDark, это вызвано простой типографской проблемой.

for /f "delims=" %%y in (%%x) do echo %%y >> %fileOutput%

Переменная fileoutput не была определена, поэтому CMD.EXE видит:

for /f "delims=" %%y in (%%x) do echo %%y >>

И после >> он не может найти аргумент, вызывающий ошибку.


Кстати, при отладке командных файлов я бы порекомендовал:

  • удалить @echo off
  • запустить скрипт из CMD.exe

Этот метод показывает, какие именно команды не работают, что облегчает отладку.

2

25 Июн 2017 в 02:16

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

@Echo Off
If "%~1"=="" Exit/B
Set/P "outputFile= Output File: "
Type %* 2>Nul >"%outputFile%"
Echo( Finished. 
Pause

Ответственность за обеспечение достоверности всех переданных аргументов и входной строки лежит на вас.

Вы даже можете обойти входные параметры:

@Echo Off
Set/P "outputFile= Output File: "
Type mod*.txt 2>Nul >"%outputFile%"
Echo( Finished.
Pause

1

Compo
24 Июн 2017 в 15:32

44737364

Developer notes: Циклы в бат-файле

 Здесь приведены примеры организации цикла в батнике.
________________
@echo off
rem Включение расширенной обработки команд
setlocal enabledelayedexpansion
rem Инициализация переменной i (счетчик)
set /a i=0
rem Метка условия выполнения цикла
:if
if %i% LSS 10 (
    goto count
) else (
    goto end
)
rem Функциональная метка, содержащая выполнимые команды с последующим заполнением счетчика i
:count
echo Hello world!
set /a i=i+1
goto if
rem Финишная метка
:end
echo Loop finished…
pause
exit
________________
Можно внести небольшую интерактивность, например предоставив возможность выбора условий окончания цикла
________________
@echo off
rem Включение расширенной обработки команд
setlocal enabledelayedexpansion
rem Инициализация переменной i (счетчик)
set /a i=0
set /p n=Enter border
rem Метка условия выполнения цикла
:if
if %i% LSS %n% (
    goto count
) else (
    goto end
)
rem Функциональная метка, содержащая выполнимые команды с последующим заполнением счетчика i
:count
echo Hello world!
set /a i=i+1
goto if
rem Финишная метка
:end
echo Loop finished…
pause
exit /b
________________
Циклы удобны в практических целях, например:
________________
@echo off
rem Включение расширенной обработки команд
setlocal enabledelayedexpansion
rem Инициализация переменной i (счетчик)
set /a i=0
set /p n=Enter border
rem Метка условия выполнения цикла
:if
if %i% LSS %n% (
    goto count
) else (
    goto end
)
rem Функциональная метка, содержащая выполнимые команды с последующим заполнением счетчика i
:count
set /a i=i+1
ping 191. 168.0.%i% -n 1
goto if
rem Финишная метка
:end
echo Loop finished…
pause
exit /b

НОУ ИНТУИТ | Лекция | Язык интерпретатора Cmd.exe. Командные файлы

Аннотация: Описываются возможности языка командных файлов: работа с переменными и параметрами командной строки, реализация циклов, условных операторов и операторов перехода. Даются примеры обработки текстовых файлов с помощью командных файлов

Язык интерпретатора Cmd.exe. Командные файлы

Язык оболочки командной строки (shell language) в Windows реализован в виде командных (или пакетных) файлов. Командный файл в Windows — это обычный текстовый файл с расширением bat или cmd, в котором записаны допустимые команды операционной системы (как внешние, так и внутренние), а также некоторые дополнительные инструкции и ключевые слова, придающие командным файлам некоторое сходство с алгоритмическими языками программирования. Например, если записать в файл deltmp.bat следующие команды:

C:\
CD %TEMP%
DEL /F *.tmp

и запустить его на выполнение (аналогично исполняемым файлам с расширением com или exe), то мы удалим все файлы во временной директории Windows. Таким образом, исполнение командного файла приводит к тому же результату, что и последовательный ввод записанных в нем команд. При этом не проводится никакой предварительной компиляции или проверки синтаксиса кода; если встречается строка с ошибочной командой, то она игнорируется. Очевидно, что если вам приходится часто выполнять одни и те же действия, то использование командных файлов может сэкономить много времени.

Вывод сообщений и дублирование команд

По умолчанию команды пакетного файла перед исполнением выводятся на экран, что выглядит не очень эстетично. С помощью команды ECHO OFF можно отключить дублирование команд, идущих после нее (сама команда ECHO OFF при этом все же дублируется). Например,

REM Следующие две команды будут дублироваться на экране …
DIR C:\
ECHO OFF
REM А остальные уже не будут
DIR D:\

Для восстановления режима дублирования используется команда ECHO ON. Кроме этого, можно отключить дублирование любой отдельной строки в командном файле, написав в начале этой строки символ @, например:

ECHO ON
REM Команда DIR C:\ дублируется на экране
DIR C:\
REM А команда DIR D:\ — нет
@DIR D:\

Таким образом, если поставить в самое начало файла команду

то это решит все проблемы с дублированием команд.

В пакетном файле можно выводить на экран строки с сообщениями. Делается это с помощью команды

Например,

@ECHO OFF
ECHO Привет!

Команда ECHO. (точка должна следовать
непосредственно за словом «ECHO»)
выводит на экран пустую строку. Например,

@ECHO OFF
ECHO Привет!
ECHO.
ECHO Пока!

Часто бывает удобно для просмотра сообщений, выводимых из пакетного файла, предварительно полностью очистить экран командой CLS.

Используя механизм перенаправления ввода/вывода (символы > и >>), можно направить сообщения, выводимые командой ECHO, в определенный текстовый файл. Например:

@ECHO OFF
ECHO Привет! > hi.txt
ECHO Пока! >> hi.txt

С помощью такого метода можно, скажем,
заполнять файлы-протоколы с отчетом о
произведенных действиях. Например:

@ECHO OFF
REM Попытка копирования
XCOPY C:\PROGRAMS D:\PROGRAMS /s
REM Добавление сообщения в файл report.txt в случае
REM удачного завершения копирования
IF NOT ERRORLEVEL 1 ECHO Успешное копирование >> report.txt
Использование параметров командной строки

intuit.ru/2010/edi»>При запуске пакетных файлов в командной строке можно указывать произвольное число параметров, значения которых можно использовать внутри файла. Это позволяет, например, применять один и тот же командный файл для выполнения команд с различными параметрами.

Для доступа из командного файла к параметрам командной строки применяются символы %0, %1, …, %9 или %*. При этом вместо %0 подставляется имя выполняемого пакетного файла, вместо %1, %2, …, %9 — значения первых девяти параметров командной строки соответственно, а вместо %* — все аргументы. Если в командной строке при вызове пакетного файла задано меньше девяти параметров, то «лишние» переменные из %1 – %9 замещаются пустыми строками. Рассмотрим следующий пример. Пусть имеется командный файл copier.bat следующего содержания:

@ECHO OFF
CLS
ECHO Файл %0 копирует каталог %1 в %2
XCOPY %1 %2 /S

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

copier.bat C:\Programs D:\Backup

то на экран выведется сообщение

Файл copier.bat копирует каталог C:\Programs в D:\Backup

и произойдет копирование каталога C:\Programs со всеми его подкаталогами в D:\Backup.

При необходимости можно использовать более девяти параметров командной строки. Это достигается с помощью команды SHIFT, которая изменяет значения замещаемых параметров с %0 по %9, копируя каждый параметр в предыдущий, то есть значение %1 копируется в %0, значение %2 – в %1 и т.д. Замещаемому параметру %9 присваивается значение параметра, следующего в командной строке за старым значением %9. Если же такой параметр не задан, то новое значение %9 — пустая строка.

Рассмотрим пример. Пусть командный файл my.bat вызван из командной строки следующим образом:

intuit.ru/2010/edi»>Тогда %0=my.bat, %1=p1, %2=p2, %3=p3, параметры %4 – %9 являются пустыми строками. После выполнения команды SHIFT значения замещаемых параметров изменятся следующим образом: %0=p1, %1=p2, %2=p3, параметры %3 – %9 – пустые строки.

При включении расширенной обработки команд SHIFT поддерживает ключ /n, задающий начало сдвига параметров с номера n, где n может быть числом от 0 до 9.

Например, в следующей команде:

параметр %2 заменяется на %3, %3 на %4 и т.д., а параметры %0 и %1 остаются без изменений.

Команда, обратная SHIFT (обратный сдвиг), отсутствует. После выполнения SHIFT уже нельзя восстановить параметр (%0), который был первым перед сдвигом. Если в командной строке задано больше десяти параметров, то команду SHIFT можно использовать несколько раз.

В командных файлах имеются некоторые возможности синтаксического анализа заменяемых параметров. Для параметра с номером n (%n) допустимы синтаксические конструкции (операторы), представленные в табл. 3.1.

Таблица
3.1.
Операторы для заменяемых параметров
ОператорыОписание
%~FnПеременная %n расширяется до полного имени файла
%~DnИз переменной %n выделяется только имя диска
%~PnИз переменной %n выделяется только путь к файлу
%~NnИз переменной %n выделяется только имя файла
%~XnИз переменной %n выделяется расширение имени файла
%~SnЗначение операторов N и X для переменной %n изменяется так, что они работают с кратким именем файла
%~$PATH:nПроводится поиск по каталогам, заданным в переменной среды PATH, и переменная %n заменяется на полное имя первого найденного файла. Если переменная PATH не определена или в результате поиска не найден ни один файл, эта конструкция заменяется на пустую строку. Естественно, здесь переменную PATH можно заменить на любое другое допустимое значение

Данные синтаксические конструкции можно объединять друг с другом, например:

%~DPn — из переменной %n выделяется имя диска и путь,

%~NXn — из переменной %n выделяется имя файла и расширение.

Рассмотрим следующий пример. Пусть мы находимся в каталоге C:\TEXT и запускаем пакетный файл с параметром Рассказ.doc ( %1=Рассказ.doc ). Тогда применение операторов, описанных в табл. 3.1, к параметру %1 даст следующие результаты:

%~F1=C:\TEXT\Рассказ.doc
%~D1=C:
%~P1=\TEXT\
%~N1=Рассказ
%~X1=.doc
%~DP1=C:\TEXT\
%~NX1=Рассказ.doc

Задержка времени (пауза, тайм-аут) в бат-файле

Задержка времени (пауза, тайм-аут) в бат-файле

Вот, нашёл в Сети рабочий пример для устройства задержки времени
(пауза, тайм-аут) при выполнении команды в bat-файле:

echo wscript.Sleep 30000>»%temp%\sleep30.vbs»
cscript //nologo «%temp%\sleep30.vbs»
del «%temp%\sleep30.vbs»

Работает в любой ОС Windows, аж бегом

Зачем нужна задержка (пауза, тайм-аут) при выполнении команды в bat-файле?

У всех – по-разному.
Лично мне она (пауза) понадобилась вот для чего:

– Взял простенький bat-файл для очистки временных папок и бросил его в АВТОЗАГРУЗКУ
Прикололся, типа – чтобы этот батничек чистил временные каталоги при запуске системы.
Текст батника вытащил из стандартного Total Commander-a:

cmd /c title Очистка временной папки &cd/d %temp%&rd/s/q %temp% 2>nul &cd/d %tmp%&rd/s/q %tmp% 2>nul &cd/d C:\Windows\Prefetch &del *.pf 2>nul &cd/d C:\Windows\Temp&rd/s/q c:\windows\temp 2>nul

Всё-бы ничего, да только такая процедура очистки временных папок при загрузке –
сносит полезные файлы и система выдаёт окно ошибки

Досадно.
Однако, устройство паузы в 30 сек. решило всю проблему.
И система грузится, и папки темпов — чистятся.

Полный текст bat-файла стал теперь таким:

echo wscript.Sleep 30000>»%temp%\sleep30.vbs»
cscript //nologo «%temp%\sleep30.vbs»
del «%temp%\sleep30.vbs»
cmd /c title Очистка временной папки &cd/d %temp%&rd/s/q %temp% 2>nul &cd/d %tmp%&rd/s/q %tmp% 2>nul &cd/d C:\Windows\Prefetch &del *.pf 2>nul &cd/d C:\Windows\Temp&rd/s/q c:\windows\temp 2>nul

Прим. Лошади понятно, что изменив цифру 30 на своё значение,
можно получить другие величины паузы в секундах в bat-файле.

Начиная с VISTA, в операционных системах семейства Windows присутствует команда TIMEOUT. Эта команда принимает значение таймаута, равного фиксированному периоду времени ожидания (в секундах) до выполнения команды или ожидание до нажатия клавиши. Имеется также параметр, зaдающий игнорирование нажатий клавиш.

Синтаксис
TIMEOUT [/T] 50 [/NOBREAK]

Параметры

/T 50

Таймаут = 50 сек. Время ожидания в секундах. Допустимый интервал: от -1 до 99999 секунд. Значение, равное -1 задает неограниченное время ожидания до нажатия клавиши.

/NOBREAK

Игнорировать нажатия клавиш, ждать указанное время.

/?

Отображение справки в командной строке.

Примеры

TIMEOUT /?
TIMEOUT /T 10
TIMEOUT /T 300 /NOBREAK
TIMEOUT /T -1

Весь текст примера можно внести в bat-файл,
запустить и посмотреть, как это работает.
Впечатляет.

For — Цикл по файлам — Windows CMD

For — Цикл по файлам — Windows CMD — SS64.com

Условно выполнить команду для нескольких файлов.

 Синтаксис
      FOR %% параметр IN ( набор ) DO  команда 

Ключ
     набор : набор из одного или нескольких файлов, разделенных любым стандартным разделителем. 
                 в круглых скобках (файл1, файл2). Можно использовать подстановочные знаки.

     команда : выполняемая команда, включая любые параметры.Это может быть одна команда, или если вы ее заключите
                 в (скобках) несколько команд, по одной в строке.

   Параметр %%: заменяемый параметр:
                 например в пакетном файле используйте %% G
                      (в командной строке% G) 

Примеры

Копировать один файл
FOR %% G IN (MyFile.txt) DO copy %% G d: \ backups \

Скопировать список из нескольких файлов
FOR %% G IN (Myfile.txt SecondFile .txt) НЕОБХОДИМО копировать %% G d: \ backups \

FOR %% G IN («C: \ demo files \ file1.txt» «C: \ demo files \ File2.txt») DO копировать %% G d: \ backups \

Команда FOR в основном используется для обработки файлы, но вы также можете обработать текстовую строку:
FOR %% G IN («Hello World») DO Echo %% G
На самом деле это не очень полезно, так как Echo Hello World

. Хотя могут использоваться подстановочные знаки, альтернативным методом обработки файлов является
чтобы позволить FOR / F обрабатывать вывод команды ‘DIR / b’. Это может быть полезно, если вы хотите использовать DIR
варианты вроде сортировки.

Уровни ошибок

Команда FOR обычно не устанавливает никаких уровней ошибок, оставляя это для вызываемой команды .
Одно исключение — использование подстановочного знака. Если подстановочный знак не соответствует ни одному файлу, FOR вернет% ERRORLEVEL% = 5

.

FOR сам по себе не устанавливает и не сбрасывает уровень ошибки.
FOR — это внутренняя команда.

«Тьма царит у подножия маяка» ~ Японская пословица

Связанные команды:

FOR — Цикл команд.
FOR / R — Перебирать файлы (рекурсивные подпапки).
FOR / D — просмотр нескольких папок.
FOR / L — Цикл по диапазону чисел.
FOR / F — Перебирать элементы в текстовом файле.
FOR / F — цикл вывода команды.
FORFILES — Пакетная обработка нескольких файлов.
GOTO — указание пакетной программе перейти к помеченному
линия.
IF — Условное выполнение команды.
Эквивалентная команда bash (Linux):
for — развернуть слова и выполнить команды


Авторские права © 1999-2021 SS64.com
Некоторые права защищены.

For — Цикл по диапазону чисел — Windows CMD

For — Цикл по диапазону чисел — Windows CMD — SS64.com

Условно выполнить команду для диапазона чисел.

 Синтаксис
      ДЛЯ  / L  %%  параметр  IN ( начало, шаг, конец ) DO  команда 

Ключ
     начало : первое число
     шаг : величина увеличения последовательности
     конец : последний номер

     команда : выполняемая команда, включая любые параметры.Это может быть одна команда, или если вы ее заключите
                 в (скобках) несколько команд, по одной в строке.

   %%  параметр : заменяемый параметр:
                 в пакетном файле используйте %% G (в командной строке% G) 

Итак, (20, -5,10) сгенерирует последовательность (20 15 10)

(1,1,5) сгенерирует последовательность 1 2 3 4 5

Все числа должны находиться в диапазоне 32-битных целых чисел со знаком (от -2 147 483 648 до 2 147 483 647)

Помимо целых чисел, в определенных пределах можно сравнивать шестнадцатеричные и восьмеричные числа.

Если start, step, end оставлены равными нулю или (0), тогда команда будет повторяться бесконечно, Ctrl-C отменит весь скрипт.

Если вы используете команду FOR в командной строке, а не в пакетной программе, используйте только один знак процента:% G вместо %% G .

FOR сам по себе не устанавливает и не сбрасывает уровень ошибки.
FOR — это внутренняя команда.

Примеры

Счет от 1 до 5

FOR / L %% G IN (1,1,5) DO echo %% G

Нечисловые списки могут использовать стандартную команду FOR:

FOR %% G IN (вс пн вт ср чт пт сб) DO echo %% G

Создать 1000 пронумерованных копий файла:

FOR / l %% G в (1,1,1000) НЕОБХОДИМО копировать исходный файл.txt NewFile %% G.txt

«Большая часть того, что делает жизнь приятной, — это последовательность маленькой белой лжи» — Филип Терциан

Связанные команды:

FOR — Цикл команд.
FOR — Перебирать набор файлов в одной папке.
FOR / R — Перебирать файлы (рекурсивные подпапки).
FOR / D — просмотр нескольких папок.
FOR / F — Перебирать элементы в текстовом файле.
FOR / F — цикл вывода команды.
FORFILES — Пакетная обработка нескольких файлов.
GOTO — Указать пакетной программе перейти к отмеченной строке.
IF — Условное выполнение команды.
Powershell: ForEach-Object — цикл для каждого объекта в конвейере / пока.
Эквивалентная команда bash (Linux): for — развернуть слова и выполнить команды .


Авторские права © 1999-2021 SS64.com
Некоторые права защищены.

For / f — Цикл по тексту — Windows CMD

For / f — Цикл по тексту — Windows CMD — SS64.ком

Команда цикла: для набора файлов — условно выполнить команду для каждого элемента.

 Синтаксис
        ДЛЯ  / F  [" options "] %%  параметр  IN ( filenameset ) Команда DO  
      
        ДЛЯ  / F  [" опции "] %%  параметр  IN ("Текстовая строка для обработки") DO  команда 

Ключ
   опции:
      delims =  xxx  Символ (символы) разделителя (по умолчанию = пробел)

      skip =  n  Число строк, которые нужно пропустить в начале файла.(по умолчанию = 0)
 
      eol =; Символ в начале каждой строки для обозначения комментария
                   По умолчанию стоит точка с запятой;

      tokens =  n  Определяет, какие пронумерованные элементы читать из каждой строки
                  (по умолчанию = 1)

      usebackq Используйте альтернативный стиль цитирования:
                   - Используйте двойные кавычки для длинных имен файлов в " filenameset ".- Используйте одинарные кавычки для "Текстовой строки для обработки"
                   - Используйте обратные кавычки для `command to process`

     Набор имен файлов  Набор из одного или нескольких файлов, заключенных в круглые скобки (файл1, файл2).

     команда  Команда для выполнения, включая любые параметры.
                  Это может быть одна команда, или если вы ее заключите
                  в скобках - несколько команд, по одной в строке.
  
   %%  параметр  Заменяемый параметр:
                  в пакетном файле используйте %% G (в командной строке% G) 

FOR / F обработка текстового файла состоит из чтения файла, по одной строке текста за раз, а затем разбиения строки на отдельные элементы данных, называемые «токенами».Затем выполняется команда DO с параметром (ами), установленным на найденный токен (ы).

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

.

Внутри цикла FOR на видимость переменных влияет SETLOCAL EnableDelayedExpansion, по умолчанию изменения переменных внутри цикла не будут видны до завершения цикла.

использования backq

Эта опция полезна при работе с набором файлов , который представляет собой длинное имя файла, содержащее пробелы, он позволяет вам заключать имя файла в двойные кавычки.
Символ обратной кавычки `находится чуть ниже клавиши ESC на большинстве клавиатур.
Имена файлов, не содержащие пробелов, по-прежнему можно ссылаться без кавычек.

Usebackq может быть сокращено до useback (недокументировано).

Пропустить

SKIP пропустит обработку ряда строк с начала файла.
SKIP включает пустые строки, но после завершения SKIP FOR / F игнорирует (не повторяет) пустые строки.

eol

Знак конца строки по умолчанию — точка с запятой ‘;’ когда команда FOR читает текстовый файл (или даже строку символов), любая строка, НАЧИНАЮЩАЯСЯ с символа eol, будет проигнорирована. Другими словами, это рассматривается как комментарий.
Используйте eol = X, чтобы изменить символ eol на X.

Часто вам нужно отключить эту функцию, чтобы обрабатывать каждую строку вашего файла данных, теоретически «eol =» должен выключить эту функцию, но на практике это не работает правильно — она ​​установит eol на любое следующее символ, часто кавычка или пробел.= %% a в (file.txt) do … (обсуждение этого вопроса см. на форуме)

Ни один из вариантов не может быть повторен, если вы включите, скажем,
«eol = # eol = @», то применяется только второй, «eol = @».

Обрезки корней

Можно указать более одного разделителя, поэтому строку вида ‘abcd + efg + hijk; lmno; pqr’ можно разбить с помощью delims =; +.

for / f «tokens = 1,2,3,4,5 delims =; +» %% G в (filename.txt) do echo %% G %% H %% K

В качестве разделителя можно использовать практически любой символ, но они чувствительны к регистру.
Если вы не укажете разделители, по умолчанию будет использоваться значение «delims = »

.
Разделители

всегда должны быть последним элементом в параметрах string «tokens = 3 delims =» not «delims = tokens = 3»
Это связано с тем, что кавычки вокруг строки options выполняют двойную функцию в качестве терминатора для символа (ов) разделителей, что особенно важно, когда этот символ является пробелом.

Вы можете удалить все разделители, используя «delims =», это поместит все в строке в первый токен.»%% G в (filename.txt) do echo %% G %% H %% I

n.b. некоторые текстовые редакторы вводят символ TAB как серию пробелов.

жетонов

токенов = 2,4,6 вызовут обработку второго, четвертого и шестого элементов в каждой строке.

токенов = 2-6 вызовут второй, третий, четвертый, пятый и шестой элементы на каждом
линия для обработки.

tokens = * вызовет обработку всех элементов в каждой строке.

tokens = 3 * будет обрабатывать третий токен и 4-й + все последующие элементы, это также можно записать как tokens = 3, *

Каждый указанный токен приведет к выделению соответствующей буквы параметра.Буквы, используемые для токенов, чувствительны к регистру.

Если последним символом в строке tokens = является звездочка, то дополнительные
параметры выделяются для всего остального текста в строке.

В качестве токенов FOR могут использоваться следующие символы ASCII:
63–93 ASCII включительно, 31 токен:? @ А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я [\]
ASCII 95-123 включительно, 29 токенов: _ `a b c d e f g h i j k l m n o p q r s t u v w x y z {
(есть еще несколько символов, которые можно использовать, но требуется экранирование)

Одна команда FOR / F никогда не может проанализировать более 31 токена, для использования большего количества требуется обходной путь с несколькими командами FOR.

Числа, указанные в tokens =, автоматически сортируются, поэтому, например, tokens = 5,7,1-3 и tokens = 1,2,3,5,7 дают одинаковый результат.

Сопоставление одного и того же токена более одного раза (токены = 1,2,1) может привести к непредсказуемым результатам. Переменные токена, конечно, можно использовать несколько раз: Echo %% G %% H %% G

Переменные токенов FOR (или имена параметров) являются глобальными, поэтому в сложных сценариях, которые вызывают один оператор FOR из другого оператора FOR, вы можете ссылаться на него. к обоим наборам параметров.

Приоритет / приоритет параметров команды FOR: usebackq> skip> delims> eol> tokens

Примеры

Скопируйте файлы, перечисленные в текстовом файле, в новое место назначения:

FOR / f «delims =» %% G в (files.txt) ДОЛЖНО копировать «\\ source \ folder \ %% G» «H: \ destination \ %% G»

Предполагается, что файл files.txt содержит по одному имени файла в каждой строке.

Извлечь данные из текстового файла, содержащего символы и запятые (но без пробелов и других знаков препинания):

Январь, Снежный, 02
Февраль, Дождливая, 15
March, Sunny, 25

FOR / F «tokens = 1,3 delims =,» %% G IN (weather.txt) DO @echo %% G %% H

Сложная часть — разбить каждую строку на правильные токены, в этом случае я разделяю запятую ‘,’
это разбивает строку на 3 фрагмента текста, и мы извлекаем первый и третий элементы с помощью «tokens = 1,3»

токен = 1 (%% G) токен = 2 токен = 3 (%% H)
(игнорируется)
январь 02
февраль 15
март 25

%% G объявляется в операторе FOR, а %% H неявно объявляется через параметр tokens =.

Альтернативный способ получить те же данные:
FOR / F «tokens = 1,2,3 delims =,» %% G IN (weather.txt) DO @echo %% G %% I

Разделение строки, содержащей пробелы.

Это можно сделать так же, как указано выше, заменив delims = на delims =

Можно указать параметры tokens = и / или delims = в любом порядке, но всякий раз, когда указываются и разделители, и токены, они должны быть разделены пробелом, это пространство НЕ будет считаться токеном.По этой причине рекомендуется всегда помещать разделители в качестве последней опции перед закрывающей цитатой, гораздо легче увидеть, что происходит, с одним пробелом (или без пробелов) в конце строки.

Разобрать текстовую строку

Строка текста будет рассматриваться как отдельная строка ввода из файла, строка должна быть заключена в двойные кавычки (или одинарные кавычки с usebackq).

Вывести только дату из следующей строки

FOR / F «токенов = 4 разделителя =,» %% G IN («депозит, 4500 123 долл. США.4,12-АВГ-09 «)
DO @echo Дата оплаты %% G

Анализировать вывод команды:

FOR / F %% G IN (‘»C: \ program Files \ command.exe»‘) DO ECHO %% G

Разобрать содержимое файла:

FOR / F «tokens = 1,2 * delims =,» %% G IN (C: \ MyDocu ~ 1 \ mytex ~ 1.txt) DO ECHO %% G

FOR / F «usebackq tokens = 1,2 * delims =,» %% G IN («C: \ My Documents \ my textfile.txt») DO ECHO %% G

Набор имен

Для указания точного набора файлов для обработки, например all.Файлы MP3 в папке, включая подпапки, отсортированные по дате — просто используйте команду DIR / b для создания списка имен файлов ~ и используйте этот вариант синтаксиса команды FOR.

Юникод

Многие новые команды и утилиты (например, WMIC) выводят текстовые файлы в формате Unicode, они не могут быть прочитаны командой FOR, которая ожидает ASCII.
Для преобразования формата файла используйте команду ТИП.

Уровень ошибки

Если данные не обрабатывались, FOR / F вернет ERRORLEVEL = 1

FOR сам по себе не устанавливает и не сбрасывает уровень ошибки.
FOR — это внутренняя команда.

«Это полностью интуитивно понятно; на обучение уходит всего несколько дней, но тогда это полностью интуитивно понятно », — Терри Пратчетт.

Связанные команды:

FOR — Цикл команд.
FOR — Перебирать набор файлов в одной папке.
FOR / R — Перебирать файлы (рекурсивные подпапки).
FOR / D — просмотр нескольких папок.
FOR / L — Цикл по диапазону чисел.
FOR / F — цикл вывода команды.
FORFILES — Пакетная обработка нескольких файлов.
IF — Условное выполнение команды.
SETLOCAL — Управление видимостью переменных среды внутри цикла.
Powershell: ForEach-Object — цикл для каждого объекта в конвейере.
например: Get-Content files.txt | Foreach {copy-item -path $ _. FullName -destination «H: \ destination \»}
Эквивалентная команда bash (Linux): for — развернуть слова и выполнить команды


Авторские права © 1999-2021 SS64.com
Некоторые права защищены

For / R — Цикл по подпапкам — Windows CMD

For / R — Цикл по вложенным папкам — Windows CMD — SS64.com

Просмотр файлов (вложенные папки Recurse)

 Синтаксис
      ДЛЯ  / R  [[ привод :]  путь ] %%  параметр  IN ( набор ) DO  команда 

Ключ
     диск :  путь : дерево папок, в котором расположены файлы.

     набор : набор из одного или нескольких файлов, заключенных в круглые скобки (file1.*, другой? .log).
                 Необходимо использовать подстановочные знаки.
                 Если ( установить ) является символом точки (.), То FOR будет перебирать каждую папку.

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

   %%  параметр : заменяемый параметр:
                 в пакетном файле используйте %% G (в командной строке% G) 

Эта команда перемещается по дереву папок, начиная с пути [диск:],
и выполняет оператор DO для каждого совпадающего файла.

Если путь [диск:] не указан, по умолчанию используется текущий путь диск:.

В отличие от некоторых других вариантов команды FOR, вы должны включить подстановочный знак (* или?) В «набор», чтобы получить согласованные результаты. Во многих случаях это можно обойти, добавив односимвольный подстановочный знак, например. если вы просматриваете несколько папок, чтобы найти точное имя файла myfile.txt, вы можете вместо этого указать myfile.t? t

FOR сам по себе не устанавливает и не сбрасывает уровень ошибки.
FOR — это внутренняя команда.

Примеры:

Список всех файлов .bak в каждой подпапке, начиная с C: \ temp \
Для / R C: \ temp \ %% G IN (* .bak) do Echo «%% G»

Пакетный файл для переименования всех файлов .LOG в .TXT в папке demo и во всех подпапках:
Для / R C: \ demo \ %% G в (* .LOG) выполните Echo REN «%% G» «%% ~ nG.TXT»

В качестве альтернативы то же самое, используя текущий каталог:
Компакт-диск C: \ demo \
Для / R %% G в (*.LOG) do Echo REN «%% G» «%% ~ nG.TXT»

(Удалите Echo из этих команд, чтобы запустить их по-настоящему.)

Измените каталог для каждой подпапки в C: \ Работать по очереди:

FOR / R «C: \ Work \» %% G в (.) DO (
Толкнуть %% G
Эхо сейчас в %% G
Popd
)
Echo «назад домой»

«Только подумайте, как вы были бы счастливы, если бы потеряли все, что у вас есть прямо сейчас, а затем вернули это снова» ~ Фрэнсис Родман

Связанные команды:

FOR — Цикл команд.
FOR — Перебирать набор файлов в одной папке.
FOR / D — Перебирать несколько папок.
FOR / L — Цикл по диапазону чисел.
FOR / F — Перебирать элементы в текстовом файле.
FOR / F — цикл вывода команды.
FORFILES — Пакетная обработка нескольких файлов.
IF — Условное выполнение команды.
Powershell: ForEach-Object — цикл для каждого объекта в конвейере.
Эквивалентная команда bash (Linux): for — развернуть слова и выполнить команды .


Авторские права © 1999-2021 SS64.com
Некоторые права защищены. Пакетный сценарий Windows

.bat для цикла

Я знаю, что это цикл for. правильный

/ f => Я полагаю, это означает для каждого файла в каталоге. Не совсем так. / f — это своего рода «универсальный переключатель» — см. для /? для подробностей

разделителей = :. => Я понимаю, что это означает использование: в качестве разделителя. Не уверен что. средства. он определяет как : , так и . в качестве разделителей — строка будет разделена на каждый из этих символов

tokens = 1-4 => Кажется, это захватывает первые четыре файла в каталоге нет, он захватывает первые четыре токена строки (разделенных определенными разделителями)

Цикл for / f разбивает его на четыре токена: %% t — первый, затем вниз по алфавиту: %% u , %% v и %% w

%% t => Не уверен, что это значит это имя переменной для (первого) токена

(«% TIME: = 0%») => Понятия не имею, что это значит он заменяет каждый пробел в строке нулем — см. set /? для подробностей

Итак, для каждого файла, соответствующего вышеуказанным критериям, он делает следующее: Здесь файлы не имеют отношения

установить FILENAME = event-% 5 — %% t %% u %% v %% w => Что, как я полагаю, означает переименование каждого файла. нет, он создает переменную с именем filename путем объединения нескольких строк

Чем занимается на самом деле:

% времени% — внутренняя переменная, содержащая текущее время. (Внимание, формат времени зависит от локальных настроек — фрагмент кода принимает формат 9: 11: 22.33 (перед 9 стоит ведущий пробел)).
% time: = 0% заменяет пробел, в результате получается 09: 11: 22.33 .

Цикл for / f разбивает эту строку на четыре токена ( %% t = 09 , %% u = 11 , %% v = 22 и %% w = 33 ,

% 5 — пятый параметр командного файла (предположим, это независимо от )

set FILENAME = event-% 5 - %% t %% u %% v %% w устанавливает для имени файла переменную значение event-something-09112233

Я рекомендую добавить SS64 в закладки и регулярно посещать его.Вы также можете получить помощь по каждой команде, выполнив ее с /? Переключатель ( для /? , комплект /? и т. Д.)

Командные файлы — для петель

.

1.% A по сравнению с %% A
% предназначен для использования только в командной строке.
Во всех приведенных примерах и строках синтаксиса % A следует заменить на %% A при использовании в пакетных файлах.
2.% a по сравнению с% A
A в % A может быть заменен любым символом в верхнем или нижнем регистре, кроме цифр.
Однако обратите внимание, что переменные чувствительны к регистру, поэтому будьте последовательны:
FOR% A IN (1 2 3) DO ECHO% a
не будет работать .
ДЛЯ%? IN (1 2 3) DO ECHO%?
с другой стороны, будет .
3. Вложение для команд
В DOS (КОМАНДА.COM), вложение команд FOR невозможно , а не .
Однако, используя второй командный процессор, вы все равно можете их вкладывать:
FOR% A IN (1 2 3) DO COMMAND / C FOR% B IN (A B C) DO ECHO% A% B
Обратите внимание, что вы не можете заменить COMMAND / C на CALL

В NT (CMD.EXE) вложение возможно.
Обратите внимание, что для вложения циклов FOR каждый цикл требует своей собственной переменной; т.е.
FOR% A IN (1 2) DO FOR% A IN (A B) DO ECHO% A
приведет к нежелательным результатам:
A
B
A
B

FOR% A IN (1 2) DO FOR% B IN (A B) DO ECHO% A% B
будет работать по плану и отобразить:
1A
1B
2A
2B

4. Команды в списке
список может не только содержать список параметров, он может даже содержать список команд, которые могут выполняться последовательно с одними и теми же параметрами. то есть команда также может быть% A:
DIR> tempfile.txt
FOR% A IN (TYPE DEL) DO% A tempfile.txt

Этот цикл FOR сначала наберет временный файл, а затем удалит его.
5. список разделители
«Элементы» в списке могут быть разделены (разделены) пробелами, табуляциями, запятыми или точками с запятой.
Начиная с MS-DOS 7, строки в двойных кавычках рассматриваются как один элемент, независимо от того, содержат ли они разделители или нет.

В NT можно определить свои собственные разделители с помощью FOR / F .

6. Косая черта в списке
Если список начинается с косой черты, COMMAND.COM (кроме MS-DOS 7) разделит строку в списке на первый символ после косой черты и оставшуюся часть строки.
Это демонстрируется в интерактивных примерах FOR
7. Условное манипулирование переменными в команде
Не работает следующее:
FOR %% A IN (1 2 3) DO IF "% VAR%" == "" SET VAR = %% A
устанавливает VAR на 3 , а не 1
% VAR% в сравнении (IF «% VAR%» == «») интерпретируется немедленно и, следовательно, пусто, и , затем запускается цикл FOR.
С точки зрения цикла FOR была выдана следующая команда:
FOR %% A IN (1 2 3) DO IF "" == "" SET VAR = %% A
В качестве обходного пути можно использовать следующую конструкцию:
FOR %% A IN (1 2 3) DO CALL TEST2.BAT %% A
Если TEST2.BAT выглядит так:
IF "% VAR%" == "" SET VAR =% 1
тогда VAR устанавливается на 1
В NT вместо этого можно использовать либо отложенное расширение переменной, либо CALL подпрограммы.
8. Перейти с помощью команды GOTO в команде
FOR %% A IN (1 2 3) DO GOTO = %% A
: 1
ЭХО 1
GOTO End
: 2
ЭХО 2
GOTO End
: 3
ЭХО 3
: Конец

будет отображать разные результаты для разных интерпретаторов команд:

  • CMD.EXE (NT и OS / 2) перейдет к метке 1
  • КОМАНДА.COM (DOS) перейдет к метке 1, затем 2, затем 3,
    без выполнения любой из следующих команд, а затем
    выполнить ECHO 3 и следующие команды

Как создать бесконечный цикл в пакетном файле Windows?

Как создать бесконечный цикл в пакетном файле Windows?

Бесконечный цикл в пакетном сценарии означает бесконечное повторение команды. Единственный способ остановить бесконечный цикл в Windows Batch Script — это нажать Ctrl + C или закрыть программу.

Синтаксис: Предположим, переменная «a»

: а
  здесь ваша команда 
перейти к
 

Здесь вам нужно знать, как создать командный файл в Windows. Все очень просто. Сначала скопируйте код в файл блокнота и сохраните этот файл с расширением .bat . Чтобы запустить или выполнить файл, дважды щелкните по нему или введите имя файла в cmd.

Пример 1: Начнем с цикла простой команды, такой как «echo». Команды « echo » аналогичны команде «print», как и в любых других языках программирования.Сохраните приведенный ниже код в файле блокнота, например sample.bat , и дважды щелкните его, чтобы выполнить.

@echo off
:Икс
эхо Привет! Мои друзья-члены GFG!
goto x
 

Вывод:

Чтобы остановить этот бесконечный цикл, нажмите Ctrl + C , затем нажмите y , а затем Введите .

Пример 2: Предположим, мы хотим зациклить «дерево» команд.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *