95 votos

Archivos de proceso por lotes - número de argumentos de línea de comandos

Sólo la conversión de algunos de shell scripts en archivos por lotes y hay una cosa que me parece que no puede encontrar...y que es un simple recuento del número de argumentos de línea de comandos.

por ejemplo. si usted tiene:

myapp foo bar

En La Shell:

  • $# -> 2
  • $* -> foo bar
  • $0 -> myapp
  • $1 -> foo
  • $2 -> barra de

En lote

  • ?? -> 2 <---- lo que mando?!
  • %* -> foo bar
  • %0 -> myapp
  • %1 -> foo
  • %de 2 -> barra de

Así que me he miró a su alrededor, y estoy buscando en el lugar equivocado o yo estoy ciego, pero me parece que no puede encontrar una manera para obtener un recuento de número de argumentos de línea de comandos pasados.

Hay un comando similar a la de shell, "$ # " para archivos por lotes?

ps. lo más cercano que he encontrado es recorrer el %1s y el uso de 'cambio', pero necesito refernece %1,%2, etc más tarde en la secuencia de comandos por lo que no es bueno.

102voto

nimrodm Puntos 9191

Googleando un poco le da el siguiente resultado de wikilibros:

set argC=0
for %%x in (%*) do Set /A argC+=1

echo %argC%

Parece como cmd.exe ha evolucionado un poco desde la edad de DOS días :)

42voto

Dean Povey Puntos 4761

Que yo sepa no se puede fácilmente - ¿qué puedo decir, por lotes de archivos de chupar. Tienden a manejar el número de argumentos con este tipo de lógica:

IF "%1"=="" GOTO HAVE_0
IF "%2"=="" GOTO HAVE_1
IF "%3"=="" GOTO HAVE_2

etc.

Si usted tiene más de 9 argumentos, entonces estas jodido con este enfoque, aunque. Hay varios hacks para la creación de los contadores que se puede encontrar aquí, pero se advierte que estos no son para los débiles de corazón.

18voto

paxdiablo Puntos 341644

La función :getargc por debajo de puede ser lo que usted está buscando.

@echo off
setlocal enableextensions enabledelayedexpansion
call :getargc argc %*
echo Count is %argc%
echo Args are %*
endlocal
goto :eof

:getargc
    set getargc_v0=%1
    set /a "%getargc_v0% = 0"
:getargc_l0
    if not x%2x==xx (
        shift
        set /a "%getargc_v0% = %getargc_v0% + 1"
        goto :getargc_l0
    )
    set getargc_v0=
    goto :eof

Básicamente se repite una vez más de la lista (que es local a la función, con lo que los cambios no afectarán a la lista de nuevo en el programa principal), contando con ellos hasta que se acabe.

También utiliza un ingenioso truco, pasando el nombre de la variable de retorno a la función.

El programa principal sólo ilustra cómo la llamamos y hace eco de los argumentos a posteriori para garantizar que se mantiene intacta:

C:\Here> xx.cmd 1 2 3 4 5
    Count is 5
    Args are 1 2 3 4 5
C:\Here> xx.cmd 1 2 3 4 5 6 7 8 9 10 11
    Count is 11
    Args are 1 2 3 4 5 6 7 8 9 10 11
C:\Here> xx.cmd 1
    Count is 1
    Args are 1
C:\Here> xx.cmd
    Count is 0
    Args are
C:\Here> xx.cmd 1 2 "3 4 5"
    Count is 3
    Args are 1 2 "3 4 5"

7voto

David Puntos 29

Intente esto:

SET /A ARGS_COUNT=0    
FOR %%A in (%*) DO SET /A ARGS_COUNT+=1    
ECHO %ARGS_COUNT%

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X