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

Показать сообщение отдельно

Ветеран


Contributor


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

Профиль | Отправить 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