Цикл в файле bat


Команда FOR в BAT файле. Пример числового цикла и цикла перебора файлов.

Команда for в виде числового цикла

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

for /l %%i in (1,1,10) do echo %%i

Переменная i называется счетчиком цикла. В силу своеобразия синтаксиса команды for, имя счетчика цикла должно состоять из одной буквы. Причем, если мы пишем командный файл, то перед именем счетчика цикла надо поставить сдвоенный знак процента, если же мы просто набираем команду в командной строке, то одиночный.

Логика работы этой команды такова. После слова in указан диапазон изменения счетчика цикла. В данном варианте команды это тройка чисел: начальное значение счетчика, шаг счета, предельное значение счетчика. При выполнении команды командный процессор сначала присвоит переменной i значение 1, а потом на каждом шаге цикла будет увеличивать его на 1, пока оно не превысит 10. Очевидно, таких шагов получится десять. Если бы в качестве шага счета мы указали число 2, то цикл выполнился бы пять раз. На каждом шаге цикла выполняется тело цикла, написанное после слова do. В приведенном примере это команда echo, которая выводит на экран текущее значение счетчика цикла.

Команда for для перебора файлов

Обычно команда for используется для перебора и обработки файлов. Надо сказать, что в достаточно простых случаях массовая обработка файлов выполняется с помощью подстановочных символов. Если, мы хотим всем файлам в текущем каталоге заменить расширение .htm на .html, мы вводим команду ren *.htm *.html. Но если то же самое надо сделать не в одном каталоге, а в дереве каталогов, то без команды for не обойтись. Приведенный ниже командный файл выполняет эту операцию для всех htm-файлов в подкаталоге website текущего каталога. Точнее, во всем дереве каталогов, которое находится внутри website.

for /r website %%i in (*.htm) do ren %%i %%~ni.html

Ключ /r указывает на необходимость обхода каталога website и всех его внутренностей. Если его не указать (но тогда и каталог указывать не разрешается), то обработаны будут только файлы в текущем каталоге. Диапазоном значений счетчика цикла в данном варианте команды является множество всех файлов с расширением .htm, находящихся внутри каталога (точнее, дерева) website. Странная на первый взгляд запись ~ni означает, что из значения переменной i требуется выделить только имя файла. В языке команд MS-DOS предусмотрено несколько таких модификаторов, например, запись ~хi обозначает расширение файла. Все модификаторы описаны в справке по команде for.

Тело цикла может состоять из нескольких команд, заключенных в скобки.

@echo off

for /r website %%i in (*.htm) do (

rem Выводим имя файла

echo %%i

rem Переименовываем файл

ren %%i %%~ni.html

)

Перебор директорий

В том виде, в котором команда for перебирает файлы в директории, она не способна перебрать директории в нужной директории (т. е. видит только файлы). Нужно пользоваться другим синтаксисом.

for /r "C:\test" /d %%i in (*) do (

   echo Name of folder: %%i

   copy D:\filesKLIENT\Kontragent\111.grs "%%i"

)

Или с помощью фильтрации вывода команды dir:

for /f "delims=" %%i in (dir /b /s /a:d "C:\test") do (

   echo Name of folder: %%i

   copy D:\filesKLIENT\Kontragent\111.grs "%%i"

)

webhamster.ru

Обрыв цикла for - BAT

Вопрос: Генерация случайного числа в теле цикла FOR

Добрый день подскажите пожалуйста как правильно вставить код генерации случайного числа внутрь цикла for чтобы он работал.

Цикл:

Windows Batch file
1 for /l %%i in (1,1,10) do echo %%i
Код генерации случайного числа:
Windows Batch file
1 2 3 set minimum=0 set maximum=10 set /a number=%random%%%(maximum-minimum+1)+minimum
И как корректно отнять единицу от счетчика %%i в теле цикла чтобы он выполнился на один круг больше. Ответ:

Сообщение от AlexDF

Отредактируйте пожалуйста ваш пример, чтобы после кода: ...В каждой итерации выполнялся код:

Хмм, а то, что это бессмысленное действие - ничего? Вот тут:

Сообщение от YuS_2

Ведь при выходе из цикла у них будет одно, причем последнее значение конечной итерации. Т.е. бессмысленно присваивать им рандомные значения во всех итерациях.

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

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

Windows Batch file
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 @echo off :: Создать 10 файлов если проверочный файл непустой, иначе прогрессбар в 30 символов set count=0 set con= set cnt=0 setlocal enabledelayedexpansion     :reset if !cnt! gtr 30 (cls&&set /a cnt=0) :begin if !count! lss 10 ( for /f %%i in ('forfiles /p "C:\temp" /m temp.txt /c "cmd /c echo @fsize"') do (     if "%%i" gtr "0" (         set /a count+=1         if !count!==1 (cls)         echo create file!count!&&echo.>"C:\temp\!count!.txt"&&goto :begin     ) else (         set /a cnt+=1         set /p con=в–’<nul         timeout /t 1 >nul         goto :reset         )     ) ) pause
А с рандомом - попробуйте самостоятельно подумать, как его добавить в цикл. Но учтите, что именно так, как предлагаете Вы, добавлять его, всё равно, нет смысла.

Добавлено через 3 минуты

Сообщение от YuS_2

в–’

- здесь, в 18 строке, был символ псевдографики, его движок форума съел. Туда можно добавлять другой, какой больше понравится.

forundex.ru

Операторы условия и циклы в бат файлах

Операторы условия С помощью команды IF … ELSE (ключевое слово ELSE может отсутствовать) в пакетных файлах можно выполнять обработку условий нескольких типов. При этом если заданное после IF условие принимает истинное значение, система выполняет следующую за условием команду (или несколько команд, заключенных в круглые скобки), в противном случае выполняется команда (или несколько команд в скобках), следующие за ключевым словом ELSE. Проверка значения переменной Первый тип условия используется обычно для проверки значения переменной. Для этого применяются два варианта синтаксиса команды IF: IF [NOT] строка1==строка2 команда1 [ELSE команда2] (квадратные скобки указывают на необязательность заключенных в них параметров) или IF [/I] [NOT] строка1 оператор_сравнения строка2 команда Рассмотрим сначала первый вариант. Условие строка1==строка2 (здесь необходимо писать именно два знака равенства) считается истинным при точном совпадении обеих строк. Параметр NOT указывает на то, что заданная команда выполняется лишь в том случае, когда сравниваемые строки не совпадают. Строки могут быть литеральными или представлять собой значения переменных (например, %1 или %TEMP%). Кавычки для литеральных строк не требуются. Например, IF %1==%2 ECHO Параметры совпадают! IF %1==Петя ECHO Привет, Петя! Отметим, что при сравнении строк, заданных переменными, следует проявлять определенную осторожность. Дело в том, что значение переменной может оказаться пустой строкой, и тогда может возникнуть ситуация, при которой выполнение командного файла аварийно завершится. Например, если вы не определили с помощью команды SET переменную My Var, а в файле имеется условный оператор типа IF %My Var%==C:\ ECHO Ура!!! то в процессе выполнения вместо %My Var% подставится пустая строка и возникнет синтаксическая ошибка. Такая же ситуация может возникнуть, если одна из сравниваемых строк является значением параметра командной строки, так как этот параметр может быть не указан при запуске командного файла. Поэтому при сравнении строк нужно приписывать к ним в начале какой-нибудь символ, например: IF -%My Var%==-C:\ ECHO Ура!!! С помощью команд IF и SHIFT можно в цикле обрабатывать все параметры командной строки файла, даже не зная заранее их количества. Например, следующий командный файл (назовем его primer.bat) выводит на экран имя запускаемого файла и все параметры командной строки: @ECHO OFF ECHO Выполняется файл: %0 ECHO. ECHO Файл запущен со следующими параметрами... REM Начало цикла :Beg Loop IF -%1==- GOTO Exit Loop ECHO %1 REM Сдвиг параметров SHIFT REM Переход на начало цикла GOTO Beg Loop :Exit Loop REM Выход из цикла ECHO. ECHO Все. Если запустить primer.bat с четырьмя параметрами: primer.bat А Б В Г то в результате выполнения на экран выведется следующая информация: Выполняется файл: primer.bat

Файл запущен со следующими параметрами:АБВГ

Все.Рассмотрим теперь оператор IF в следующем виде:IF [/I] строка1 оператор_сравнения строка2 командаСинтаксис и значение операторов_сравнения представлены в табл. 3.2.Таблица 3.2. Операторы сравнения в IF

ОператорЗначение

EQLРавно

NEQНе равно

LSSМеньше

LEQМеньше или равно

GTRБольше

GEQБольше или равно

Приведем пример использования операторов сравнения:@ECHO OFFCLSIF -%1 EQL –Вася ECHO Привет, Вася!IF -%1 NEQ –Вася ECHO Привет, но Вы не Вася!Ключ /I, если он указан, задает сравнение текстовых строк без учета регистра. Ключ /I можно также использовать и в форме строка1==строка2 команды IF. Например, условие IF /I DOS==dos …будет истинным.Проверка существования заданного файлаВторой способ использования команды IF — это проверка существования заданного файла. Синтаксис для этого случая имеет вид:IF [NOT] EXIST файл команда1 [ELSE команда2]Условие считается истинным, если указанный файл существует. Кавычки для имени файла не требуются. Приведем пример командного файла, в котором с помощью такого варианта команды IF проверяется наличие файла, указанного в качестве параметра командной строки.@ECHO OFFIF -%1==- GOTO No File SpecifiedIF NOT EXIST %1 GOTO File Not Exist

REM Вывод сообщения о найденном файлеECHO Файл '%1' успешно найден.GOTO :EOF

:No File SpecifiedREM Файл запущен без параметровECHO В командной строке не указано имя файла.GOTO :EOF

:File Not ExistREM Параметр командной строки задан, но файл не найденECHO Файл '%1' не найден.Проверка наличия переменной средыАналогично файлам команда IF позволяет проверить наличие в системе определенной переменной среды: IF DEFINED переменная команда1 [ELSE команда2]Здесь условие DEFINED применяется подобно условию EXISTS наличия заданного файла, но принимает в качестве аргумента имя переменной среды и возвращает истинное значение, если эта переменная определена. Например:@ECHO OFFCLSIF DEFINED My Var GOTO :Var ExistsECHO Переменная My Var не определенаGOTO :EOF:Var ExistsECHO Переменная My Var определена,ECHO ее значение равно %My Var%Проверка кода завершения предыдущей командыЕще один способ использования команды IF — это проверка кода завершения (кода выхода) предыдущей команды. Синтаксис для IF в этом случае имеет следующий вид:IF [NOT] ERRORLEVEL число команда1 [ELSE команда2] Здесь условие считается истинным, если последняя запущенная команда или программа завершилась с кодом возврата, равным либо превышающим указанное число.Составим, например, командный файл, который бы копировал файл my.txt на диск C: без вывода на экран сообщений о копировании, а в случае возникновения какой-либо ошибки выдавал предупреждение:@ECHO OFFXCOPY my.txt C:\ > NULREM Проверка кода завершения копированияIF ERRORLEVEL 1 GOTO Err OccurredECHO Копирование выполнено без ошибок.GOTO :EOF

:Err OccurredECHO При выполнении команды XCOPY возникла ошибка!В операторе IF ERRORLEVEL … можно также применять операторы сравнения чисел, приведенные в табл. 3.2. Например:IF ERRORLEVEL LEQ 1 GOTO Case1Замечание. Иногда более удобным для работы с кодами завершения программ может оказаться использование переменной %ERRORLEVEL%. (строковое представление текущего значения кода ошибки ERRORLEVEL).Проверка версии реализации расширенной обработки командНаконец, для определения внутреннего номера версии текущей реализации расширенной обработки команд применяется оператор IF в следующем виде:IF CMDEXTVERSION число команда1 [ELSE команда2]Здесь условие CMDEXTVERSION применяется подобно условию ERRORLEVEL, но число сравнивается с вышеупомянутым внутренним номером версии. Первая версия имеет номер 1. Номер версии будет увеличиваться на единицу при каждом добавлении существенных возможностей расширенной обработки команд. Если расширенная обработка команд отключена, условие CMDEXTVERSION никогда не бывает истинно.Организация цикловВ командных файлах для организации циклов используются несколько разновидностей оператора FOR, которые обеспечивают следующие функции:выполнение заданной команды для всех элементов указанного множества;выполнение заданной команды для всех подходящих имен файлов;выполнение заданной команды для всех подходящих имен каталогов;выполнение заданной команды для определенного каталога, а также всех его подкаталогов;получение последовательности чисел с заданными началом, концом и шагом приращения;чтение и обработка строк из текстового файла;обработка строк вывода определенной команды.Цикл FOR … IN … DO …Самый простой вариант синтаксиса команды FOR для командных файлов имеет следующий вид:FOR %%переменная IN (множество) DO команда [параметры]ВниманиеПеред названием переменной должны стоять именно два знака процента (%%), а не один, как это было при использовании команды FOR непосредственно из командной строки.Сразу приведем пример. Если в командном файле заданы строки@ECHO OFFFOR %%i IN (Раз,Два,Три) DO ECHO %%iто в результате его выполнения на экране будет напечатано следующее:РазДваТриПараметр множество в команде FOR задает одну или более текстовых строк, разделенных запятыми, которые вы хотите обработать с помощью заданной команды. Скобки здесь обязательны. Параметр команда [параметры] задает команду, выполняемую для каждого элемента множества, при этом вложенность команд FOR на одной строке не допускается. Если в строке, входящей во множество, используется запятая, то значение этой строки нужно заключить в кавычки. Например, в результате выполнения файла с командами@ECHO OFFFOR %%i IN ("Раз,Два",Три) DO ECHO %%iна экран будет выведеноРаз,ДваТриПараметр %%переменная представляет подставляемую переменную (счетчик цикла), причем здесь могут использоваться только имена переменных, состоящие из одной буквы. При выполнении команда FOR заменяет подставляемую переменную текстом каждой строки в заданном множестве, пока команда, стоящая после ключевого слова DO, не обработает все такие строки. Замечание. Чтобы избежать путаницы с параметрами командного файла %0 — %9, для переменных следует использовать любые символы кроме 0 – 9. Параметр множество в команде FOR может также представлять одну или несколько групп файлов. Например, чтобы вывести в файл список всех файлов с расширениями txt и prn, находящихся в каталоге C:\TEXT, без использования команды DIR, можно использовать командный файл следующего содержания:@ECHO OFFFOR %%f IN (C:\TEXT\*.txt C:\TEXT\*.prn) DO ECHO %%f >> list.txtПри таком использовании команды FOR процесс обработки продолжается, пока не обработаются все файлы (или группы файлов), указанные во множестве. Цикл FOR /D … IN … DO …Следующий вариант команды FOR реализуется с помощью ключа /D:FOR /D %переменная IN (набор) DO команда [параметры]В случае, если набор содержит подстановочные знаки, то команда выполняется для всех подходящих имен каталогов, а не имен файлов. Скажем, выполнив следующий командный файл:@ECHO OFFCLSFOR /D %%f IN (C:\*.*) DO ECHO %%fмы получим список всех каталогов на диске C:, например:C:\ArcC:\CYRC:\MSCANC:\NCC:\Program FilesC:\TEMPC:\Te XC:\WINNT

Цикл FOR /R … IN … DO …С помощью ключа /R можно задать рекурсию в команде: FOR:FOR /R [[диск:]путь] %переменная IN (набор) DO команда [параметры]В этом случае заданная команда выполняется для каталога [диск:]путь, а также для всех подкаталогов этого пути. Если после ключа R не указано имя каталога, то выполнение команды начинается с текущего каталога. Например, для распечатки всех файлов с расширением txt в текущем каталоге и всех его подкаталогах можно использовать следующий пакетный файл:@ECHO OFFCLSFOR /R %%f IN (*.txt) DO PRINT %%fЕсли вместо набора указана только точка (.), то команда проверяет все подкаталоги текущего каталога. Например, если мы находимся в каталоге C:\TEXT с двумя подкаталогами BOOKS и ARTICLES, то в результате выполнения файла:@ECHO OFFCLSFOR /R %%f IN (.) DO ECHO %%fна экран выведутся три строки:C:\TEXT\.C:\TEXT\BOOKS\.C:\TEXT\ARTICLES\.Цикл FOR /L … IN … DO …Ключ /L позволяет реализовать с помощью команды FOR арифметический цикл, в этом случае синтаксис имеет следующий: вид:FOR /L %переменная IN (начало,шаг,конец) DO команда [параметры]Здесь заданная после ключевого слова IN тройка (начало,шаг,конец) раскрывается в последовательность чисел с заданными началом, концом и шагом приращения. Так, набор (1,1,5) раскрывается в (1 2 3 4 5), а набор (5,-1,1) заменяется на (5 4 3 2 1). Например, в результате выполнения следующего командного файла:@ECHO OFFCLSFOR /L %%f IN (1,1,5) DO ECHO %%fпеременная цикла %%f пробежит значения от 1 до 5, и на экране напечатаются пять чисел:12345Числа, получаемые в результате выполнения цикла FOR /L, можно использовать в арифметических вычислениях. Рассмотрим командный файл my.bat следующего содержания:@ECHO OFFCLSFOR /L %%f IN (1,1,5) DO CALL :

2 %%fGOTO :EOF:

2SET /A M=10*%1ECHO 10*%1=%M%В третьей строке в цикле происходит вызов нового контекста файла my.bat с текущим значением переменной цикла %%f в качестве параметра командной строки, причем управление передается на метку :

2 (см. описание CALL в разделе "Изменения в командах перехода"). В шестой строке переменная цикла умножается на десять, и результат записывается в переменную M. Таким образом, в результате выполнения этого файла выведется следующая информация:10*1=1010*2=2010*3=3010*4=4010*5=50Цикл FOR /F … IN … DO …Самые мощные возможности (и одновременно самый запутанный синтаксис) имеет команда: FOR с ключом /F:FOR /F ["ключи"] %переменная IN (набор) DO команда [параметры]Здесь параметр набор содержит имена одного или нескольких файлов, которые по очереди открываются, читаются и обрабатываются. Обработка состоит в чтении файла, разбиении его на отдельные строки текста и выделении из каждой строки заданного числа подстрок. Затем найденная подстрока используется в качестве значения переменной при выполнении основного тела цикла (заданной команды). По умолчанию ключ /F выделяет из каждой строки файла первое слово, очищенное от окружающих его пробелов. Пустые строки в файле пропускаются. Необязательный параметр "ключи" служит для переопределения заданных по умолчанию правил обработки строк. Ключи представляют собой заключенную в кавычки строку, содержащую приведенные в табл. 3.3 ключевые слова:Таблица 3.3. Ключи в команде FOR /F

КлючОписание

EOL=CОпределение символа комментариев в начале строки (допускается задание только одного символа)

SKIP=NЧисло пропускаемых при обработке строк в начале файла

DELIMS=XXXОпределение набора разделителей для замены заданных по умолчанию пробела и знака табуляции

TOKENS=X,Y,M-NОпределение номеров подстрок, выделяемых из каждой строки файла и передаваемых для выполнения в тело цикла

При использовании ключа TOKENS=X,Y,M-N создаются дополнительные переменные. Формат M-N представляет собой диапазон подстрок с номерами от M до N. Если последний символ в строке TOKENS= является звездочкой, то создается дополнительная переменная, значением которой будет весь текст, оставшийся в строке после обработки последней подстроки.Разберем применение этой команды на примере пакетного файла parser.bat, который производит разбор файла myfile.txt:@ECHO OFFIF NOT EXIST myfile.txt GOTO :No FileFOR /F "EOL=; TOKENS=2,3* DELIMS=, " %%i IN (myfile.txt) DO @ECHO %%i %%j %%kGOTO :EOF:No FileECHO Не найден файл myfile.txt!Здесь во второй строке производится проверка наличия файла myfile.txt; в случае отсутствия этого файла выводится предупреждающее сообщение. Команда FOR в третьей строке обрабатывает файл myfile.txt следующим образом: Пропускаются все строки, которые начинаются с символа точки с запятой (EOL=;).Вторая и третья подстроки из каждой строки передаются в тело цикла, причем подстроки разделяются пробелами (по умолчанию) и/или запятыми (DELIMS=,).В теле цикла переменная %%i используется для второй подстроки, %%j — для третьей, а %%k получает все оставшиеся подстроки после третьей.В нашем примере переменная %%i явно описана в инструкции FOR, а переменные %%j и %%k описываются неявно с помощью ключа TOKENS=. Например, если в файле myfile.txt были записаны следующие три строки:ААА ББББ ВВВВ,ГГГГГ ДДДДЕЕЕЕЕ,ЖЖЖЖ ЗЗЗЗ;

КККК ЛЛЛЛЛ МММММто в результате выполнения пакетного файла parser.bat на экран выведется следующее:ББББ ВВВВ ГГГГГ ДДДДЖЖЖЖ ЗЗЗЗЗамечаниеКлюч TOKENS= позволяет извлечь из одной строки файла до 26 подстрок, поэтому запрещено использовать имена переменных, начинающиеся не с букв английского алфавита (a–z). Следует помнить, что имена переменных FOR являются глобальными, поэтому одновременно не может быть активно более 26 переменных.Команда FOR /F также позволяет обработать отдельную строку. Для этого следует ввести нужную строку в кавычках вместо набора имен файлов в скобках. Строка будет обработана так, как будто она взята из файла. Например, файл следующего содержания:@ECHO OFFFOR /F "EOL=; TOKENS=2,3* DELIMS=, " %%i IN ("ААА ББББ ВВВВ,ГГГГГ ДДДД") DO @ECHO %%i %%j %%kпри своем выполнении напечатаетББББ ВВВВ ГГГГГ ДДДДВместо явного задания строки для разбора можно пользоваться переменными среды, например:@ECHO OFFSET M=ААА ББББ ВВВВ,ГГГГГ ДДДДFOR /F "EOL=; TOKENS=2,3* DELIMS=, " %%i IN ("%M%") DO @ECHO %%i %%j %%kНаконец, команда FOR /F позволяет обработать строку вывода другой команды. Для этого следует вместо набора имен файлов в скобках ввести строку вызова команды в апострофах (не в кавычках!). Строка передается для выполнения интерпретатору команд cmd.exe, а вывод этой команды записывается в память и обрабатывается так, как будто строка вывода взята из файла. Например, следующий командный файл:@ECHO OFFCLSECHO Имена переменных среды:ECHO.FOR /F "DELIMS==" %%i IN ('SET') DO ECHO %%iвыведет перечень имен всех переменных среды, определенных в настоящее время в системе.В цикле FOR допускается применение тех же синтаксических конструкций (операторов), что и для заменяемых параметров (табл. 3.4).Таблица 3.4. Операторы для переменных команды FOR

ОператорыОписание

%~FiПеременная %i расширяется до полного имени файла

%~DiИз переменной %i выделяется только имя диска

%~PiИз переменной %i выделяется только путь к файлу

%~NiИз переменной %i выделяется только имя файла

%~XiИз переменной %i выделяется расширение имени файла

%~SiЗначение операторов N и X для переменной %i изменяется так, что они работают с кратким именем файла

ЗамечаниеЕсли планируется использовать расширения подстановки значений в команде FOR, то следует внимательно подбирать имена переменных, чтобы они не пересекались с обозначениями формата.Например, если мы находимся в каталоге C:\Program Files\Far и запустим командный файл следующего содержания:@ECHO OFFCLSFOR %%i IN (*.txt) DO ECHO %%~Fiто на экран выведутся полные имена всех файлов с расширением txt:C:\Program Files\Far\Contacts.txtC:\Program Files\Far\Far FAQ.txtC:\Program Files\Far\Far_Site.txtC:\Program Files\Far\License.txtC:\Program Files\Far\License.x USSR.txtC:\Program Files\Far\Read Me.txtC:\Program Files\Far\register.txtC:\Program Files\Far\Whats New.txtЦиклы и связывание времени выполнения для переменныхКак и в рассмотренном выше примере с составными выражениями, при обработке переменных среды внутри цикла могут возникать труднообъяснимые ошибки, связанные с ранними связыванием переменных. Рассмотрим пример. Пусть имеется командный файл следующего содержания:SET a=FOR %%i IN (Раз,Два,Три) DO SET a=%a%%%iECHO a=%a%В результате его выполнения на экран будет выведена строка "a=Три", то есть фактически команда FOR %%i IN (Раз,Два,Три) DO SET a=%a%%%iравносильна команде FOR %%i IN (Раз,Два,Три) DO SET a=%%iДля исправления ситуации нужно, как и в случае с составными выражениями, вместо знаков процента (%) использовать восклицательные знаки и предварительно включить режим связывания времени выполнения командой SETLOCAL ENABLEDELAYEDEXPANSION. Таким образом, наш пример следует переписать следующим образом:SETLOCAL ENABLEDELAYEDEXPANSIONSET a=FOR %%i IN (Раз,Два,Три) DO SET a=!a!%%iECHO a=%a%В этом случае на экран будет выведена строка "a=Раз Два Три".

www.freedocs.xyz