Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Передача двойных параметров в цикле (http://forum.oszone.net/showthread.php?t=219076)

RuCosinus 27-10-2011 21:43 1783278

Передача двойных параметров в цикле
 
Добрый вечер.

Есть несколько компьютеров с которых необходимо бэкапить данные. Допустим для простоты их 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 не силен.

Спасибо.

Iska 27-10-2011 22:18 1783313

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


megaloman 28-10-2011 09:08 1783457

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


RuCosinus 28-10-2011 15:24 1783703

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-ов и обработки ошибок. Правильно ли я понимаю, что лучше для каждого вопроса создавать свою тему, дабы не валить все в кучу? Меня спамером и ботом, часом, не обзавут? :)

gora 28-10-2011 16:17 1783736

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
Правильно ли я понимаю, что лучше для каждого вопроса создавать свою тему »

Правильно.

Iska 28-10-2011 18:24 1783799

Цитата:

Цитата RuCosinus
Поковырявшись в интернете, решил вывести входные данные в отдельный файл… »

Это — самый правильный подход. К сожалению, далеко не все понимают, что надо отделять мух от котлет данные от кода.


Время: 04:57.

Время: 04:57.
© OSzone.net 2001-