Existe uma maneira de analisar argumentos em um script em lote

6

Encontrei um script muito útil aqui que analisará os argumentos em um arquivo de lote e os processará da seguinte maneira:

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

No entanto, esse script é escrito para arquivos .btm e não parece ser adequado para o emulador de DOS ou versões mais recentes do Windows. Alguém pode traduzir isso ou saber onde encontrar um equivalente up-to-date que funcionará no emulador do DOS no Win7 / Svr2003?

    
por Ghandi Manning 27.08.2013 / 10:15

2 respostas

5

Eu consegui traduzir a maioria deste script para trabalhar em um arquivo de lote do Windows 7. Eu não testei isso em nenhuma outra versão do Windows.

Este programa verifica a linha de comando enviada para ele e define vários variáveis de ambiente que respondem às configurações.

Define uma variável OPTION_arg para cada arg na linha de comando. Se um switch, o env var é definido como 1. Se um valor é dado através do sinal de dois pontos, está definido para esse valor. Observe que não pode haver nenhum espaço em branco ao redor do : [Modificação] Este script modificado também não pode manipular valores de opções ou parâmetros contendo espaços, mesmo quando encapsulados entre parênteses. [/ Modificação]

Use If defined OPTION_arg ou if /i "%OPTION_arg%"=="value" para testar as opções

Ele também define uma variável de parâmetro para cada parâmetro inserido: PARAM_1 to PARAM_n e PARAM_0 é um valor especial que contém o número de PARAMs. Útil para loop através de todos eles. Por exemplo for /l (1,1,%PARAM_0%) do ...

Em seu arquivo de lote, chame getopt como call GetOpt.bat %*

Também recomendo definir setlocal e endlocal no arquivo de lote do host para que as variáveis de opção e param não permanecem depois que os arquivos de lote do host saem.

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

As partes que eu não traduzi são:

  1. Incorporando qualquer tipo de sinalizador DEBUG para saída de tela
  2. Ser capaz de manipular "strings com espaços" para opções ou parâmetros, já que a separação inicial de argumentos alimentados é dividida usando <SPACE>

Aqui está o script traduzido.

@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
    
por 28.08.2013 / 16:58
1

%* para cada parâmetro. Você também pode achar isso útil:

%0 - o comando usado para chamar o arquivo em lote (pode ser foo , ..\foo , c:\bats\foo , etc.)
%1 é o primeiro parâmetro da linha de comando,% s%2 é o segundo parâmetro de linha de comando,
e assim por diante até %9 (e SHIFT pode ser usado para aqueles após o 9º).

%~nx0 - o nome real do arquivo de lote, independentemente do método de chamada (some-batch.bat)
%~dp0 - unidade e caminho para o script (d: \ scripts)
%~dpnx0 - é o nome completo do caminho do script (d: \ scripts \ some-batch.bat)

Mais exemplos de informações no link e link

Fonte: link

    
por 27.08.2013 / 10:36