Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
Dragokas
Эксперт WindowsАвтор FAQ
16922 / 7007 / 851
Регистрация: 25.12.2011
Сообщений: 10,803
Записей в блоге: 16
#1

Циклические операции и примеры (команда FOR) * [Статья] - CMD/BAT

04.02.2013, 00:56. Просмотров 94038. Ответов 16
Метки нет (Все метки)

Вдохновившись сообщением от FraidZZ, написал мини-статейку, основанную на изложенных им положениях.

Заметки
Циклическиe операции FOR

Командой FOR задаётся список команд, которые выполняются с КАЖДЫМ элементом набора.
Набор* пишется внутри IN (...)
Список команд пишется внутри DO (...)
Командная строка выполняет эти команды раз за разом, при этом текущий элемент набора находится в переменной, заданной после %% (назовём ее переменной цикла).

Например,
Windows Batch file
1
FOR %%a IN (C:\Users\*.txt) DO echo %%a
выведет имена и путь ко всем файлам с расширением .txt в папке C:\Users.

* Примеры под спойлером
Виды наборов для FOR

Для команды For без ключей набором может являться:

1) Маска файлов* (или путь + маска файлов)
- в двойных кавычках, или без них:

IN (*.txt)
Результат: список файлов с расширением .txt в текущем каталоге.

IN (*.txt *.bat)
Результат: список файлов с расширениеми .txt и .bat в текущем каталоге.

IN ("C:\Folder 1\Doc_31-12-*.txt")
Результат: тот же. Но поиск ведется в каталоге C:\Folder 1 (заметьте с пробелом в имени);
имя файла начинается на Doc_31-12-

Прим.: FOR без ключа не умеет выводить список каталогов.
* маска файлов - это набор файлов, заданный с помощью подстановочных знаков * и/или ?
где * - обозначает 0 или больше любых символов в имени файла.
а ? - означает 0 или 1 любой символ в имени файла.

2) Строка
- в двойных кавычках, или без них:

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

Windows Batch file
1
FOR %%a IN (гитара рыбка) do echo Моя %%a
Результат:
Моя гитара
Моя рыбка
Если мы хотим, чтобы какая-то из строк не "билась" по пробелам, укажем ее в двойных кавычках:
Windows Batch file
1
FOR %%a IN (гитара "дорогая рыбка") do echo Моя %%~a
Результат:
Моя гитара
Моя дорогая рыбка
При этом, чтобы не выводились сами кавычки "" мы используем модификатор* ~ (тильда) при раскрытии переменной цикла %%~a

*О других модификаторах переменной цикла можно почитать здесь и здесь.

Не по теме:

3) еще есть смешанный тип. Это когда в наборе стоит маска (1-й описанный тип), а через пробел Строка (2 тип)... ведет себя вполне ожидаемо, но вряд ли найдет себе применение.



О наборах для FOR с ключем /F далее в нижнем спойлере.


Ключ /F часто используется для построчного разбора файла, т.е.
Windows Batch file
1
FOR /f "usebackq delims=" %%a IN ("C:\1.txt") DO echo %%a
выведет все строки файла 1.txt, который находится в корне диска C.

UseBackQ (Use back quotes) означает, что набор с двойными кавычками* подразумевает передачу в цикл имени файла.
delims= означает, что в переменную %%a будет записана вся строка (без разделения по пробелу или знаку табуляции, т.к. стандартный разделитель заменен на NULL (пустой символ).
В такой вариации:
tokens=* приводит к тому же результату, что и delims=. Означает прекратить разбивку по разделителю после "0-го" токена, т.е. сразу же.

* Этот вариант необходим для работы с файлом, путь или имя которого содержит пробелы.
Можно было не использовать UseBackQ, тогда команда приняла бы вид:
Windows Batch file
1
FOR /f "tokens=" %%a IN (C:\1.txt) DO echo %%a
но такая конструкция восприняла бы пробел в имени как определение нового файла, поэтому UseBackQ более приемлем.

** Примеры под спойлером
Виды наборов для FOR /F

В цикле FOR /F вид задаваемого набора зависит от формы кавычек в IN (...), а также наличия ключевого слова UseBackQ

Виды наборов для FOR /F:
1) Набор файлов (задание маски недопустимо!)

без UseBackQ - задается без кавычек IN (...)
__с UseBackQ - может задаваться как в кавычках так и без них. IN (...) IN ("...")

Специфика работы

Функционал: чтение содержимого файла(ов) построчно в переменную цикла!

Принцип работы: источником для разбиения по разделителю (delims) является содержимое файла, заданного внутри IN (...) или файлов, если они заданы через пробел.

Исключение: принятый по-умолчанию разделитель (пробел и знак табуляции) для этой конструкции цикла не применяется.

А что получится, если установить delims= (возле равно - знак пробела) ?
Windows Batch file
1
FOR /F "delims= " %%a in (1.txt) do echo %%a
В выводе на экран командой Echo %%a мы получим содержимое файла, где каждая из строк будет напечатана до первого встретившегося пробела.
.


2) Строка (допускаются практически любые символы)

без UseBackQ - задается с двойными кавычками IN ("...")
__с UseBackQ - задается с одиночными прямыми кавычками IN ('...')

3) Команда (сначала выполняется она, а уже ее результаты обрабатываются циклом как строка(-и))

без UseBackQ - задается с одиночными прямыми кавычками IN ('...')
__с UseBackQ - задается с одиночными обратными кавычками IN (`...`)

Примеры:

1.1. Чтение файла - Набор файлов
Windows Batch file
1
FOR /F %%a IN (c:\users\1.txt c:\users\2.txt) do echo.%%a
Результат: выведет подряд содержимое двух файлов - 1.txt и 2.txt из каталога c:\users
Прим.: Echo. - с точкой - это обход ошибки, чтобы можно было напечатать пустую строку, точнее строку с пробелами.

1.2. Чтение файла - Набор файлов + UseBackQ
Получаем возможность использовать пробелы.
Windows Batch file
1
FOR /F "usebackq" %%a IN ("c:\folder 1\1.txt") do echo.%%a
Результат: выведет содержимое файла 1.txt из каталога c:\folder 1
(заметьте, в имени папки есть пробел).


2.1. Строка
Windows Batch file
1
FOR /F %%a in ("Каждое слово в отдельную переменную") DO echo a=%%a; b=%%b; c=%%c; d=%%d; e=%%e
Цитата Сообщение от Результат
a=Каждое; b=слово; c=в; d=отдельную; e=переменную
2.2. Строка + UseBackQ
Windows Batch file
1
FOR /F "UseBackQ" %%a in ('Каждое слово в отдельную переменную') DO echo a=%%a; b=%%b; c=%%c; d=%%d; e=%%e
Результат такой же.

3.1. Команда
Windows Batch file
1
For /F "tokens=1-4" %%a IN ('Dir /A:D-L') Do Echo Папка %%d Дата модификации %%a. Время %%b
Сначала выполняется Dir /AD-L, которая выводит информацию о папках в текущем каталоге.
Вот что попадает под разбор циклу:



Далее цикл разбирает каждую строку по пробелам и табуляции на подстроки (токены).
На примере 1-й строки:
1-й токен (%%a)=29.12.2012 ...2-й токен (%%b)=15:16 ...3-й токен (%%c)=<DIR> ...4-й токен (%%d)=Favorites
...
Результат через Echo выводится на экран:
Папка Favorites Дата модификации 29.12.2012. Время 15:16
Папка Links Дата модификации 14.01.2013. Время 01:51
...и т.д.
3.2. Команда + UseBackQ
Windows Batch file
1
For /F "Usebackq tokens=1-4" %%a IN (`Dir /A:D-L`) Do Echo Папка %%d Дата модификации %%a. Время %%b
Результат такой же.
Альтернативный вариант нужен с целью, если одна из выполняемых команд требует точно такие же кавычки как и ключевое слово IN (...).
Дабы не пользоваться символом экранирования, просто применяем другие кавычки.


Отличительной особенностью FOR /F является умение работать через токены*,
а также поддержка дополнительных ключевых слов:
1) eol - знак комментария в начале строки (1-й символ). Т.е. строки с таким символом не будут обрабатываться. (по умолчанию, знак точки с запятой ; )
2) skip - пропуск определенного кол-ва обрабатываемых строк от начала файла
3) delims - задать другой разделитель(-ли) (по умолчанию, пробел и знак табуляции)
4) tokens - количество получаемых токенов (подстрок) в теле цикла и пределы разбивки по разделителю.
Также можно задать конкретный № токена, который попадет в первую переменную цикла.
5) usebackq - изменение правил использования кавычек внутри IN (...)

Детальную справку можно получить, введя в консоль команду FOR /?

* Токены - это подстроки, которые попадают в переменные цикла %% в каждой из итераций.
Они получаются в результате разбивки строки, заданной в IN (...), по разделителю, заданному в Delims= (по умолчанию, пробел и знак табуляции).

В отличие, от FOR без ключа, в FOR /F все токены (все подстроки одной строки) попадают сразу В ПЕРВУЮ ИТЕРАЦИЮ цикла.
Они будут распределены по РАЗНЫМ переменным цикла, идущим в алфавитном порядке*, начиная с буквы, заданной после FOR /F %%

Т.е.
Windows Batch file
1
FOR /F "tokens=1,2" %%a IN ("гитара рыбка") do echo Моя %%a и моя %%b.
Результат:
Моя гитара и моя рыбка.
Обратите внимание: по умолчанию, цикл выдаёт в результатах только 1-ый токен. Если вам нужно, получить другой, нужно явно указывать модификатор "tokens=xxx".

*
Макс. количество токенов и обход ограничения

Максимальное кол-во токенов составляет - 26,
если начальным указать %%a либо %%A (регистр имеет значение)
При этом переход с %%z в %%A не происходит. Остальная часть подстрок опускается.
Можно проверить:
Windows Batch file
For /F "tokens=1,2" %%z IN ("1 2") do echo %%A
Бывают случаи, когда требуется разбить строку по специфическому разделителю и при этом выполнить одну и ту же команду над каждой из подстрок (токеном). Кол-во токенов неизвестно.
Метод показал Anonymоus в теме http://www.cyberforum.ru/cmd-bat/thread650203.html#post3479878

Алгоритм заключается в замене разделителя на пробел с одновременным заключением каждого токена в двойные кавычки. Далее строка разбирается обычным циклом FOR без ключа.


Более универсальные конструкции на основе FOR /F для работы с файлами/папками строятся путем помещения
в IN ('...') команды, результаты от выполнения которой уж затем обрабатываются циклом.
Чаще всего это команда Dir.

А теперь рассмотрим более сложный пример:


1.2. Чтение файла (сложный пример).
Давайте возьмем сложный пример, и раскусим "крепкий орешек"
Windows Batch file
1
FOR /F "UseBackQ skip=1 tokens=2 delims=/\ eol=" %%X in ("%~dp01.txt") do echo %%X
Имеем в распоряжении файл 1.txt, который находится рядом с батником.
Цитата Сообщение от Содержимое файла 1.txt
первая строка
;комментарий/кода
наше любимое\блюдо
Порядок разбора (или "как прибл. будет думать ком. строка"):
1) %~dp0 - означает каталог, где находится батник, например c:\temp\

2) UseBackQ, ага - значит если в IN (...) ничего нет или двойные кавычки, то это файл и его нужно прочесть.

3) Читаем содержимое файла 1.txt в папке %~dp0, а затем каждую его строку проверяем по правилам... ключевых слов skip=1 tokens=2 delims=/\ eol=

4) Итак, первая строка так и называется "первая строка"
skip=1 - означает пропустить от начала файла 1-у строку,
значит идем дальше:

5) Вторая строка: ";комментарий/кода"
Первый символ - это точка с запятой. А теперь смотрим сюда "eol=пустой символ".
По умолчанию eol=; и если бы мы не указали пустой EOL, то цикл просто бы пропустил эту строку.
Итак, символ комментария не совпадает с заданным (т.е. он вообще пустой), а значит строчка нам подходит -> проверяем ее дальше:

6) Смотрим какие приняты разделители: delims=/\ (знаки / и \ ), значит
из строки ";комментарий/кода"
мы получим 2 подстроки:
1-й токен - ";комментарий"
2-й токен - "кода"

7) Теперь смотрим сюда tokens=2 - значит, что первой букве цикла нужно присвоить значение 2-го токена.
Первая буква цикла у нас X. Переменная называется %%X
А второй токен - это подстрока "кода"

8) Только теперь мы попадаем в тело цикла: Echo %%X
что означает - вывести на экран текст "кода"

С 3-ей строкой потренируйтесь самостоятельно.
Вот такой результат окажется на экране:

кода
блюдо



Ключ /L
Windows Batch file
1
FOR /L %%a IN (0,2,6) DO echo %%a
IN (первое, шаг, последнее)
означает математическое перечисление чисел от первого числа (0), до третьего (6), с шагом, указанным вторым числом (2) в наборе IN (...).

Указанная команда выведет:
0
2
4
6
Прим.: дробные числа командной строкой не поддерживаются.

http://www.cyberforum.ru/visual-basic/thread454579.html

11
Миниатюры
Циклические операции и примеры (команда FOR) * [Статья]  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2013, 00:56
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Циклические операции и примеры (команда FOR) * [Статья] (CMD/BAT):

Добрый день. Вероятность того что команда а и команда б забьет 2,3,4,5 голов
Команда а, сыграла дома 12 матчей забила 17 мячей и пропустила 7 Команда б,...

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

Почему команда «dir>test.txt» работает, а команда «ftp /?>test.txt» — нет?
Пробовала без пробелов, что тут еще можно попробовать непонятно Выводит в окно...

Статья по информатике
Здравствуйте! Не могу найти актуальную тему для статьи на &quot;научную&quot;...

Статья на конференцию
Здравствуйте! Не могу найти актуальную тему для статьи на &quot;научную&quot;...

16
Dragokas
Эксперт WindowsАвтор FAQ
16922 / 7007 / 851
Регистрация: 25.12.2011
Сообщений: 10,803
Записей в блоге: 16
04.02.2013, 00:57  [ТС] #2
Продолжение...

Особенности, которые распространяются на циклы FOR

0) Если нужно записать в наборе несколько команд, то используем:
а) знаки амперсанда &, если мы хотим записать все в одну строку:
Windows Batch file
1
FOR /L %%a IN (1,1,10) DO echo Найден файл:& echo %%a
б) знаки скобок, если хотим разбить команды в несколько строк для наглядности и удобства:
Windows Batch file
1
2
3
4
FOR /L %%a IN (1,1,10) DO (
  echo Найден файл:
  echo %%a
)
1) Пустые строки в содержимом файлов и выводе команд игнорируются.

2) Если предполагается получение пустого токена, остальные токены смещаются.
К примеру,
имеем файл с содержимым:
Цитата Сообщение от file.txt
один//три
Применим команду:
Windows Batch file
1
FOR /F "tokens=1,2,3 delims=/" %%a in (file.txt) do echo a=%%a; b=%%b; c=%%c
Результат будет:
Цитата Сообщение от cmd
a=один; b=три; c=
вместо ожидаемого
Цитата Сообщение от cmd
a=один; b=; c=три
3) Все специальные (служебные) символы необходимо экранировать (предварять птичкой ^).
Это такие символы, как | = ^ < > &. А также % ! - если они используются не для раскрытия переменной, кроме случая с !, когда не включено удаленное расширение переменных.
Сюда же входит знак кавычки, которая соответствует форме кавычки, применяемой для определения вида набора.

4) Регистр переменной цикла имеет значение.

5) Изменить вручную значение переменной цикла нельзя. Например, set %%A=param не даст эффекта.

6) После выхода из цикла переменная цикла уничтожается.

7) Внутри цикла нельзя использовать комментарии вида :: (будет критическая ошибка и "вылет" из пакетного файла)
Вместо этого используем Rem.

8) Внутри цикла нельзя использовать метки (будет такой же "вылет").

9) Тем не менее из цикла можно безвозвратно выйти на метку Goto metka
а также выйти в подпрограмму и вернутся снова в цикл точно в ту же позицию через команду Call :metka
В конце подпрограммы должна стоять команда Exit /B

10) Для получения значения обычной переменной внутри цикла в случае, если этой переменной было присвоено новое значение внутри тела этого же цикла, необходимо раскрывать переменную через знаки восклицания !variant! - это называется отложенное расширение переменных.
Перед использованием такого способа, его нужно включить, задав в начале пакетного файла команду:
Windows Batch file
1
SetLocal EnableDelayedExpansion
Иначе, если использовать обычный способ раскрытия %variant%, мы получим значение переменной, присвоенное ей еще до входа в цикл.
Точно таким же образом (через ! ) необходимо раскрывать переменную времени внутри цикла, т.к. иначе для цикла время "замерзает".
Происходит это потому, что в цикл попадает т.н. "слепок" переменных среды. И работа с ними через % происходит уже как с копией данных, а не актуальными значениями.

11) Когда после IN указана команда, под разбор цикла попадают такие потоки:
1-й поток (StdOut)
с 3-го по 9-й поток (User Stream)

При этом 2-й поток (StdError) отображается на экране сразу после выполнения указанной в цикле команды в IN (...)
2-й поток можно занулить, обычным способом, не забыв экран:
Windows Batch file
1
FOR /F %%A IN ('dir %someparam% 2^>nul') do rem
Также можно перенаправить 2-й поток, чтобы он обрабатывался вместе с первым, вместо его вывода на экран:
Windows Batch file
1
FOR /F %%A IN ('dir %someparam% 2^>^&1') do rem
Собственно, чтобы наоборот, обрабатывать 2-й поток вместо первого, можно воспользоваться следующей конструкцией:
Windows Batch file
1
FOR /F %%A IN ('dir %someparam% 1^>nul 2^>^&3') do rem
12) При запуске цикла из консоли (cmd.exe) переменные цикла нужно указывать без удвоения знака процента %a.
Это же правило касается вызова цикла через Shell-подобные команды на других языках программирования.

13) Переменную цикла нельзя раскрыть внутри строки модификаторов другого цикла:
for /f %%q in (quote) do for /f "usebackq tokens=1* delims=%%q" %%a in ("%~dp01.txt") do echo %%a%%b
8
Smitis
1628 / 337 / 39
Регистрация: 15.10.2012
Сообщений: 529
01.05.2013, 01:52 #3
Уточнение для 4090287
Цитата Сообщение от Dragokas Посмотреть сообщение
7) Внутри цикла нельзя использовать комментарии вида :: (будет критическая ошибка и "вылет" из пакетного файла)
Вместо этого используем Rem.
8) Внутри цикла нельзя использовать метки (будет такой же "вылет").
Пример
Bash
1
2
3
4
5
6
7
@echo off
for %%n in ( 0 1 2 3 4 5 6 7 8 9 ) do (
    :label
    echo %%n
    :: comment
    echo %%n
)
Работает (XP,Win7). Также можно перейти на метку label.
2
Dragokas
Эксперт WindowsАвтор FAQ
16922 / 7007 / 851
Регистрация: 25.12.2011
Сообщений: 10,803
Записей в блоге: 16
25.05.2013, 01:50  [ТС] #4
Практические примеры:

1) Использование ключа /D

(спасибо sov44) http://www.cyberforum.ru/cmd-bat/thread792732.html#post4168829

2)
Bash
1
for /F %%i in ("*.txt") do set FILE_NAME=%%~nxi
Берет первый по алфавиту файл, заданный маской *.txt, и сразу выходит из цикла.
Можно также задавать конкретный путь перед маской.
(спасибо pistol за найденный пример.)
1
Dragokas
Эксперт WindowsАвтор FAQ
16922 / 7007 / 851
Регистрация: 25.12.2011
Сообщений: 10,803
Записей в блоге: 16
05.01.2014, 22:00  [ТС] #5
3) Использование модификатора %~$ПУТЬ:I для поиска файла в папках, заданных переменной среды Path:
Bash
1
for %%a in ("wmic.exe") do echo %%~s$PATH:a
где:
wmic.exe - наш искомый файл

Цитата Сообщение от help
Переменная среды ПУТЬ (в примере PATH), и переменная %a
заменяется на полное имя первого найденного файла.
Если переменная ПУТЬ не определена или в результате поиска
не найден ни один файл, то этот модификатор заменяется на пустую строку.
3
Dragokas
Эксперт WindowsАвтор FAQ
16922 / 7007 / 851
Регистрация: 25.12.2011
Сообщений: 10,803
Записей в блоге: 16
05.11.2014, 01:39  [ТС] #6
Bash
1
for %%i in (text) do echo %%i
где text - текст, разбивка на итерации которого происходит по знакам:
  • пробел
  • парные кавычки*
  • табуляция
  • запятая
  • точка с запятой
  • знак равенства.

* см. примечание от ComSpec.
1
ComSpec
3400 / 1945 / 627
Регистрация: 26.02.2014
Сообщений: 1,457
05.11.2014, 03:57 #7
Цитата Сообщение от Dragokas Посмотреть сообщение
Надо бы в фак где-то добавить !
Dragokas, надо бы ещё исключить кавычки из перечня разделителей и написать, что парные двойные кавычки, наоборот, объединяют часть строки (или всю строку) вместе с перечисленными разделителями в одно "слово", и при этом сами сохраняются, и если к ним справа или слева примыкает группа символов без разделителей, то она также входит в состав этого "слова".
Исходя из сказанного, надо признать, что данный метод крайне ненадёжен для подсчёта слов (в обычном смысле понятия "слово") в реальных текстах.
2
Dragokas
Эксперт WindowsАвтор FAQ
16922 / 7007 / 851
Регистрация: 25.12.2011
Сообщений: 10,803
Записей в блоге: 16
28.04.2015, 20:24  [ТС] #8
Удаление лидирующих нулей

Windows Batch file
1
2
3
4
5
6
:: математические операции со значениями 08 и 09 будут приводить к ошибкам
set /a m=%date:~3,2%
:: поэтому для начала, удаляем лидирующие нули
set m=%date:~3,2%
for /f "tokens=* delims=0" %%j in ("%m%") do set m=%%j
echo %m%
4
Smitis
29.04.2015, 00:11
  #9

Не по теме:

Удаление лидирующих нулей (дополнение)
Если количество цифр в числе, в котором надо удалить лидирующие нули, известно заранее, то можно поступить так (для месяца из двух цифр)

Windows Batch file
1
2
3
4
:: В вычитаемом числе должно быть столько нулей, сколько цифр исходном числе.
:: Исходное число должно быть не длинее 9-ти разрядов.
set /a m=1%date:~3,2%-100
echo %m%
Можно сразу подставлять такую конструкцию в нужное выражение

1
ComSpec
3400 / 1945 / 627
Регистрация: 26.02.2014
Сообщений: 1,457
29.04.2015, 11:20 #10
Циклическая конструкция с использованием сочетания модификаторов
"tokens=* delims=<символы>"
является универсальным "триммером" для удаления любых заявленных символов из начала строки до первого незаявленного символа.


Пример:

код:
Windows Batch file
1
for /f "tokens=* delims=0123456789" %i in ("972630014380333075vfh658weghui72qcfgb3658eyfgcb7652qweuy8") do @echo %i
результат:
vfh658weghui72qcfgb3658eyfgcb7652qweuy8
2
ComSpec
3400 / 1945 / 627
Регистрация: 26.02.2014
Сообщений: 1,457
30.04.2015, 13:01 #11
Как известно, значение переменной цикла нельзя просто подставить в качестве модификатора в другой, вложенный, цикл:
Windows Batch file
1
for /f "tokens=2" %i in ("1 3 5") do @for /f "tokens=%i" %j in ("1 3 5 7 9") do @echo %j
.
Результатом такой подстановки будет вывод ошибки:
Непредвиденное появление: %i".
.

Если же сделать так:
Windows Batch file
1
2
for /f "tokens=2" %i in ("1 3 5") do @set x=%i
for /f "tokens=%x%" %j in ("1 3 5 7 9") do @echo %j
,
то ошибки не будет:
5
.

Но как всё же осуществить корректный вывод во вложенном цикле?

Если попробовать присвоить какой-нибудь переменной значение переменной первого цикла, а эатем запустить второй цикл с этой переменной в новом экземпляре интерпретатора с включённым отложенным расширением, то ошибка не исчезает:
код:
Windows Batch file
1
for /f "tokens=2" %i in ("1 3 5") do @set x=%i& cmd/v/c for /f "tokens=!x!" %j in ("1 3 5 7 9") do @echo %j
;
результат:
Непредвиденное появление: !x!".
.

Оказалось, что это можно сделать проще, а именно просто запустить вложенный цикл в новом экземпляре интерпретатора:
код:
Windows Batch file
1
for /f "tokens=2" %i in ("1 3 5") do @cmd/c for /f "tokens=%i" %j in ("1 3 5 7 9") do @echo %j
;
результат:
5
.
6
Dragokas
Эксперт WindowsАвтор FAQ
16922 / 7007 / 851
Регистрация: 25.12.2011
Сообщений: 10,803
Записей в блоге: 16
24.08.2015, 15:48  [ТС] #12
Распределение итераций цикла for без ключей.
1
Dragokas
Эксперт WindowsАвтор FAQ
16922 / 7007 / 851
Регистрация: 25.12.2011
Сообщений: 10,803
Записей в блоге: 16
29.01.2016, 00:20  [ТС] #13
Дополнение к предыдущей ссылке: http://www.cyberforum.ru/cmd-bat/thread1649047.html#post8677908
0
ComSpec
3400 / 1945 / 627
Регистрация: 26.02.2014
Сообщений: 1,457
29.01.2016, 06:55 #14
Разбор строки с учётом "пустых токенов".

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

Цитата Сообщение от Dragokas Посмотреть сообщение
*
?
"
.

Единственный минус -- восклицательный знак не может использоваться в качестве разделителя (но только в качестве разделителя, наличие же его в анализируемой строке не вызовет проблем).

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
@echo off
 
 
rem     Задаём переменную для разделителя.
rem     Разделителем может быть любой символ, кроме восклицательного знака.
rem     Символ процента необходимо удваивать.
 
set "d=|"
 
 
rem     Задаём переменную для строки.
rem     Строка может состоять из любых символов.
rem     Обычно значение присваивается переменной так: set "s=string".
rem     Но если в строке есть кавычки в сочетании со специальными символами,
rem     то задавать переменную желательно без кавычек,
rem     экранируя специальные символы по следующему правилу:
rem     символы не экранируются, если они находятся между парой кавычек;
rem     если число кавычек нечётное, то символы,
rem     расположенные после последней кавычки, не экранируются.
rem     Символы процента необходимо удваивать.
rem     Таким образом, строка
rem     ^!*"'||&*)"%=|", ;<>
rem     будет записана в переменную вот так:
 
set s=^^!*"'||&*)"%%=^|", ;<>
 
rem     При чтении строки из файла код справится с любым специальным символом
rem     без какого-либо предварительного экранирования или удваивания символов процента:
rem     <"test.txt" set/p s=
 
 
rem     Чтобы код был устойчив ко всем специальным символам,
rem     он написан в одну строку с переносами без использования кавычек.
rem     Комментарии в кодах такого типа пишутся так:
rem     rem: [комментарий] ^&^
 
 
                                             cmd/v/c^
                    rem: Данное преобразование строки необходимо для устранения ^&^
                    rem: эффекта исчезновения из строки кареток или уменьшения их числа: ^&^
                                   set s=!s:^^^^=^^^^^^^^!^&^
                    rem: Добавляем к каждому разделителю лишний символ слева ^&^
                    rem: (выбор пал на вопросительный знак) ^&^
                    rem: и разбиваем получившуюся строку на четыре токена: ^&^
    for /f usebackq^^ tokens^^=1-4^^ delims^^=^^^%d%^^ eol^^= %%i in ('!s:^^^%d%^^=?^^^%d%!') do @^
                    rem: Записываем значения переменных цикла в переменные среды ^&^
                    rem: (таким образом, к каждому токену, кроме последнего, добавился справа ^&^
                    rem: наш лишний символ, а псевдотокен с пустым значением стал полноценным): ^&^
                                           set i=%%i^&^
                                           set j=%%j^&^
                                           set k=%%k^&^
                    rem: Переменную для последнего токена можно не задавать. ^&^
                    rem: А теперь выводим полученные значения без последнего символа: ^&^
                                       echo. [!i:~^^,-1!] ^&^
                                       echo. [!j:~^^,-1!] ^&^
                                       echo. [!k:~^^,-1!] ^&^
                    rem: Последний токен выводим без изменений: ^&^
                                       echo. [%%l]        ^&^
                    rem: Можем и собрать строку обратно: ^&^ echo.^&^
                    echo.!i:~^^,-1!!d!!j:~^^,-1!!d!!k:~^^,-1!!d!%%l^&^
                                               exit /b
 
 
pause>nul
.

P.S. Вот как необычно непарная кавычка в строке код раскрасила.
2
mostApi
5 / 3 / 1
Регистрация: 15.05.2015
Сообщений: 256
04.02.2016, 21:33 #15
Dragokas, присвоение значения переменной - результатом выполнения внешнего исполнительного файла?
0
Dragokas
Эксперт WindowsАвтор FAQ
16922 / 7007 / 851
Регистрация: 25.12.2011
Сообщений: 10,803
Записей в блоге: 16
04.02.2016, 21:54  [ТС] #16
mostApi, позволю себе перефразировать:

Присвоение переменной результата выполнения внешнего исполняемого файла.
Windows Batch file
1
for /f "delims=" %%a in ('file.exe') do set "var=%%a"
Добавлено через 1 минуту
Это если результат выполнения - 1 строка.
1
semiono
12 / 12 / 0
Регистрация: 14.09.2010
Сообщений: 285
Записей в блоге: 6
30.04.2017, 23:56 #17
FOR %%a IN (C:\$\*.sfp) do dd if=C:\$\patch of="%%a" bs=1d

Я надеюсь без ошибок будет?
Вроде получилось патчить файлы утилитой dd for windows!
0
30.04.2017, 23:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.04.2017, 23:56
Привет! Вот еще темы с решениями:

Вводная статья
Нужна основательная вводная статья(книги, которые удалось найти достаточно...

Статья о Томкат
слышали? оказывается томкат - не полосатый, а пятнистый. и этакий зверь грозный...

Статья о комментариях
Здравствуйте . Читал статью о том как сделать комментарии для сайта и не понял...

Статья о радиодальномере
Собсно, я не в курсах на этом форуме. Но подумал, мож кому будет интересен...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru