Команда for - організація циклічної обробки результатів виконання інших команд, списків, і рядків в текстових файлах

Відео: Уроки по С ++. Урок 9. Циклічний оператор FOR

команда FOR використовується для виконання команди, заданої у вигляді параметра, для кожного елемента з набору. Як елементи можуть використовуватися файли, каталоги, набори рядків.

Формат командного рядка:

FOR% змінна IN (набір) DO команда [параметри]

параметри:

% змінна - Однобуквений підставляється параметр.

(Набір) - Це впливає на доступність, що складається з одного або несколькіхелементов, оброблюваних командою.

команда - Команда, яку слід виконати для кожного елемента набору.

параметри - Параметри для команди, що виконується по відношенню до елементів набору.

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

%% змінна замість % змінна. Імена переменнихучітивают регістр букв (% i відрізняється від% I).

Підтримуються також додаткові форма команди FOR:

FOR / D% змінна IN (набір) DO команда [параметри]

Ключ / D задає як набір імена каталогів (не файл).

FOR / R [[диск:] шлях]% змінна IN (набір) DO команда [параметри]

Ключ / R задає виконання команди для каталогу [диск:] шлях, а також для всехподкаталогов цього шляху. Якщо після ключа / R не вказано Імякаталога, використовується поточний каталог. Якщо набір - етоодіночний символ точки (.), Команда просто перераховує дерево каталогів.

FOR / L% змінна IN (початок, крок, кінець) DO команда [параметри]

Ключ / L задає обробку набору з послідовності чисел з заданниміначалом, кінцем і кроком збільшення. Так, набір (1,1,5) розкривається в (1 2 3 4 5), а набір (5, -1,1) - в (5 4 3 2 1)

FOR / F [ "ключі"]% змінна IN (набір-файлів) DO команда [параметри]

FOR / F [ "ключі"]% змінна IN ( "рядок") DO команда [параметри]

FOR / F [ "ключі"]% змінна IN ( `команда`) DO команда [параметри]

Ключ / F задає обробку файлів, строкових значень або результатів стандартного виводу іншої команди. Набір файлів - містить імена одного або декількох файлів, які по черзі відкриваються, читаються і обрабативаются.Обработка полягає в читанні файлу, розбивці його на отдельниестрокі тексту і розборі кожного рядка в нуль або більше подстрок.Затем викликається тіло циклу "for", при виконанні которогокаждая знайдений підрядок використовується в якості значеніяпеременной. За замовчуванням ключ / F виділяє з кожної строкікаждого файлу першу відокремлену пробілами подстроку. Пустиестрокі в файлі пропускаються. Необов`язковий параметр "ключі" служить для перевизначення правил розбору за замовчуванням. Онпредставляет собою укладену в лапки рядок, содержащуюодно або кілька ключових слів для визначення параметровразбора. Ключові слова:

eol = символ - знак початку коментаря в кінці рядка (ознака кінця оброблюваних даних рядка). Здається в вигляді одиночного символу.

skip = n - число пропускаються при обробці рядків від началафайла.

delims = xxx - набір роздільників між робочою елементами рядків. Замовчуванням, як роздільники використовуються прогалини і знаки табуляції.

tokens = x, y, m-n - номера подстрок з кожного рядка, що передаються в телоцікла "for" для кожної ітерації. Наприклад, для звичайного текстового файлу, підрядками будуть слова, а роздільниками подстрок - прогалини або знаки табуляції. При використанні цього ключа виділяються додаткові імена змінних. формат m-n являє собою діапазон подстрок з номерами від m по n. Якщо останній знакв рядку tokens = є зірочкою, то создаетсядополнітельная змінна, значенням якої будетв залишився текст в рядку після разборапоследней підрядка.




usebackq - режим обробки лапок. Рядок, укладена в зворотні лапки, виконується каккоманда, рядок, укладена в прямі одіночниекавичкі, є рядком символів, а двойниекавичкі можуть використовуватися для завдання іменфайлов, що містять пробіли.

Пояснює приклад:

FOR / F "eol = - tokens = 2,3 * delims =,"% i in (myfile.txt) do @echo% i% j% k

Виконується розбір файлу myfile.txt. Всі рядки, коториеначінаются з крапки з комою (eol = -), пропускаються. Друга ітретья підрядка з кожного рядка (tokens = 2,3) передаються в тіло циклу "for", прічемподстрокі розділяються комами і / або пробеламі.В тілі циклу змінна % i приймає значення второйподстрокі, % j - третій, а % k - все оставшеесяполе до кінця рядка після третьої підрядка. Імена файлів, що містять пробіли, необхідно укладати в подвійні лапки. Щоб іспользоватьдвойние лапки, необхідно використовувати параметр usebackq, інакше подвійні лапки будуть сприйняті як определеніестрокі-литерала для розбору.

В даному прикладі змінна % i явно оголошена в інструкції "for", а змінні% j і % k оголошуються неявно за допомогою ключа tokens = .ключ tokens = дозволяє отримати з одного рядка файлу до26 подстрок. Слід пам`ятати, що імена змінних FOR є однобуквеним,з урахуванням регістра, тому одночасно не може бути активно понад 52 змінних, що задаються як явно, так і неявно.

команда FOR / F може також використовуватися для обработкіявно заданої рядки, укладеної в поодинокі лапки іуказанной як параметр в дужках. Вона буде разобранатак ж, як одиночна рядок, обчислена з вхідного файлу.

Як оброблюваного набору, також, може бути використаний висновок (виходниеданние) іншої команди. В цьому випадку іспользуетсяв як параметр в дужках рядок в зворотних одіночнихкавичках . Цей рядок передається для виконання дочернемуобработчіку команд CMD.EXE, а висновок цієї командисохраняется в пам`яті і розбирається так, як якщо б Етобил файл. приклад:

FOR / F "usebackq delims =="% i IN ( `set`) DO @echo% i,

виконується команда SET, відображає значення змінних середовища і команда FOR / F виведе їх перелік з використанням команди echo .

В команді FOR можливе використання посилань на переменние.Допускается застосування наступних синтаксичних конструкцій:

% ~ I - з змінної% I видаляються обрамляють лапки ( ")



% ~ FI - змінна% I розширюється до повного імені файлу
% ~ DI - з змінної% I виділяється тільки ім`я диска
% ~ PI - з змінної% I виділяється тільки шлях до файлу
% ~ NI - з змінної% I виділяється тільки ім`я файлу
% ~ XI - з змінної% I виділяється розширення імені файлу
% ~ SI - отриманий шлях містить тільки короткі імена
% ~ AI - змінна% I розширюється до атрибутів файлу
% ~ TI - змінна% I розширюється до дати / часу файлу
% ~ ZI - змінна% I розширюється до розміру файлу
% ~ $ Path: I - проводиться пошук по каталогам, заданим в змінного середовища path, і змінна % I замінюється на повне ім`я першого знайденого файла.Еслі змінна path не визначена або в результаті пошуку не знайдено жодного файл, то цей модифікатор замінюється на порожній рядок.

При об`єднанні кількох операторів можна отримати наступні результати:

~ dpI - змінна I розкривається в ім`я диска і шлях
~ nxI - змінна I розкривається в ім`я файлу і його розширення
~ fsI - змінна I розкривається в повний шлях з короткими іменами
~ Dp $ path: I - проводиться пошук по каталогам, заданим в змінного середовища path, і змінна I розкривається в ім`я диска і шлях до першого знайденого файлу.
~ ftzaI - змінна I розкривається в рядок, подібну видається командою DIR

У наведених вище прикладах змінні I і path можнозаменіть на інші допустимі значення. Сінтаксіческаяконструкція з символами ~ закінчується допустимим іменемпеременной циклу FOR.

Для імен змінних рекомендується використовувати заглавниебукви, наприклад -I, що робить цю конструкцію більш удобнойдля читання і запобігає помилкове прийняття їх замодіфікатори, що не розрізняють регістр.

При використанні команди FOR в командних файлах, якщо всередині циклу потрібно виконати більше однієї команди, то вони полягають в дужки:

FOR% змінна IN (набір) DO (
команда1 [параметри]
команда2
. . .
)


приклад:

@echo OFF
for / L %% I in (1,1,5) DO (
echo FIRST %% I
ECHO LAST %% I
)


Зазвичай, в командних файлах команда FOR використовується не тільки для аналізу інформації, але і їх обробки, що вимагає використання змінних усередині циклу FOR. І тут виникає проблема - зміни значень змінних не відбувається, тобто їх застосування всередині дужок неможливо. Подібне явище викликане не логічними передумовами, а всього лише певними особливостями реалізації командного процесора CMD.EXE, і це потрібно обов`язково враховувати при обробці змінних всередині циклів команд FOR і IF. Іншими словами, використання значень змінних всередині дужок, вимагає змінити стандартний режим інтерпретації командного процесора. Розробниками передбачена можливість запуску CMD.EXE з параметром / V: ON, що включає дозвіл відкладеного розширення змінних середовища із застосуванням символу знаку оклику (!) Як роздільник. Тобто, параметр / V: ON дозволяє використовувати !var! в якості значення змінної var під час виконання всередині циклів команд FOR і IF. Але на практиці частіше використовується можливість локального включення даного режиму всередині командного файлу спеціальною директивою:

Setlocal EnableDelayedExpansion

Після чого, можна обробляти прийняті змінними значення всередині циклу, використовуючи замість знаків відсотка знаки оклику. Синтаксично, використання обох роздільників допускається, але результати цього використання будуть різними, що наочно демонструється наступним командним файлом:

Setlocal EnableDelayedExpansion
@ECHO OFF
set VAR = before
if "% VAR%" == "before" (
set VAR = after
if "! VAR!" == "after" @echo Зі знаком відсотка =% VAR%, Зі знаком питання =! VAR!
)
команда
set VAR = after виконується всередині підпрограми, обмеженою дужками і, якщо прибрати команду Setlocal EnableDelayedExpansion або не використовувати для отримання значення змінної VAR знаки оклику, її значення залишиться старим (тим, що було встановлено до входу в цикл команди FOR ).

Дана особливість реалізації командного процесора Windows нерідко призводить до несподіваних результатів при використанні груп команд, об`єднаних дужками в конструкціях FOR і IF і тоді, коли значення будь-якої змінної змінюється всередині циклу з однією командою. Наприклад, для отримання списку файлів поточного каталогу такий командний файл працювати не буде:

set LIST =
for %% i in (*) do set LIST =% LIST% %% i
echo% LIST%

Начебто, логічно все вірно, але не врахована особливість обробки значень змінних. значення змінної
LIST всередині циклу команди FOR змінено не буде, воно залишиться порожнім (задано командою SET LIST =), яким і було на початок циклу FOR. команда SET LIST =% LIST% %% I повинна в кожному циклі міняти значення змінної LIST на поточний, плюс символ пробілу, і плюс поточне значення змінної I, яке приймає значення імені файлу в поточному каталозі. Синтаксично, команда вірна, але через озвученої вище особливості реалізації командного процесора - не працює, і значення змінної LIST не змінюється. Для того, щоб це відбулося, командний файл потрібно змінити, таким же чином, як і в прикладі для групи команд:

Setlocal EnableDelayedExpansion
set LIST =
for %% i in (*) do set LIST =! LIST! %% i
echo% LIST%
Тепер, значення змінної
LIST всередині циклу FOR будетізменяться, послідовно приймаючи значення імен файлів, разделеннихпробелом ( set LIST =! LIST! %% i).

Цю особливість реалізації CMD потрібно враховувати і при використанні значень системних змінних всередині циклів, як наприклад, змінної ERRORLEVEL:

IF! ERRORLEVEL! == 0 замість % ERRORLEVEL% == 0

Поділися в соціальних мережах:

Схожі
Команда recover - відновлення збережених даних на пошкодженому диску.Команда recover - відновлення збережених даних на пошкодженому диску.
Команда more - посторінковий вивід на екран консолі.Команда more - посторінковий вивід на екран консолі.
Команда timeout - задати період очікування.Команда timeout - задати період очікування.
Команда movefile - перемістити або видалити зайнятий файлКоманда movefile - перемістити або видалити зайнятий файл
Команда exit - завершити роботу командного процесора або поточного командного файлу.Команда exit - завершити роботу командного процесора або поточного командного файлу.
Команда ftype - перегляд і зміна розширень файлів і зіставлених їм додатківКоманда ftype - перегляд і зміна розширень файлів і зіставлених їм додатків
Команда find - пошук рядка символів в файліКоманда find - пошук рядка символів в файлі
Команда bootcfgКоманда bootcfg
Команда doskey - редагування і повторний виклик команд windows- створення макросів doskey.Команда doskey - редагування і повторний виклик команд windows- створення макросів doskey.
Команда compКоманда comp
» » Команда for - організація циклічної обробки результатів виконання інших команд, списків, і рядків в текстових файлах