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

Аватара пользователя
volk1234

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

Сообщение volk1234 »

Привет гуру (или гурам?)! В общем привет!

Сделал я такой скриптик -
Утилиты - NoMoreAutorun - утилита для отключения автозапуска.


Даже 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

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

Re: CMD/BAT - [решено] Обработка ключей запуска CMD- файла

Сообщение Iska »

Как раз так будет заметное усложнение логики. Наиболее просто реализуется вариант с парами ключ/значение:


читать дальше »




Код:

Код: Выделить всё

@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:[]
Аватара пользователя
volk1234

Re: CMD/BAT - [решено] Обработка ключей запуска CMD- файла

Сообщение volk1234 »

В принципе даже вариант



Код:

Код: Выделить всё

nmar -do reg1 -do reg2 -do mountp

устроит
Аватара пользователя
amel27

Re: CMD/BAT - [решено] Обработка ключей запуска CMD- файла

Сообщение amel27 »

volk1234, не вижу смысла в разборе параметров, которые используются для именования процедур:



Код:

Код: Выделить всё

nmar do_reg1 do_reg2 do_mountp



Код:

Код: Выделить всё

For %%i In (%*) Do Call :%%i


Цитата volk1234:



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




напиши батник... Изображение
Аватара пользователя
amel27

Re: CMD/BAT - [решено] Обработка ключей запуска CMD- файла

Сообщение amel27 »

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

Re: CMD/BAT - [решено] Обработка ключей запуска CMD- файла

Сообщение volk1234 »

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





Код:

Код: Выделить всё

-do reg1 reg2 mountp
Аватара пользователя
Drongo

Re: CMD/BAT - [решено] Обработка ключей запуска CMD- файла

Сообщение Drongo »

Цитата volk1234:



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




Нет, вместо ключа -do [опция]. Написать один ключ, который будет что-то выполнять.

Вместо



Код:

Код: Выделить всё

-do reg1
-do reg2

написать так



Код:

Код: Выделить всё

doreg1
doreg2

и выполнять нужный в зависимости от выбора, ведь опция -do пустая, сама по себе не делает никаких действий?
Аватара пользователя
volk1234

Re: CMD/BAT - [решено] Обработка ключей запуска CMD- файла

Сообщение volk1234 »

Как то непривычно, старался сделать как в других программках.

Вспомнил - просто не знал как реализовать в принципе обработку ключей - поэтому решил ограничится 2 уровнями -

на первом ключи одноуровневые - где переход осуществляется сразу,

-ms, -full,-unlockall.

А также ключи

-do -l -un

при обработки которых переход осуществлялся во вторую функцию(метку) где и обрабатывался второй ключ.



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



doreg1 255
Аватара пользователя
amel27

Re: CMD/BAT - [решено] Обработка ключей запуска CMD- файла

Сообщение amel27 »

Цитата volk1234:



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




например, так:



Код:

Код: Выделить всё

@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
Ответить

Вернуться в «Скриптовые языки администрирования Windows»