Примеры использования команды FOR в командной строке.
Общая информация:
Регистр букв в именах переменных цикла имеет значение, т.е. %%I и %%i — имена разных переменных.
Для обработки файла со списком компов использовать:
FOR /F "usebackq" %%I IN ("%~dp0complist.txt") DO ...
Пример. Пинг компов по списку с выводом результата пинга:
@echo off Setlocal EnableDelayedExpansion FOR /F "usebackq" %%I IN ("%~dp0complist.txt") DO ( ping -n 1 -w 1000 %%I > nul IF !ERRORLEVEL! EQU 0 ( echo %%I пингуется ) ELSE ( echo %%I не пингуется ) )
Команда Setlocal EnableDelayedExpansion используется для того, чтобы переменная ERRORLEVEL изменяла своей значение внутри цикла.
В каждой итерации в переменную ERRORLEVEL заносится результат работы утилиты ping: 0 — успех и другое значение при неудаче.
При этом, для получения значения переменной необходимо использовать восклицательные знаки вместо процентов.
%~dp0 — означает взять имя диска и путь из переменной %0. В переменной %0 хранится полный путь к батнику. Таким образом, при использовании %~dp0complist.txt — мы обрабатываем файл complist.txt, который должен находиться в той же папке, что и батник.
Если %0 имеет значение:
"D:\Users\Paf\Desktop\test\test3_dp.bat"
то в результате взятия диска и пути %~dp0 будет:
D:\Users\Paf\Desktop\test\
Присвоение переменной значения из результата выполнения другой команды:
Разбор на примере получения SID пользователя, под которым запускаем батник.
В Windows 7+ получить SID можно командой:
whoami /user
Вывод этой команды будет примерно следующим:
Сведения о пользователе ---------------- Пользователь SID ============ ============================================= joke\paf S-1-5-21-4271306830-316596162-3961505744-1001
Из этого вывода нам нужен сам SID.
Пример кода для получения SID с помощью FOR:
@echo off for /F "usebackq skip=6 tokens=1,*" %%I IN (`whoami /user`) DO ( echo %%I echo %%J )
Вывод на экран будет следующий:
joke\paf S-1-5-21-4271306830-316596162-3961505744-1001
Таким образом, в переменной %%I будет пользователь, в переменной %%J будет SID пользователя.
Первые 6 строк (включая пустые) вывода команды whoami /user пропускаем, так как нас интересует 7-я строка где и указан SID.
При выполнении цикла FOR по умолчанию разделителем (при разборе строк-результата вывода команды) является пробел и символ табуляции.
Опция tokens=1,* при этом означает, что при работе цикла будет создано 2 переменных. В первую переменную %%I будет помещена часть 7-й строки от начала и до пробела или символа табуляции. Во вторую переменную (используется следующая по порядку буква) %%J помещается вся остальная строка (даже если она содержит пробелы), так как в опции tokens=1,* вторым токеном указана звездочка (*). В данном случае, звездочку можно было не использовать, так как в SID нет пробелов или символа табуляции. Это для примера.
Цикл с переменной, меняющей значения в заданном диапазоне:
FOR /L %%I IN (Начальное_значение,Шаг,Конечное_значение) DO ...
Пример. Допустим имеем 10 компов, имена которых отличаются цифрой (порядковым номером): COMP-1, COMP-2, … COMP-10
Тогда, например, для удаленной перезагрузки указанных компов можно использовать такой цикл:
FOR /L %%I IN (1,1,10) DO shutdown /r /m \\COMP-%%I /t 0
Разумеется, что учетная запись, под которой запускается батник должна иметь права администратора на удаленных компах.
Ссылки:
FOR:
http://ss64.com/nt/for_f.html
Справка по команде FOR:
http://www.cmdhelp.ru/?cmd=for
Подстановки в FOR:
http://stackoverflow.com/questions/5034076/what-does-dp0-mean-and-how-does-it-work
setlocal:
http://ab57.ru/cmdlist/setlocal.html