Мне удалось перевести большую часть этого сценария для работы в пакетном файле Windows 7. Я не проверял это против любой другой версии Windows.
Эта программа сканирует отправленную ей командную строку и устанавливает различные переменные окружения, которые соответствуют настройкам.
Он устанавливает переменную OPTION_arg для каждого аргумента в командной строке.
Если переключатель, env var установлен в 1. Если значение задается через знак двоеточия, оно устанавливается на это значение. Обратите внимание, что вокруг :
не может быть пробелов :[Модификация] Этот модифицированный скрипт также не может обрабатывать значения параметров или параметров, содержащие пробелы, даже если они заключены в скобки. [/ Модификация]
Используйте If defined OPTION_arg
или if /i "%OPTION_arg%"=="value"
чтобы проверить параметры
Он также устанавливает переменную параметра для каждого введенного параметра: PARAM_1
- PARAM_n
а PARAM_0
- это специальное значение, которое содержит количество PARAM. Полезно для просмотра всех из них. Например, for /l (1,1,%PARAM_0%) do ...
В вашем пакетном файле вызовите getopt как call GetOpt.bat %*
Я также рекомендую установить setlocal
и endlocal
в пакетном файле хоста, чтобы переменные option и param не задерживались после выхода из пакетных файлов хоста.
Example usage: HostBatchFile.bat /a /b:22 /longopt Parm1 Parm2
OPTION_a will equal 1.
OPTION_b will equal 22
OPTION_longopt will eqal 1.
PARAM_1 will equal Parm1
PARAM_2 will equal Parm2
PARAM_0 will be set to the number of parms, so 2 in this case
Части, которые я не перевел:
- Включение любого вида флага DEBUG для вывода на экран
- Возможность обрабатывать "строки с пробелами" для параметров или параметров, так как начальное разделение введенных аргументов разделяется с помощью
<SPACE>
Вот переведенный скрипт.
@echo off
cls
set getopt_ParmCounter=1
set paramc=1
set DEBUG=1
set argc=0
for %%x in (%*) do Set /A argc+=1
echo Number of arguments: %argc%
echo %*&echo.
set _myvar=%*
rem Loop through all command line arguments one at a time
:varloop
set isparam=1
for /f "tokens=1*" %%a in ('echo %_myvar%') DO (
set getopt_Parm=%%a
set _myvar=%%b
call :paramtype
rem shift along arguments and rerun loop
if NOT "%%b"=="" goto varloop
)
goto :eof
:paramtype
rem If first character starts with a - or / it must be an option
if /i "%getopt_Parm:~0,1%"=="-" call :option
if /i "%getopt_Parm:~0,1%"=="/" call :option
if /i "%isparam%"=="1" call :param
goto :eof
:option
set isparam=0
rem Set the Equal Index to the position of the colon. 0 means none was found
for /f %%j in ('findstring %getopt_Parm% :') do set getopt_EqIdx=%%j
rem If the index is GE 0 then we must have a colon in the option.
if /i "%getopt_EqIdx%"=="0" (call :nocolon) else (call :colon)
goto :eof
:colon
rem set the OPTION value to the stuff to the right of the colon
set /a getopt_ParmNameEnd=%getopt_EqIdx%-2
call set getopt_ParmName=%%getopt_Parm:~1,%getopt_ParmNameEnd%%%
call set getopt_ParmValue=%%getopt_Parm:~%getopt_EqIdx%%%
set OPTION_%getopt_ParmName%=%getopt_ParmValue%
goto :eof
:nocolon
rem This is a flag, so simply set the value to 1
set getopt_ParmName=%getopt_Parm:~1%
set getopt_ParmValue=1
set OPTION_%getopt_ParmName%=%getopt_ParmValue%
goto :eof
:param
rem There was no / or - found, therefore this must be a paramater, not an option
set PARAM_%getopt_ParmCounter%=%getopt_Parm%
set PARAM_0=%getopt_ParmCounter%
set /a getopt_ParmCounter+=1
goto :eof