Найти в Дзене
FOR BEginnerS

CMD. Проходитим по списку адресов и выполняем определенное действие.

Рассмотрим такую ситуацию, что нам нужно выполнить какое-то действие с несколькими узлами в сети например пропингать, чтобы убедиться что узел в сети или скопировать один файл на несколько узлов. 1) Пропингаем список узлов по списку. Список узлов запишем в файл ip_list.txt Первая строка у меня будет путь для файла, пригодиться для дальнейших работ. Начиная со второй строки начинаются узлы, с которыми нам нужно работать. ip_list.txt F:\01_BAT\run\ping1.bat
ya.ru
google.ru Основной запускаемый bat - файл будет выглядеть так FOR /F "skip=1" %%a IN (%~dp0ip_list.txt) DO (%~dp0ping_hosts.bat %%a) Разберем его В нашем примере если упрощать, то в переменную %%a построчно считываются строки из файла ip_list.txt и передаются на выполнение в блок команд после ключевого слова DO. Команда FOR используется для выполнения команды, заданной в виде параметра, для каждого элемента из набора. В качестве элементов могут использоваться файлы, каталоги, наборы строк.
FOR %переменная IN (набор) DO команд
Оглавление

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

1) Пропингаем список узлов по списку.

Список узлов запишем в файл ip_list.txt Первая строка у меня будет путь для файла, пригодиться для дальнейших работ. Начиная со второй строки начинаются узлы, с которыми нам нужно работать.

ip_list.txt

F:\01_BAT\run\ping1.bat
ya.ru
google.ru

Основной запускаемый bat - файл будет выглядеть так

FOR /F "skip=1" %%a IN (%~dp0ip_list.txt) DO (%~dp0ping_hosts.bat %%a)

Разберем его

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

Команда FOR используется для выполнения команды, заданной в виде параметра, для каждого элемента из набора. В качестве элементов могут использоваться файлы, каталоги, наборы строк.

FOR %переменная IN (набор) DO команда [параметры]

skip - задает число строк, пропускаемых в начале файла. В нашем примере пропускаем первую строку, т.к. это путь к файлу.

%~dp0 - это переменная содержит полный путь (включая завершающий слэш) к каталогу выполняемого скрипта. Поэтому написаны слитно вместе с названием файла %~dp0ip_list.txt

%~dp0ping_hosts.bat %%a - вызывается bat - файл ping_hosts.bat с параметром %%a в нашем случае поочередно передаются адреса узлов (ya.ru, google.ru)

Файл ping_hosts.bat - выглядит так

ping %1

Где %1 это первый передаваемый параметр bat - файлу в нашем случае поочередно передаются адреса узлов (ya.ru, google.ru)

2) Скопируем файлы и папки на удаленные хосты нашей подсети.

У меня в примере будем подключаться с логин\пароль от учетки администратора. Если на хостах есть общие папки с правами на запись учетка будет не нужна, подключаться к папке можно без учетки.

Файл ip_list.txt, сейчас будет выглядеть так

C:\TEMP\test
172.24.69.194
172.24.69.196

Основной запускаемый bat - файл будет выглядеть так

set /P path_to_file=<%~dp0ip_list.txt

FOR /F "skip=1" %%a IN (%~dp0ip_list.txt) DO (%~dp0copy_files.bat %%a %path_to_file%)

Командой set задаются переменные, ключ \P означает что переменная ожидает входные данные. В переменную path_to_file записываем первую строку нашего файла ip_list.txt, там у нас храниться путь до файла/файлов/подпапок.

Описание работы цикла FOR смотри выше, меняется вызываемый файл на copy_files.bat и появится дополнительный параметр %path_to_file%

Файл copy_files.bat выглядит так

set login=<логин_админа>
set pass=<пароль_админа>
set ip=%1
set files=%2

IF EXIST X: net use X: /delete /y
net use X: \\%ip%\C$ %pass% /USER:%login% /persistent:no

IF NOT EXIST X:\install mkdir X:\install
xcopy /y /z /h /c /i /r /s %files% X:\install

net use X: /delete /y
-2

Разберем файл copy_files.bat

Командой set задали четыре переменные с логином, паролем, ip-адресом узла и путем до файлов.

IF EXIST X: net use X: /delete /y Далее проверяем существование сетевого диска Х:, если существует удаляем, т.к. может быть привязан к другому узлу сети.

net use X: \\%ip%\C$ %pass% /USER:%login% /persistent:no создаем сетевой диск Х: на нашем узле, ip до сетевого узла берем из переменой ip доступ до сетевого узла будем получать целиком до диска С:, запись C$ Дальше команде передаем пароль из переменной %pass% и логин /USER:%login% /persistent:no - при выходе из системы не сохраняется сетевое подключение

IF NOT EXIST X:\install mkdir X:\install Проверяем существует ли папка install на сетевом диске X:, если папки нет создаем папку install

xcopy /y /z /h /c /i /r /s %files% X:\install копируем файлы с нашего узла по пути хранящимся в переменной files в сетевую папку X:\install

net use X: /delete /y удалям созданный нами сетевой диск с нашего хоста

Более детально по используемым командам можно почитать тут:

IF FOR SET XCOPY