6

Я нашел очень полезный скрипт здесь , который будет анализировать в качестве аргументов в пакетный файл и обработать их следующим образом :

BatchFile.btm /a /b:22 /longopt Parm1 Parm2 /quotedArg:"long quoted arg"
   - OPTION_a will equal 1.
   - OPTION_b will equal 22
   - OPTION_quotedArg will equal "long quoted arg"
   - 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

Однако этот сценарий написан для файлов .btm и, по-видимому, не подходит для эмулятора DOS или более поздних версий Windows. Может кто-нибудь перевести это или знает, где найти современный эквивалент, который будет работать в эмуляторе DOS в Win7/Svr2003?

2 ответа2

6

Мне удалось перевести большую часть этого сценария для работы в пакетном файле 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

Части, которые я не перевел:

  1. Включение любого вида флага DEBUG для вывода на экран
  2. Возможность обрабатывать "строки с пробелами" для параметров или параметров, так как начальное разделение введенных аргументов разделяется с помощью <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
1

%* для каждого параметра. Вы также можете найти их полезными:

%0 - команда, используемая для вызова командного файла (может быть foo , ..\foo , c:\bats\foo и т.д.)
%1 - первый параметр командной строки,
%2 - второй параметр командной строки,
и так далее до %9SHIFT можно использовать для тех, кто после 9-го).

%~nx0 - фактическое имя пакетного файла независимо от вызывающего метода (some-batch.bat)
%~dp0 - диск и путь к скрипту (d:\scripts)
%~dpnx0 - это полное имя пути скрипта (d:\scripts\some-batch.bat)

Дополнительные примеры информации на http://www.ss64.com/nt/syntax-args.html и http://www.robvanderwoude.com/parameters.html

Источник: https://stackoverflow.com/questions/357315/get-list-of-passed-arguments-in-windows-batch-script-bat

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .