Переменная с модификатором | Описание |
%~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 прекращает %~ syntax.
Использование прописных букв в именах переменных, например %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".
Для разбора вывода команды с помощью помещения параметра МножествоИменФайлов в скобки можно использовать следующую команду:
for /F "usebackq delims==" %i IN (`set`) DO @echo %i
В данном примере перечисляются имена переменных среды в текущем окружении.
А теперь рассмотрим пример, когда надо будет добавить 1000 пользователей. Вариантов несколько. Добавлять вручную долго, добавлять по 1му из командной строки тоже. Скрипт писать еще накладней, да и конфигурационный файл нужно тоже будет заполнить подробной информацией. Быстрее всего будет использовать цикл, параметрами которого будут имена 1000 пользователей.
Получим команду такого вида:
for %n in (John,Bruce,Mary,Charly,…,James) do dsadd user %n …[список прочих параметров]
Данная запись означает что мы будем брать из списка параметров имена пользователей и создавать пользователя с таким именем командой dsadd. Здесь единственной затратой является написание 1000 имен, однако, это намного меньше, чем писать всю команду целиком 1000 раз или добавлять пользователей вручную из визуальной оболочки.