Cmd for f tokens

Cmd for f tokens

Команда 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 раскрывается в полный путь с короткими именами

Читайте также:  1011 101 В двоичной системе

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

Запуск некоторой команды для каждого файла из заданного множества.

Синтаксис

Параметры

Заметки

  • Использование программы for

Команда for может быть использована в пакетном файле или непосредственно из командной строки.

Использование параметров командной строки пакетного файла

Перечисленные ниже атрибуты применяются к команде for.

  • В команде for переменная %%переменная (или %%переменная) будет заменяться текстовой строкой из заданного параметра множество, пока параметр команда не обработает все файлы этого множества.
  • Имена параметров переменная команды for учитывают регистр буквы, они являются глобальными и одновременно может быть активно не больше 52 переменных.
  • Для обозначения параметра переменная можно использовать любые символы, кроме цифр 09, чтобы не было конфликта с параметрами пакетных файлов %0%9. Для простых пакетных файлов вполне достаточно обозначений с одним символом, например %%f.
  • В сложных пакетных файлах могут быть использованы и другие обозначения для параметра переменная.
  • Задание множества файлов
  • Параметр множество может представлять группу файлов или несколько групп файлов. Для задания групп файлов можно использовать подстановочные знаки (* и ?). Следующие множества файлов являются допустимыми:

    (jan*.doc jan*.rpt feb*.doc feb*.rpt)

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

    Использование ключевых слов in и do

    In и do не являются параметрами, но они требуются для работы команды for. Если какое-то из слов пропущено, на экран будет выведено сообщение об ошибке.

    Использование дополнительных форм команды for

    Если расширения командного процессора разрешены (по умолчанию), то поддерживаются следующие дополнительные формы команды for.

    Если параметр множество содержит подстановочные знаки (* и ?), команда, указанная в параметре команда, выполняется для каждого каталога (кроме множества файлов в указанном каталоге), совпадающего с параметром множество. Используется следующий синтаксис.

    Проходит по дереву каталогов с корнем в [диск:]путь, выполняя инструкцию for для каждого каталога в дереве. Если после ключа /R не задан каталог, предполагается текущий каталог. Если параметр множество задано одной точкой (.), то команда просто перечислит каталоги в дереве. Используется следующий синтаксис.

    Итерация диапазона значений

    Используйте переменную итерации для установки начального значения (НачальноеЗначение#), а затем перемещайтесь по диапазону значений, пока значение не превысит конечное значение множества (КонечноеЗначение#). /L выполнит итерацию, сравнив параметр НачальноеЗначение# с параметром КонечноеЗначение#. Если параметрНачальноеЗначение# меньше параметра КонечноеЗначение#, то выполняется команда. Когда переменная итерации превысит параметр КонечноеЗначение#, командная оболочка покидает цикл. Также можно использовать отрицательный параметр шаг# для перемещения в диапазоне убывающих значений. Например, (1,1,5) создает последовательность «1 2 3 4 5», а (5,-1,1) создает последовательность «5 4 3 2 1». Используется следующий синтаксис.

    Читайте также:  Huawei p smart модель

    for /L <%% | %>переменная in (НачальноеЗначение#,шаг#,КонечноеЗначение#) do команда [ПараметрыКоманднойСтроки]

    Итерация и разбор файлов

    Разбор файлов следует использовать для обработки вывода команды, строк и содержимого файла. Используйте переменные итерации для определения содержимого или строк, которые требуется проверить. Параметр КлючевыеСловаРазбора используется для изменения разбора. Используйте параметр КлючевыеСловаРазбора маркер для указания маркеров, которые воспринимаются как переменные итерации. Примечание. Без параметра маркера ключ /F проверяет только первый маркер.

    Разбор файлов состоит в чтении вывода, строки или содержимого файла, разбиении его на отдельные строки текста и разборе каждой строки на ноль или маркеры. Цикл программы for затем называется с переменной итерации, установленной в маркер. По умолчанию /F передает первый отделенный пробелом элемент из каждой строки каждого файла. Пустые строки пропускаются. Используется также другой синтаксис.

    Аргумент МножествоИменФайлов задает одно или несколько имен файлов. Каждый файл открывается, считывается и обрабатывается до перехода к следующему файлу в аргументе МножествоИменФайлов. Чтобы переопределить стандартное поведение разбора, укажите параметр "КлючевыеСловаРазбора". Это строка, заключенная в кавычки, которая содержит одно или несколько ключевых слов для указания различных режимов разбора.

    Если используется параметр usebackq, используйте один из приведенных ниже синтаксисов:

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

    Ключевое слово Описание
    eol=c Задает символ конца строки (только один символ).
    skip=n Задает число строк, пропускаемых в начале файла.
    delims=xxx Задает набор разделителей. Заменяет набор разделителей по умолчанию, состоящий из пробела и символа табуляции.
    tokens=x,y,m-n Задает элементы, передаваемые из каждой строки в тело цикла for при каждой итерации. В результате размещаются дополнительные имена переменных. Форма m-n задает диапазон, указывающий элементы с m-го по n-ый. Если последним символом строки tokens= является звездочка (*), то размещается дополнительная переменная, в которую помещается остаток строки после разбора последнего элемента.
    usebackq Задает возможность использования кавычек для имен файлов в параметре МножествоИменФайлов. Задает исполнение строки, заключенной в обратные кавычки, как команды, а строки в одиночных кавычках как команды в символьной строке.

    Подстановка переменных

    Были расширены модификаторы подстановок для ссылок на переменные в for. Приведенная ниже таблица перечисляет варианты синтаксических конструкций (на примере переменной I).

    Переменная с модификатором Описание
    %

    I

    Расширение %I, которое удаляет окружающие кавычки (""). %

    fI

    Расширение %I до полного имени пути. %

    dI

    Замена %I именем диска. %

    pI

    Замена %I на путь. %

    nI

    Замена %I одним именем файла. %

    xI

    Замена %I расширением имени файла. %

    sI

    Замена путем, содержащим только короткие имена. %

    aI

    Замена %I атрибутами файла. %

    tI

    Замена %I временем модификации файла. %

    zI

    Замена %I размером файла. %

    $PATH:I

    Поиск в каталогах, перечисленных в переменной среды PATH, и замена %I полным именем первого найденного файла. Если переменная среды не определена или поиск не обнаружил файлов, модификатор выдает пустую строку.

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

    Переменная с объединенными модификаторами Описание
    %

    dpI

    Замена %I именем диска и путем. %

    nxI

    Замена %I именем файла и расширением. %

    fsI

    Замена %I полным именем пути с короткими именами. %

    dp$PATH:I

    Поиск в каталогах, перечисленных в переменной среды PATH, и замена %I именем диска и путем первого найденного файла. %

    ftzaI

    Замена %I строкой, аналогичной результату работы программы dir.

    В приведенных выше примерах %I и PATH могут быть заменены другими допустимыми значениями. Допустимое имя переменной for прекращает %

    Использование прописных букв в именах переменных, например %I, может улучшить восприятие программы и позволит избежать недоразумений с модификаторами, в которых строчные и прописные буквы не различаются.

    Конструкция for /F может быть использована непосредственно для строки. Для этого поместите параметр МножествоИменФайлов между скобками в одиночные кавычки (МножествоИменФайлов). Параметр МножествоИменФайлов будет воспринят как одиночная строка ввода из файла и будет разобран.

    Команду for /F можно использовать для разбора вывода команды. Для этого поместите параметр МножествоИменФайлов между скобками в обратные кавычки. Он будет воспринят как командная строка, которая передается дочернему интерпретатору командной строки Cmd.exe, а результаты работы команды помещаются в памяти и разбираются, как если бы они являлись файлом.

    Примеры

    В пакетных файлах используется следующий синтаксис для команды for:

    for %%переменная in (множество) do команда [ПараметрыКоманднойСтроки]

    Чтобы отобразить содержимое всех файлов, имеющих разрешение .doc или .txt, в текущем каталоге с помощью заменяемой переменной %f, введите следующую команду:

    for %f in (*.doc *.txt) do type %f

    В предыдущем примере каждый файл с расширением .doc или .txt в текущем каталоге будет подставляться вместо переменной %f, пока не будет выведено содержимое всех файлов. Чтобы использовать данную команду в пакетном файле, следует заменить все вхождения %f на %%f. В противном случае переменная игнорируется, и отображается сообщение об ошибке.

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

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

    Данная команда производит разбор каждой строки в файле Myfile.txt, игнорируя строки, начинающиеся с точки с запятой, и передает второй и третий элементы из каждой строки в тело цикла команды FOR. Элементы разделяются запятыми и/или пробелами. Тело инструкции FOR использует %i для получения второго элемента, %j для получения третьего элемента и %k для получения оставшихся элементов в строке. Если имена файлов содержат пробелы, их следует заключать в кавычки (например, "ИмяФайла"). Для использования кавычек необходима команда usebackq. В противном случае кавычки рассматриваются как определение символьной строки для разбора.

    Переменная %i объявлена явно в инструкции FOR, а %j и %k объявлены неявно с помощью tokens=. С помощью tokens= можно указать до 26 элементов, если это не вызовет попытки объявить переменную с именем, большим буквы "z" или "Z".

    Для разбора вывода команды с помощью помещения параметра МножествоИменФайлов в скобки можно использовать следующую команду:

    Читайте также:  Behold tv 507 fm драйвера

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

    В данном примере перечисляются имена переменных среды в текущем окружении.

    tokens and delims

    Step by step

    The general syntax of FOR /F commands, at least the part we are going to analyze, is:

    Using an example, we are going to try and find a way to define values for tokens and delims.

    For our example, we are going to find out who is logged on to a computer with a specified IP address (like, say, one found in our firewall logs).
    The command we’ll use is NBTSTAT.

    will return something like:

    We obviously need the information from the line that contains the string but not the line with the computer name:

    However, since we started with an IP address, in this case there is no way to distinguish between a computer name and a user name.
    That’s why we’ll add another step:

    will return the exact same result.
    Note the lower case -a ( NBTSTAT /? will show you the syntax in detail).

    So if we know the remote PC name we know which line to filter out:

    We’ll use PING to convert the IP address to its associated computer name:

    will return something like:

    What values for delims and tokens do we need to convert the IP address into its computer name?

    Let’s have a closer look at the output of the PING command:

    • we want the (unknown) second word from the first line (actually, the second line, because the first line is blank)
    • that first line contains the (known) IP address enclosed in square brackets [10.100.0.14]
    • none of the other lines contain the IP address enclosed in square brackets, nor any other string in square brackets

    First let’s mark ( yellow highlights underline, overline and strike-through ) the boundaries of the requested word REMOTE_PC:

    This makes our choice for the delimiters, delims, quite obvious: a space.
    If we mark ( yellow highlights underline, overline and strike-through ) all spaces, we can easily see which tokens are available:

    In this case, we’re only interested in tokens 2 and 3:

    • token 2 is the requested computer name
    • token 3 can be used to check if we’re dealing with the correct line: it should equal our original IP address enclosed in square brackets

    So we’re only interested in the tokens 2 and 3:

    This leads us to the following command line:

    %1 is the value of the first command line argument passed to our batch file.
    In our case, the IP address to be investigated.

    IF "%%B"=="[%1]" checks if the third word (token=3) equals the original IP address (%1) enclosed in square brackets ([%1]).
    If we were to skip this test, the end result for token 2 would be the equal sign (=) from the last line (just try it).
    If the test matches, the second word (token=2) is stored in a variable named PC.

    Note that the first token specified (token 2) is stored in the variable specified (%%A), and the following token specified (token 3) in the following variable (in this case: %%B).

    Our batch file thus far:

    The last line, SET PC , displays the actual value of the variable PC. I added it for debugging purposes.
    (Actually, SET PC will display all variables whose names begin with "PC".)

    Say we named our batch file FINDUSER.BAT then the command:

    should display your computer name:

    Now that we have the computer name, we can continue with the NBTSTAT command.

    Let us mark ( yellow highlights underline, overline and strike-through ) the requested substring in NBTSTAT’s output:

    The choice for delims will be obvious: a space.

    Notes: (1) Multiple spaces are still treated as a single delimiter.
    (2) A row of characters in the delims definition is interpreted as "the first character OR the second character OR the third character" etcetera, so you can only use multiple single characters as delimiters in the delims definition, not entire "words".

    The token number may be less obvious, since there are several spaces before the first word.
    Since leading delimiters (before the first word) are ignored, however, it is still the first word in the line, so we need token 1.

    Aside: We can use this feature to strip any number of leading spaces from a string:

    FOR /F "tokens=*" %%A IN (" some string") DO ECHO.%%A

    will return some string (without the leading spaces).
    And this isn’t limited to spaces:

    FOR /F "tokens=* delims=0" %%A IN ("00000012") DO ECHO.%%A

    will return 12

    In this particular case, we will filter out the correct line not by checking the value of the second word ( ) but by using the FIND command:

    will display only the line containing the user ID:

    (Remember? %PC% is the value for the remote computer name that we just got using the PING command).

    To prevent error messages we need to escape the pipe symbols when we use them within brackets in a FOR /F command.
    I will skip the details right now, just remember to place a caret before pipe and redirection characters when used within parentheses of FOR /F commands.

    Our batch file now:

    Note the use of carets ( ˆ , highlighted ) as escape characters for the pipe symbols within the brackets of the second FOR loop!
    Also note that no escape characters are necessary when the redirection characters are quoted, as in FIND " " .

    This batch file could do with some error checking, but as long as we pass it a valid IP address on the command line it should correctly return the IP address, the computer name, and the logged on user.

    One could also use another FOR /F line, combined with the NET USER command, to retrieve the user’s full name too, but I will leave that to you.

    Ссылка на основную публикацию
    Adblock detector