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

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

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

Аватара для volk1234

Старовер


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


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

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


Изменения
Автор: volk1234
Дата: 10-12-2009
Привет гуру (или гурам?)! В общем привет!
Сделал я такой скриптик - http://forum.oszone.net/thread-141480.html
Даже GUI ваяем. Встал вопрос о ключах для командной строки.
У меня они организованны убого - по одному ключу (ну еще + 1 опцию) за раз обрабатывается.
Вот код:
читать дальше »

Код: Выделить весь код
Set Key1=%1
Set Key2=%2

.....

:CORE1
If "%Key1%" == "-full" Goto :full
If "%Key1%" == "-nomore" Goto :nomore
If "%Key1%" == "-kb" Goto :kbinstall
If "%Key1%" == "-p" Goto :pusb
If "%Key1%" == "-pd" Goto :pdisk
If "%Key1%" == "-pall" Goto :pall
If "%Key1%" == "-ms" Goto :ms
If "%Key1%" == "-unlockall" Goto :unlockall
If "%Key1%" == "-do" Goto :CORE_do
If "%Key1%" == "-l" Goto :CORE_l
If "%Key1%" == "-un" Goto :CORE_u

If "%Key1%" == "-help" Goto :Syntax

Goto :Syntax_Error

:CORE_do
If "%Key2%" == "" Goto :Syntax_Error
If "%Key2%" == "reg1" Goto :reg1
If "%Key2%" == "reg2" Goto :reg2
If "%Key2%" == "srvoff" Goto :srvoff
If "%Key2%" == "srvon" Goto :srvon
If "%Key2%" == "mountp" Goto :mountp

Goto :Syntax_Error

:CORE_l
Call :subinacl_DETECT

If "%Key2%" == "" Goto :Syntax_Error
If "%Key2%" == "reg1" Goto :lockreg1
If "%Key2%" == "reg2" Goto :lockreg2
If "%Key2%" == "usbadd" Goto :lockusbadd
If "%Key2%" == "usbuse" Goto :lockusbuse
If "%Key2%" == "usbwrite" Goto :lockusbwrite
If "%Key2%" == "mountp" Goto :lockmountp

Goto :Syntax_Error

:CORE_u
Call :subinacl_DETECT

If "%Key2%" == "" Goto :Syntax_Error
If "%Key2%" == "reg1" Goto :unreg1
If "%Key2%" == "reg2" Goto :unreg2
If "%Key2%" == "usbadd" Goto :unusbadd
If "%Key2%" == "usbuse" Goto :unusbuse
If "%Key2%" == "usbwrite" Goto :unusbwrite
If "%Key2%" == "mountp" Goto :unmountp

Goto :Syntax_Error

.....

:reg1
If Not "%Key3%"=="" Set NDTAR=%Key3%
....


То есть, чтобы выполнить 2 команды надо 2 раза запустить скрипт
Код: Выделить весь код
nmar -do reg1
nmar -do reg2
А конечно охота сразу все указывать
Код: Выделить весь код
nmar -do reg1 reg2 montp
Я сделал как мог, дабы не усложнять скрипт и себе жизнь. Но может кто подскажет чего ?

-------

Ю-ху!


Отправлено: 00:34, 10-12-2009

 

Ветеран


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

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


Как раз так будет заметное усложнение логики. Наиболее просто реализуется вариант с парами ключ/значение:
читать дальше »
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

:Next
Set Key1=%~1
Set Key2=%~2

echo.Key1:[%Key1%] Key2:[%Key2%]

if defined Key1 (
	if defined Key2 (
		if [%Key1%] equ [-do] call :SomeProcDO "%Key2%"
		if [%Key1%] equ [-kb] call :SomeProcKB "%Key2%"
		
		shift
		shift
		goto :Next
	)
)

endlocal
exit /b 0

:SomeProcDO
	echo SomeProcDO: %~1
	exit /b /0

:SomeProcKB
	echo SomeProcKB: %~1
	exit /b /0
Пример вызова:
читать дальше »
Код: Выделить весь код
0005.cmd -do 1111 -do 2222 -kb 3333
Цитата:
Код: Выделить весь код
Key1:[-do] Key2:[1111]
SomeProcDO: 1111
Key1:[-do] Key2:[2222]
SomeProcDO: 2222
Key1:[-kb] Key2:[3333]
SomeProcKB: 3333
Key1:[] Key2:[]

Ключи могут повторяться, перемежаться; главное — чтобы не нарушалось правило «на каждый ключ одно значение».

Другой вариант — ещё один ключ, например «-list», задающий имя текстового файла, содержащего те же самые пары «ключ/значение», например, в виде:
читать дальше »
Some List.txt
Код: Выделить весь код
; Some comment 1
do=4444
kb=5555
; Some comment 2
do=6666

При нахождении данного ключа в командной строке пакетного файла вызывается процедура его разбора посредством «for /f» и далее делается либо то же самое сравнение, что в предыдущем примере, либо пакетный файл вызывает самого себя, передавая аргументами пару «ключ/значение», заданные в очередной строке текстового файла, наподобие:
читать дальше »
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

:Next
Set Key1=%~1
Set Key2=%~2

echo.Key1:[%Key1%] Key2:[%Key2%]

if defined Key1 (
	if defined Key2 (
		if [%Key1%] equ [-list] call :ParseList "%Key2%"
		
		if [%Key1%] equ [-do] call :SomeProcDO "%Key2%"
		if [%Key1%] equ [-kb] call :SomeProcKB "%Key2%"
		
		shift
		shift
		goto :Next
	)
)

endlocal
exit /b 0

:SomeProcDO
	echo SomeProcDO: %~1
	exit /b /0

:SomeProcKB
	echo SomeProcKB: %~1
	exit /b /0

:ParseList
	setlocal enableextensions enabledelayedexpansion
	
	if exist "%~1" (
		for /f "usebackq tokens=1,2 eol=; delims==" %%i in ("%~1") do call "%~dpnx0" -%%i "%%j"
	) else (
		echo File list [%~1] not found.
	)
	endlocal
	exit /b /0
Пример вызова:
читать дальше »
Код: Выделить весь код
0006.cmd -list "C:\Песочница\41\Some List.txt"
Цитата:
Код: Выделить весь код
Key1:[-list] Key2:[C:\Песочница\41\Some List.txt]
Key1:[-do] Key2:[4444]
SomeProcDO: 4444
Key1:[] Key2:[]
Key1:[-kb] Key2:[5555]
SomeProcKB: 5555
Key1:[] Key2:[]
Key1:[-do] Key2:[6666]
SomeProcDO: 6666
Key1:[] Key2:[]
Key1:[] Key2:[]
Усложнённый пример вызова, с перемежением обычных ключей и ключа «-list»:
читать дальше »
Код: Выделить весь код
0006.cmd -do 1111 -do 2222 -list "C:\Песочница\41\Some List.txt" -kb 3333
Цитата:
Код: Выделить весь код
Key1:[-do] Key2:[1111]
SomeProcDO: 1111
Key1:[-do] Key2:[2222]
SomeProcDO: 2222
Key1:[-list] Key2:[C:\Песочница\41\Some List.txt]
Key1:[-do] Key2:[4444]
SomeProcDO: 4444
Key1:[] Key2:[]
Key1:[-kb] Key2:[5555]
SomeProcKB: 5555
Key1:[] Key2:[]
Key1:[-do] Key2:[6666]
SomeProcDO: 6666
Key1:[] Key2:[]
Key1:[-kb] Key2:[3333]
SomeProcKB: 3333
Key1:[] Key2:[]
Это сообщение посчитали полезным следующие участники:

Отправлено: 04:19, 10-12-2009 | #2



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

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


Аватара для volk1234

Старовер


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

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


В принципе даже вариант
Код: Выделить весь код
nmar -do reg1 -do reg2 -do mountp
устроит

-------

Ю-ху!


Отправлено: 04:26, 10-12-2009 | #3


Googler


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

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


volk1234, не вижу смысла в разборе параметров, которые используются для именования процедур:
Код: Выделить весь код
nmar do_reg1 do_reg2 do_mountp
Код: Выделить весь код
For %%i In (%*) Do Call :%%i
Цитата volk1234:
чтобы выполнить 2 команды надо 2 раза запустить скрипт »
напиши батник...

Отправлено: 06:01, 10-12-2009 | #4


Аватара для volk1234

Старовер


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

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


amel27

Эмм.. не понял

-------

Ю-ху!


Отправлено: 15:45, 10-12-2009 | #5


Googler


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

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


volk1234, один параметр - одна процедура. FOR перебирает все и вызывает их по очереди

-------
Как сообщить о том, что моя проблема решена?
не оказываю техподдержку через ПМ/ICQ/Mail - для этого есть форум


Отправлено: 16:07, 10-12-2009 | #6


Аватара для volk1234

Старовер


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

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


Тоесть можно сделать переключатель первый -do(-l -un) как я и сделал, а потом можно сделать перебор циклом ?

Код: Выделить весь код
-do reg1 reg2 mountp

-------

Ю-ху!


Отправлено: 21:36, 10-12-2009 | #7


Аватара для Drongo

Будем жить, Маэстро...


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

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


Цитата volk1234:
Тоесть можно сделать переключатель первый »
Нет, вместо ключа -do [опция]. Написать один ключ, который будет что-то выполнять.
Вместо
Код: Выделить весь код
-do reg1
-do reg2
написать так
Код: Выделить весь код
doreg1
doreg2
и выполнять нужный в зависимости от выбора, ведь опция -do пустая, сама по себе не делает никаких действий?

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 23:45, 10-12-2009 | #8


Аватара для volk1234

Старовер


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

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


Как то непривычно, старался сделать как в других программках.
Вспомнил - просто не знал как реализовать в принципе обработку ключей - поэтому решил ограничится 2 уровнями -
на первом ключи одноуровневые - где переход осуществляется сразу,
-ms, -full,-unlockall.
А также ключи
-do -l -un
при обработки которых переход осуществлялся во вторую функцию(метку) где и обрабатывался второй ключ.

Пока не совсем предщставляю как реализовать например обработку

doreg1 255

-------

Ю-ху!


Отправлено: 10:54, 11-12-2009 | #9


Googler


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

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


Цитата volk1234:
не совсем предщставляю как реализовать например обработку »
например, так:
Код: Выделить весь код
@Echo Off

Set $I=0& For %%i In (%*) Do Set $P=%%i& Call :CMD_PARSE
For /F "Tokens=1* Delims==" %%i In ('Set $_') Do Call :%%j

Exit /B

:DOREG1
  Echo DOREG1 %*
GoTo :EOF

:DOREG2
  Echo DOREG2 %*
GoTo :EOF

:CMD_PARSE
  If /I "%$P:~0,2%"=="do" Set /A $I=%$I%+1
  Call Set $_%$I%=%%$_%$I%%%%$P% 
GoTo :EOF
Код: Выделить весь код
test.cmd doreg1 255 doreg2 128 256
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:36, 11-12-2009 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Помогите запустить CMD-файл из CMD-файла с параметрами Oleg48 Скриптовые языки администрирования Windows 2 18-11-2009 11:08
CMD/BAT - [решено] вывод текстового файла на экран cmd idsp Скриптовые языки администрирования Windows 6 06-04-2009 07:18
[решено] Службы - Изменение типа запуска через CMD vagner_HATE Microsoft Windows NT/2000/2003 2 03-09-2008 06:31
Помогите пожалуйста не срабатывает команда из*cmd файла запускаемого из RanOnceEx.cmd vovchiku Автоматическая установка Windows 2000/XP/2003 6 25-09-2007 23:38
Обработка лог-файла на C++ Guest Программирование и базы данных 17 23-03-2004 01:11




 
Переход