Показать полную графическую версию : [решено] Передача двойных параметров в цикле
RuCosinus
27-10-2011, 21:43
Добрый вечер.
Есть несколько компьютеров с которых необходимо бэкапить данные. Допустим для простоты их 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 не силен.
Спасибо.
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
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
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-ов и обработки ошибок. Правильно ли я понимаю, что лучше для каждого вопроса создавать свою тему, дабы не валить все в кучу? Меня спамером и ботом, часом, не обзавут? :)
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
Еще у меня возникли несколько других вопросов, например по поводу exist, по поводу if-ов и обработки ошибок »
Справка по командам:
If /?
Exist /?
и т.д.
В помощь: Полезные ресурсы по скриптовым языкам администрирования (http://forum.oszone.net/thread-130222.html)Правильно ли я понимаю, что лучше для каждого вопроса создавать свою тему »
Правильно.
Поковырявшись в интернете, решил вывести входные данные в отдельный файл… »
Это — самый правильный подход. К сожалению, далеко не все понимают, что надо отделять мух от котлет данные от кода.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.