Лог Пафа – CMD.exe FOR. Примеры использования


CMD.exe FOR. Примеры использования

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

Добавить комментарий

Do NOT follow this link or you will be banned from the site!