Simplemente convirtiendo algunos scripts de shell en archivos por lotes y hay una cosa que parece que no puedo encontrar ... y es un simple recuento del número de argumentos de la línea de comandos.
p.ej. si usted tiene:
myapp foo bar
En Shell:
- $ # -> 2
- $ * -> barra de foo
- $ 0 -> myapp
- $ 1 -> foo
- $ 2 -> barra
En lote
- ?? -> 2 <---- ¡¿Qué comando ?!
- % * -> barra de foo
- % 0 -> myapp
- % 1 -> foo
- % 2 -> barra
Así que miré a mi alrededor, y o estoy mirando en el lugar equivocado o estoy ciego, pero parece que no puedo encontrar una manera de obtener un recuento de la cantidad de argumentos de línea de comando pasados.
¿Existe un comando similar al "$ #" de shell para archivos por lotes?
PD. lo más cercano que he encontrado es iterar a través de% 1s y usar 'shift', pero necesito referir% 1,% 2, etc. más adelante en el script, así que eso no es bueno.
shell
batch-file
scripting
Pyko
fuente
fuente
2 myapp foo bar
?Respuestas:
Buscar un poco en Google te da el siguiente resultado de wikilibros :
Parece que cmd.exe ha evolucionado un poco desde los viejos tiempos de DOS :)
fuente
for
solo funciona para argumentos que parecen nombres de archivos, no cadenas de opciones como-?
. El uso de comillas (for %%i in ("%*") ...
) funciona para argumentos similares,-?
pero nuevamente falla para los argumentos entre comillas debido a las comillas anidadas. La única forma sólida parece involucrarshift
...MyBatchFile "*.*" "Abc"
informa que argC == 9. - Downvoted.Suele manejar varios argumentos con este tipo de lógica:
etc.
Sin embargo, si tiene más de 9 argumentos, entonces está jodido con este enfoque. Hay varios trucos para crear contadores que puede encontrar aquí , pero tenga en cuenta que no son para los pusilánimes.
fuente
shift
para contar más de 9 ... y sin tener 10 líneas de código de igual apariencia.La función a
:getargc
continuación puede ser lo que está buscando.Básicamente, itera una vez sobre la lista (que es local a la función, por lo que los cambios no afectarán la lista en el programa principal), contándolos hasta que se agote.
También utiliza un truco ingenioso, pasando el nombre de la variable de retorno que debe establecer la función.
El programa principal simplemente ilustra cómo llamarlo y luego hace eco de los argumentos para asegurarse de que no se modifiquen:
fuente
echo Count is %argc%
insertaría su propio código que podría verificar si ese recuento es correcto y luego continuar.Prueba esto:
fuente
Si el número de argumentos debe ser un número exacto (menor o igual a 9), entonces esta es una forma sencilla de verificarlo:
fuente
Evita usar uno
shift
o unfor
ciclo a costa del tamaño y la legibilidad.Salida:
EDITAR: El "truco" utilizado aquí implica:
Construir una cadena que represente una variable de argumento de línea de comandos evaluada actualmente (es decir, "% 1", "% 2", etc.) utilizando una cadena que contenga un carácter de porcentaje (
%%
) y una variable de contadorarg_idx
en cada iteración del ciclo.Almacenar esa cadena en una variable
curr_arg_label
.Pasando tanto esa cadena (
!curr_arg_label!
) como el nombre de una variable de retorno (curr_arg_value
) a un subprograma primitivoget_value
.En el subprograma, el valor de su primer argumento (
%1
) se usa en el lado izquierdo de la asignación (set
) y el valor de su segundo argumento (%2
) a la derecha. Sin embargo, cuando se pasa el argumento del segundo subprograma, el intérprete de comandos lo resuelve en el valor del argumento de la línea de comandos del programa principal. Es decir, lo que se pasa no es, por ejemplo, "% 4" sino cualquier valor que tenga la cuarta variable de argumento de la línea de comandos ("otro_arg" en el uso de muestra).Luego, la variable dada al subprograma como variable de retorno (
curr_arg_value
) se prueba para no estar definida, lo que sucedería si el argumento de línea de comando evaluado actualmente no está presente. Inicialmente, esto era una comparación del valor de la variable de retorno envuelto entre corchetes con corchetes vacíos (que es la única forma que conozco de probar los argumentos del programa o subprograma que pueden contener comillas y fue un sobrante pasado por alto de la fase de prueba y error) pero desde entonces se ha arreglado como es ahora.fuente
La última respuesta fue hace dos años, pero necesitaba una versión para más de nueve argumentos de línea de comando. Puede ser que otro también lo haga ...
La solución son las primeras 19 líneas y convierte todos los argumentos a variables en un estilo similar a c. Todas las demás cosas simplemente sondean el resultado y muestran la conversión a argumentos locales. Puede hacer referencia a argumentos por índice en cualquier función.
fuente
Una solución sólida es delegar el conteo a una subrutina invocada con
call
; la subrutina usagoto
declaraciones para emular un bucle en el queshift
se usa para consumir los argumentos (solo de subrutina) de manera iterativa:fuente