Hola a todos. Aqui les dejo un code sencillo que sube varios archivos a un servidor ftp. El detalle es que sube de uno por uno y verifica que el archivo este en el servidor. Pude haberlo hecho mas sencillo pero como el servidor maneja muchos archivos y a su vez varios usuarios, no es buena idea sacar un listado para luego compararlos.
El problema es que es demasiado lento debido a la forma que esta hecho, la lentitud no es problema cuando son 10 o 20 archivos, pero si cuando son 2000 o mas. El punto es si alguen tiene una idea como hacerlo mas eficiente siguiendo la idea de veririficar que el archivo realmente este en servidor ftp. A su vez creo que puede servirle a alguien.
@echo off
:CONTANDO
set /A contador=0
FOR %%x in (*.HTML, *.GIF *.jpg, *.asp) DO set /A contador=1+contador
echo .
echo . ____________________________________________________
echo tienes %contador% archivos para subir
echo . ____________________________________________________
echo .
pause > nul
:ENVIA
set /A conta=0
set /A movidos=1
FOR %%x in (*.HTML, *.GIF *.jpg, *.asp) DO (
echo open mi_sitio_ftp > manda.ftp
echo user usuario pasword >> manda.ftp
echo put %%x >> manda.ftp
echo ls %%x >> manda.ftp
echo quit >> manda.ftp
ftp -v -n -s:manda.ftp > enviados.txt
FINDSTR /E /I %%x enviados.txt > en_ftp2.txt
echo %%x > local.txt
call :COMPARA
)
:COMPARA
set /P aqui=<local.txt
set /p alla=<en_ftp2.txt
if %aqui%==%alla% (
set /A movidos=1+%movidos%
echo %movidos%/%contador% -- %alla% Archivo enviado correctamente
) ELSE (
if not %aqui%==%alla% DO (
echo %aqui% NO SE HA PODIDO ENVIAR. REVISA SI NO HAY PROBLEMAS DE COMUNICACION
)
goto :eof
echo total de archivos enviados %movidos%
echo total de archivos que deberian enviarse %contador%
Un poco de explicacion
FOR %%x in (*.HTML, *.GIF *.jpg, *.asp) DO (
Bueno aqui no hay mucha ciencia puesto que solo hago un ciclo for para los archivos con extensiones mencionadas. Lo importante es que la variable es la x que va tomando el valor del nombre del archivo segun se va recorriendo la lista en el directorio y las veces que se repiten las instrucciones de abajo.
echo open mi_sitio_ftp > manda.ftp
echo user usuario pasword >> manda.ftp
echo put %%x >> manda.ftp
echo ls %%x >> manda.ftp
echo quit >> manda.ftp
Puesto que segun yo no se pueden mandar variables a una conexion ftp, para cada archivo a subir creo un archivo de instrucciones ftp.
ftp -v -n -s:manda.ftp > enviados.txt
Aqui abro una conexion ftp para cada archivo y mando la salida del comando a un archivo de texto.
FINDSTR /E /I %%x enviados.txt > en_ftp2.txt
Busco el renglon donde esta el nombre del archivo en cuestion y a su ves lo mando a otro archivo, para tener en un archivo el nombre del documento que busco y que se supone esta en el servidor ftp.
Mando el nombre del documento que el ciclo for esta intentando enviar en ese momento a un archivo temporal.
set /P aqui=<local.txt
set /p alla=<en_ftp2.txt
Pongo el nombre del archivo que quiero enviar en variables.
if %aqui%==%alla% (
set /A movidos=1+%movidos%
echo %movidos%/%contador% -- %alla% Archivo enviado correctamente
) ELSE (
Hago una comparacion de los archivos. Si el que estoy tratando de enviar se encuentra en el servidor solo incremento un contador para poder comparar al final cuantos archivos tengo y cuantos se subieron realmente.
Bien como les dije es sencillo pero pude servirle a alguien y creo tambien que alguien tendra una idea para hacerlo mas eficiente.