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:
- Incorporando qualquer tipo de sinalizador DEBUG para saída de tela
- 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