Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Передача двойных параметров в цикле

Ответить
Настройки темы
CMD/BAT - [решено] Передача двойных параметров в цикле

Новый участник


Сообщения: 4
Благодарности: 0

Профиль | Отправить PM | Цитировать


Добрый вечер.

Есть несколько компьютеров с которых необходимо бэкапить данные. Допустим для простоты их N
comp_1 с IP 192.168.1.1 и некоторым модификатором R13
comp_2 с IP 192.168.1.2 и некоторым модификатором R84
...
comp_N с IP 192.168.1.N и некоторым модификатором R3

Класть результаты будем, допустим, по пути C:\backup\

Теперь собственно о самой проблеме. В зависимости от IP компьютера-источника, необходимо класть данные в папку с модификатором, т.е. из comp_1 мы должны положить файлы в папку C:\backup\R13\

Можно ли в конструкции
Код: Выделить весь код
For %%i in (192.168.1.1 192.168.1.2 .. 192.168.1.N ) do call:backup %%i
--
--
:backup
if %1==IP_1 BACKUP_FOLDER=Modificator_1
if %1==IP_2 BACKUP_FOLDER=Modificator_2
if %1==IP_3 BACKUP_FOLDER=Modificator_3
...
if %1==IP_N BACKUP_FOLDER=Modificator_N
Обойтись без этой кучи IF? Каждому IP соответствует один и только один модификатор.
Может как-то парой их в txt засунуть и в цикле читать их оттуда и разбирать? Но как? В bat не силен.

Спасибо.

Отправлено: 21:43, 27-10-2011

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


RuCosinus, например, так:
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

for %%i in ("192.168.1.1 R13" "192.168.1.2 R84" "192.168.1.N R3") do call :backup %%~i

endlocal
exit /b 0

:backup
	setlocal enableextensions enabledelayedexpansion
	
	echo IP=%1
	echo BACKUP_FOLDER=%2
	echo.
	
	endlocal
	exit /b 0
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:18, 27-10-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Ветеран


Contributor


Сообщения: 2733
Благодарности: 1698

Профиль | Отправить PM | Цитировать


RuCosinus, Вам цикл и If не нужны вовсе, коль Вы всё равно перечисляете все Ваши Ip и модификаторы, а не вычисляете в цикле их соответствие. Если бы у Вас был просмотр всех Ip от 1 до N и им бы, например, соответствовали последовательно модификаторы R001 R002 ... R00N, цикл бы имел смысл. Я предлагаю такое построение батника
Код: Выделить весь код
.....

call :backup 192.168.1.1 R13
call :backup 192.168.1.2 R84
call :backup 192.168.1.N R3

.....
GoTo :Eof

:backup

echo Ip=%1
echo Модификатор=%2

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 09:08, 28-10-2011 | #3


Новый участник


Сообщения: 4
Благодарности: 0

Профиль | Отправить PM | Цитировать


Iska
Спасибо, красиво. Вот что-то типа этого я и имел ввиду, когда задавал вопрос.

megaloman
И то правда Но очень уж, IMO, громоздко, что, правда, некоторым образом относится и к примеру Iska.

Поковырявшись в интернете, решил вывести входные данные в отдельный файл, что сильно разгрузит батник от кучи перечислений (в примере Iska) или кучи повторяющихся команд (в примере megaloman). Нашел следующий пример
Код: Выделить весь код
For /F "usebackq tokens=1,2 delims=," %%i In ("%file%") Do ()
Файл данных простой донельзя
Код: Выделить весь код
R13,192.168.1.1
R84,192.168.1.2
Но наткнулся на ограничение. При конструкции следующего вида:
Код: Выделить весь код
For /F "usebackq tokens=1,2 delims=," %%i In ("%file%") call:backup
...
:backup
в функции backup не виден %%j. Подозреваю это оттого, что я не разобрался с вот этим usebackq.
Если делать без вызова, то бишь вот так:
Код: Выделить весь код
For /F "usebackq tokens=1,2 delims=," %%i In ("%file%") Do (
SET SRC_PATH=\\%%j\data
echo %SRC_PATH%
echo %%i %%j
)
, то в SRC_PATH всегда выводится последний IP-шник из нашего файла, хотя echo %%i %%j отображает правильно. Опять таки, видимо, из-за того, что я не очень понимаю, что есть SET
Помогите разобраться с этим.

Еще у меня возникли несколько других вопросов, например по поводу exist, по поводу if-ов и обработки ошибок. Правильно ли я понимаю, что лучше для каждого вопроса создавать свою тему, дабы не валить все в кучу? Меня спамером и ботом, часом, не обзавут?

Отправлено: 15:24, 28-10-2011 | #4


Аватара для gora

Ушёл из жизни


Сообщения: 6021
Благодарности: 3491

Профиль | Отправить PM | Цитировать


RuCosinus, замените разделитель в Вашем файле с запятой на пробел
Код: Выделить весь код
R13 192.168.1.1
R84 192.168.1.2
и все станет просто:
Код: Выделить весь код
@Echo Off
:: Обрабатываемый файл
Set file=e:\Temp\in.txt
for /f "usebackq delims=" %%a in ("%file%") do call :backup %%a
Pause>Nul

:backup
Echo %1
Echo %2
GoTo :EOF
Цитата RuCosinus:
Еще у меня возникли несколько других вопросов, например по поводу exist, по поводу if-ов и обработки ошибок »
Справка по командам:
If /?
Exist /?
и т.д.
В помощь: Полезные ресурсы по скриптовым языкам администрирования
Цитата RuCosinus:
Правильно ли я понимаю, что лучше для каждого вопроса создавать свою тему »
Правильно.
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:17, 28-10-2011 | #5


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата RuCosinus:
Поковырявшись в интернете, решил вывести входные данные в отдельный файл… »
Это — самый правильный подход. К сожалению, далеко не все понимают, что надо отделять мух от котлет данные от кода.
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:24, 28-10-2011 | #6



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Передача двойных параметров в цикле

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Передача параметров функциям Winapi (например, Beep) из консоли hiatis Скриптовые языки администрирования Windows 0 21-04-2010 00:00
Передача параметров в адресную строку DaRiYs Вебмастеру 4 27-06-2008 01:52
C/C++ | Передача параметров через консоль Mad Mouse Программирование и базы данных 4 09-03-2006 16:34
передача параметров в коммандной строке netcat Хочу все знать 4 29-04-2005 00:30
передача параметров для SSI Vlad Drakula Вебмастеру 3 30-05-2003 16:50




 
Переход