[BATCH] Duda Shift, Y ¿Como saber cuantos argumentos necesito? [Solucionado]

Iniciado por SuperDraco, 8 Julio 2011, 10:21 AM

0 Miembros y 1 Visitante están viendo este tema.

SuperDraco

Hola, ¿se os ocurre alguna forma de como saber el número de archivos que se arrastran hacia un .bat?

Por ejemplo, si arrastro un archivo a un .bat, este será el argumento "%1"

Pero y si arrastro 20 archivos por ejemplo? como puedo hacerle saber a mi bat que son 20 los argumentos que necesita manejar?

Para cada archivo que arrastre, necesito crear una variable con el nombre del archivo, por ese motivo necesito saber cuantos archivos se han arrastrado, puede que no me esté explicando bien, así que aqui dejo un ejemplo que llevo hecho:

Código (dos) [Seleccionar]
Set Archivo1="%1"
Set Archivo2="%2"
Set Archivo3="%3"
Set Archivo4="%4"
Set Archivo5="%5"
Set Archivo6="%6"
Set Archivo7="%7"
Set Archivo8="%8"
Set Archivo9="%9"

shift /2
shift /2
shift /2
shift /2
shift /2
shift /2
shift /2
shift /2

Set Archivo10="%2"
Set Archivo11="%3"
Set Archivo12="%4"
Set Archivo13="%5"
Set Archivo14="%6"
Set Archivo15="%7"

etc...
pause >nul



Pero claro, sin conocer cuantos archivos se han arrastrado al .bat... pues el uso del SHIFT podría ser infinito...  :xD

Por cierto tengo otra pregunta, en el code de arriba, se puede simplificar lo que he echo con SHIFT?

Lo que hago en el código es borrar los 8 argumentos, pero se puede hacer en un solo código en vez de usar 8 líneas? es que si uso "Shift /8" creo que no hace lo mismo, no me funciona como quiero xD


Un saludo!
No he vuelto, solo estoy de paso.

leogtz

Mmmm, has probado ir borrando argumentos consecutivamente (con un for), claro que antes deberías guardar los elementos que no tengan una longitud de cero, almacenalos en un array.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

SuperDraco

Necesitaria un script "boceto" para ver como se haría eso xDDD

Lo de los argumentos que tengan longitud 0 ok.

Pero como haría el for sobre los argumentos?
No he vuelto, solo estoy de paso.

leogtz

Mira, no he utilizado for, pero el siguiente código te ayuda a saber cuántos argumentos se le envían al script.

Código (dos) [Seleccionar]
C:\Users\leo>code
Posible numero de argumentos : 0

C:\Users\leo>code bla
Posible numero de argumentos : 1

C:\Users\leo>code hola mundo cruel batch
Posible numero de argumentos : 4

C:\Users\leo>code a b c d e f g h j h h h h h h h h h  e er r r  df d df f f d d
f f d  f
Posible numero de argumentos : 32

C:\Users\leo>



Código (dos) [Seleccionar]
@echo off
% Contador de argumentos %
% argc %
set contador=0
:loop
if "%1"=="" (
call:next %contador%
exit /b 0
)
shift /1
if %contador% equ 100 (goto:next) else (set /a contador+=1 & goto:loop)

:next
echo Posible numero de argumentos : %1
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

SuperDraco

justo lo que necesitaba!!!

muchas gracias!!, lo pruebo en cuanto pueda y comento si me surge alguna duda
No he vuelto, solo estoy de paso.

leogtz

#5
Okay, oye, una pregunta, vi que estabas tratando algo sobre enviar emails con batch, pudiste hacerlo?

Mientras dejo otra solución:

Código (dos) [Seleccionar]
@echo off
set contador=0
:loop
set arg=%1
if not defined arg (
call:next %contador%
exit /b 0
) else (
shift /1
set /a contador+=1
goto:loop
)

:next
echo Argc = %1
goto:eof
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

SuperDraco

si, lo han movido a scripting   :P

http://foro.elhacker.net/scripting/zetauploadscript_by_pitoloko_manda_emails_con_un_click_sin_restricciones-t332881.0.html

Pero me gustaría mejorar el manejo de argumentos en el script porque sino me va a quedar un engorro dañiño para la vista  :xD y solo permite hasta 20 archivos al mismo tiempo, o 20 directorios.

Pero bueno solo es un script, el verdadero trabajo es de los que han hecho ese uploader.

Pero tu que sabes tanto de scripting, imaginate las cosas que puedes hacer ,por ejemplo le puedes cambiar la variable %Destino% a mi script, para enviar emails automaticamente a una lista de contactos (Separados por punto y coma ; ) el programa lo permite, me gusta mucho, por desgracia con los archivos no permite separarlos con punto y coma, y ahora me toca sufrir por eso :xD




Creo que el primer batch que has puesto me va a servir, aunque al final tengo que pasar en el LOOP todos los argumentos a un archivo de texto, porque sino tu batch usa SHIFT y me los borra todos, a ver si lo consigo xD
No he vuelto, solo estoy de paso.

leogtz

Pero bueno, suponiendo que hago un pequeño script que me envie a mi email unos datos, qué necesitaría tener en la maquina de donde sale el email?
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

SuperDraco

este programa

https://www.zeta-uploader.com/es/download

nada más!

solo necesitas usar el zulc.exe  ;D bueno aunque he intentado quitar la mayoría de librerias y parece que todo lo del paquete de instalación es necesario (Menos las carpetas de idiomas, y y el zetauploader.exe) parece que el resto de dependencias las usan tanto la version normal como la commandline.

saludosss
No he vuelto, solo estoy de paso.

leogtz

Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com