Имя пользователя:
Пароль:
 | Правила  

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

Ответить
Настройки темы
CMD/BAT - [решено] Как организовать вызов bat с большим количеством переменных и их обработку?

Аватара для seriych

Старожил


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


Конфигурация

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


Изменения
Автор: seriych
Дата: 03-07-2010
Как организовать вызов bat с большим количеством переменных и их обработку?
Есть батник, который устанавливает несколько программ (больше 10). Установка каждой программы идет отдельным участком кода. Хочется, чтобы его можно было вызывать с параметрами в виде списка программ, которые нужно установить (в списке переменных может быть количество устанавливаемых программ, если это облегчит дело).

Что-то вроде этого:
::разбор переменных
if (среди переменных есть программа1) (устанвливать1=true)
if (среди переменных есть программа2) (устанвливать2=true)
...
::установка
if (устанвливать1=true) (код установки первой программы)
...

Читал про команду shift, но то, что у меня придумывается, получается очень громоздким, да еще и для каждой программы разбор дублируется...
После написания предыдущего предложения, возникла мысль, которая оказалась рабочей:
Код: Выделить весь код
:startinstall
shift
if "%0"=="" (goto finishinstall) else (goto %0)

:program1
::устанавливаем программу program1
goto startinstall

:program2
::устанавливаем программу program2
goto startinstall

:: И так далее для остальных программ

:finishinstall
Работает, но:
· Хочется, чтобы при вызове без параметров устанавливались все программы, а лучше даже не все, а определенный набор.
· Хочется, чтобы программы устанавливались в том порядке, в котором они прописаны в батнике.
· Как сделать, чтобы все работало, если один или несколько параметров не имеют метки в батнике (неверные параметры вызова)
Эти требования опять приводят к схеме, которую я привел выше. Можно ли это осуществить, не перегружая батник большим количеством кода?

-------
* Книгой можно не только стаканчик с лапшой накрывать. ©


Отправлено: 18:36, 03-07-2010

 

Пользователь


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

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


seriych,

примерно так (но с редакцией под себя):

Код: Выделить весь код
Echo on&Chcp 866&Title S E T U P &cls

if "%~1"=="" (set /p LingID= Введите LingID: ) else (set LingID=%~1)

for /f "tokens=1,2* delims=$" %%a in ('^<"%~dpf0" Findstr /i "%LingID%"') do ^
if Exist "%~dp0%%a" ((start /b /wait "%~dp0%%a" %%b
%%c)) else Echo Error install %%a-application >> "%~dp0Errlog"
pause&goto :eof

:install

program-001$ /a /b /c$command1&command2&command3
program-002$ /a /b /c$command1&command2&command3&command4
program-003$ /a /b /c$command1&command2
program-004$ /a /b /c$command1&command2&command3&command4
program-005$ /a /b /c$command1
program-006$ /a /b /c$command1&command2&command3
program-007$ /a /b /c$command1&command2&command3&command4
program-008$ /a /b /c$command1&command2
program-009$ /a /b /c$command1
Пояснения:
Инсталяторы находяться в той dir-ии, что *.bat или же меняй пути
все setup'ы запускаются по очереди (или исключи /wait )
program-XXX - имя программы (например install_flash_player.exe)
LingID - идентификатор инсталятора, придумай сам (это должна быть часть имени проги).
/a /b /c - ключи запуска
Ошибки пишутся в файл "Errlog"

Запуск из CMD или WinRun, пример:

Код: Выделить весь код
"Disk:\dir1\dir2\@setup.bat" "LingID  LingID  LingID"

Последний раз редактировалось deepred, 04-07-2010 в 01:01. Причина: уточнение...

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

Отправлено: 21:08, 03-07-2010 | #2



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

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


Аватара для seriych

Старожил


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

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


deepred,
ээээ... Я несколько озадачен
А вот это start /b /wait "%~dp0%%a" подразумевает, что у меня запускается установщик приложения? Тогда мне это не подходит, потому что для каждой программы у меня помимо запуска инсталлятора еще и различные действия совершаются (где-то ярлыки переименовать, где-то настройки скопировать).
P.S. Делать отдельный батник для каждой программы не предлагать, тем более что они и так есть. Хочется как раз убрать эти батники.

-------
* Книгой можно не только стаканчик с лапшой накрывать. ©


Отправлено: 21:23, 03-07-2010 | #3


Пользователь


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

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


seriych,

Включаем фантазию!!!!!!!!!!!!!!!!

"/a /b /c", а что тебе мешает включить сценарий в эту подстроку?

допустим: setup_programm_name.exe$ /silient$copy xxx\settings.ini yyy\yyy\ & ren xxx\name1.lnk name2.lnk

и получится
start /b /wait xxx\setup_programm_name.exe /silient
copy xxx\settings.ini yyy\yyy\ & ren xxx\name1.lnk name2.lnk

Последний раз редактировалось deepred, 04-07-2010 в 01:04.


Отправлено: 21:35, 03-07-2010 | #4


Аватара для seriych

Старожил


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

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


deepred,
Вот фантазии-то и не хватает, видимо

Для каждой программы этот дополнительный код сильно различается. Или я чего-то не понимаю в твоем коде...

-------
* Книгой можно не только стаканчик с лапшой накрывать. ©


Отправлено: 21:49, 03-07-2010 | #5


Аватара для gora

Ушёл из жизни


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

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


Так подойдет?
Код: Выделить весь код
@echo off
Set list=%*
:: Список вариантов, которые могут быть обработаны в скрипте
Set Exilist=1 2 3 4 7 9 11 12 15 18 21 25
:: Список вариантов, которые будут обработаны в скрипте при его запуске без параметров
If "%list%"=="" Set list=1 2 4 7 9 11 21

For %%a In (%list%) Do For %%i In (%Exilist%) Do If %%a==%%i Call :M%%a
Exit

:M1
:: Здесь команды для варианта 1
...
GoTo :EOF

:M2
:: Здесь команды для варианта 2
...
GoTo :EOF

:M3
...
GoTo :EOF

:M4
...
GoTo :EOF

:M7
...
GoTo :EOF

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

Отправлено: 22:43, 03-07-2010 | #6


Аватара для seriych

Старожил


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

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


Ладно, спасибо. С утра может мозг лучше будет соображать.

-------
* Книгой можно не только стаканчик с лапшой накрывать. ©


Отправлено: 01:18, 04-07-2010 | #7


Googler


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

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


до кучи
Код: Выделить весь код
@echo off

for %%i in (%*) do set $:M_%%i=:M_%%i
1>nul 2>&1 set $:||for /f %%i in ('findstr /bi ":M_" "%0"') do set $%%i=%%i
for /f "tokens=1* delims==" %%i in ('set $:') do call %%j %%j
exit /b

:M_01
 Echo Here code for %1 module.
GoTo :EOF

:M_10
 Echo Here code for %1 module.
GoTo :EOF

:M_99
 Echo Here code for %1 module.
GoTo :EOF
пример вызова:
Код: Выделить весь код
start.cmd 99 01
Это сообщение посчитали полезным следующие участники:

Отправлено: 03:40, 04-07-2010 | #8


Аватара для seriych

Старожил


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

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


Всем спасибо.

Скрипт deepred я так и не понял

Вариант gora самый простой для понимания. Правда ставит в порядке, в котором идут аргументы, а не в заранее определенном, но это не принципиально, да и с другой стороны так даже правильнее (более гибко получается).

Вариант amel27 пока не смотрел, ибо предыдущий устроил. Плюсик за содействие.

-------
* Книгой можно не только стаканчик с лапшой накрывать. ©


Отправлено: 20:45, 04-07-2010 | #9


Аватара для gora

Ушёл из жизни


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

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


Цитата seriych:
Правда ставит в порядке, в котором идут аргументы, а не в заранее определенном »
Для этого достаточно поменять переменные в строке местами:
Код: Выделить весь код
For %%a In (%Exilist%) Do For %%i In (%list%) Do If %%a==%%i echo Call :M%%a
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:02, 04-07-2010 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Как осуществить циклическую обработку параметров %1,%2... в bat-файле leonaft Скриптовые языки администрирования Windows 7 14-04-2010 14:03
[решено] Есть папка с большим количеством jpeg файлов, надо сохранить файлы как .bmp evg64 AutoIt 9 02-10-2009 09:46
Как сделать обработку $_GET и сборку html-документа екзешником, как multitran.ru? borg92 Вебмастеру 1 13-08-2009 10:23
CMD/BAT - [решено] Как исключить обработку одного exe-файла из пакетной обработки нескольких файлов? Nun-Nun Скриптовые языки администрирования Windows 2 14-05-2009 12:16
как удалить папку с количеством файлов ,превыщающих 10 млн illusionmgs Хочу все знать 15 28-04-2009 19:53




 
Переход