Script .bat para renombrar automáticamente un archivo
A toda esta increíble comunidad, de antemano agradecerles por todas las veces que buscando ayuda llegué hacia Uds y pude resolver mis dudas.
Paso a detallar el trabajo que necesito realizar:
descargo de una página web datos metereológicos de manera automática y diariamente, https://ssl.smn.gob.ar/dpd/zipopendata.php?dato=tiepre. Me descarga un archivo "diamesaño.zip" que contiene un "diamesaño.txt" con nombres distintos cada día. Lo que estoy necesitando es, que ese archivo .zip y el archivo .txt contengan siempre el mismo nombre al descargarse y al descomprimirse, llámense por ej "TempActual.zip" y "TempActual.txt".
Necesito, descargar, renombrar el zip, extraer y renombrar el txt (mi problema son los nombres que varían según la fecha).
¿Qué métodos en algún script .bat puedo usar? ¿Ya sea al descomprimir o por medio de alguna búsqueda en el directorio y que renombre eso archivos?
Muchas gracias de antemano, soy muy nuevo en esto de los scripts y ojalá puedan ayudarme.
1 Respuesta
Todavía no tengo resuelto lo que supone la carga automática del archivo zip desde la página que indicas porque no veo una forma sencilla de navegar desde un entorno MSDOS, por ejemplo para elegir descargar el archivo en lugar de verlo. Creo recordar que usando el navegador Mozilla existe una opción de "Hacer esto automáticamente con estos archivos a partir de ahora" que podría servir, pero también recuerdo que la usé alguna vez y luego no conseguía "restaurar" la posibilidad de elegir. Además eso puede depender del navegador utilizado para gestionar la descarga. Y otro problemilla con el que me he encontrado es el que tiene que ver con la descompresión del zip desde "línea de comando". Con la versión de WinZip que manejo no he conseguido hacerlo pero sí con la versión del compresor/descompresor 7z (7-Zip). Te dejo aquí lo que he estado probando por si te sirve de algo:
@echo off start /wait firefox.exe ssl.smn.gob.ar/dpd/zipopendata.php?dato=tiepre set aaaa=%date:~6,4% set mm=%date:~3,2% set dd=%date:~0,2% c: cd "C:\Documents and Settings\%username%\Mis documentos\Descargas" "C:\Archivos de programa\7-Zip\7z.exe" e EstadoTiempo-%dd%%mm%%aaaa%.zip Echo ren EstadoTiempo-%dd%%mm%%aaaa%.zip TempActual.zip Echo ren estado_tiempo%aaaa%%mm%%dd%.txt TempActual.txt
La línea 2 depende del navegador utilizado. Yo he probado con Mozilla Firefox pero podría ser cualquier otro ajustando esa línea.
Las líneas 7 y 8 dependen de la versión de Windows. Yo he probado con Windows XP. En Windows 10, por ejemplo, cambiarían a algo como:
cd "C:\Users\%username%\Documents\Downloads" "C:\Program File (x86)\7-Zip\7z.exe" e EstadoTiempo-%dd%%mm%%aaaa%.zip
Por último las dos últimas líneas muestran el comando que se ejecutaría en lugar de ejecutarlo realmente. Si el aspecto es bueno basta con quitar el ECHO que las precede para que ya se ejecutara el renombrado de los archivos.
Si te parece lo pruebas y me dices lo que se te ocurra.
Hola buen día, Muchísimas pero muchísimas gracias por responderme. Te cuento que en el transcurso, antes de tu respuesta, logré hacer esto.
Usando wget he descargado el archivo usando lo siguiente:
S:\BSD\CLIMA\wget.exe --no-check-certificate -O "S:\BSD\CLIMA\ClimaActual.zip" https://ssl.smn.gob.ar/dpd/zipopendata.php?dato=tiepre
Luego para descomprimir usé esto:
@echo off setlocal cd /d %~dp0 Call :UnZipFile "S:\BSD\CLIMA\" "S:\BSD\CLIMA\ClimaActual.zip" exit /b :UnZipFile <ExtractTo> <newzipfile> set vbs="%temp%\_.vbs" if exist %vbs% del /f /q %vbs% >%vbs% echo Set fso = CreateObject("Scripting.FileSystemObject") >>%vbs% echo If NOT fso.FolderExists(%1) Then >>%vbs% echo fso.CreateFolder(%1) >>%vbs% echo End If >>%vbs% echo set objShell = CreateObject("Shell.Application") >>%vbs% echo set FilesInZip=objShell.NameSpace(%2).items >>%vbs% echo objShell.NameSpace(%1).CopyHere(FilesInZip) >>%vbs% echo Set fso = Nothing >>%vbs% echo Set objShell = Nothing cscript //nologo %vbs% if exist %vbs% del /f /q %vbs%
Luego renombre el txt con esto:
ren S:\BSD\CLIMA\*.txt ClimaActual.txt
Es decir, el código total dice esto:
del S:\BSD\CLIMA\*.txt del S:\BSD\CLIMA\*.zip S:\BSD\CLIMA\wget.exe --no-check-certificate -O "S:\BSD\CLIMA\ClimaActual.zip" https://ssl.smn.gob.ar/dpd/zipopendata.php?dato=tiepre @echo off setlocal cd /d %~dp0 Call :UnZipFile "S:\BSD\CLIMA\" "S:\BSD\CLIMA\ClimaActual.zip" exit /b :UnZipFile <ExtractTo> <newzipfile> set vbs="%temp%\_.vbs" if exist %vbs% del /f /q %vbs% >%vbs% echo Set fso = CreateObject("Scripting.FileSystemObject") >>%vbs% echo If NOT fso.FolderExists(%1) Then >>%vbs% echo fso.CreateFolder(%1) >>%vbs% echo End If >>%vbs% echo set objShell = CreateObject("Shell.Application") >>%vbs% echo set FilesInZip=objShell.NameSpace(%2).items >>%vbs% echo objShell.NameSpace(%1).CopyHere(FilesInZip) >>%vbs% echo Set fso = Nothing >>%vbs% echo Set objShell = Nothing cscript //nologo %vbs% if exist %vbs% del /f /q %vbs% ren S:\BSD\CLIMA\*.txt ClimaActual.txt
Sé que no es prolijo lo que hago, más bien testeo por medio de CMD y si veo que funciona lo pongo a funcionar.
Luego hice un Excel y le apliqué el siguiente macros en el módulo para que me guarde el archivo cada 1 minuto:
Sub auto_open() tiempo = Now + TimeValue("00:01:00") Application.OnTime tiempo, "Guardar" End Sub Sub Guardar() ActiveWorkbook.Save Call auto_open End Sub
Lo que obtengo como resultado es:
- Borrar cualquier zip y cualquier txt
- Descargar el archivo con el clima actualizado
- Descomprimir el zip
- Renombrar el archivo descomprimido
- Auto Actualizar el Excel con datos actuales y auto guardarlos
Sé que no es algo ordenado y que carece de sutilezas, pero funciona, ahora te digo la verdad de programación no se nada en absoluto, por tal motivo podrás encontrar seguramente errores u horrores.
Me gustaría saber que opinas al respecto, que correcciones le harías para que todo fluya.
Nuevamente eternamente agradecido por tu tiempo.
¡Hombre! Poco puedo opinar de algo que está resuelto en Visual Basic y Excel, un poco fuera de mi "territorio". Y aunque digas que no sabes nada de programación creo que los hechos demuestran otra cosa. En todo caso me interesa tu forma de resolver el asunto y tomo nota para mi uso propio y creo que podrá ser de utilidad a otras personas que se pasen por aquí. Y gracias por la calificación, aunque me parece un poco inmerecida porque lo único que he hecho es un esbozo, más bien pobre, de solución en entorno estrictamente BAT.
Lo que aprendí son sólo fragmentos, ojalá yo tuviera sus conocimientos. Me alegro que sirva para algo, investigando un poco por aquí otro poco por allá pude armar eso, y también investigando es que llegué a Uds.
Me alegro que sirva para algo, sin querer aporté con algo y en lo que pueda aportar lo haré.
Hoy comienzo a ver más sobre el tema de Programación. Si hay recomendaciones acerca de por dónde comenzar a estudiar, se los agradeceré.
Por el momento no les quito mas tiempo, muchas gracias por todo
Esta respuesta es solo para que la página deje de considerar que tengo una pregunta pendiente de respuesta. Ha sido un placer colaborar contigo, o intentarlo. No respondas para que pueda quedar "nivelado".
Hola buen día, perdón que vuelva a escribir por acá pero quería comentarte algo que me surgió.
El script funcionaba correctamente hasta hace unos días, para ser más exactos funcionó hasta el viernes 6 de Septiembre. Al intentar hacerlo funcionar al día de hoy solo parpadea y desaparece, a lo que me metí al script y agregué pausas para ver si me tiraba un error y efectivamente en la línea
set /a dd=%date:~0,2%
Me sale el siguiente error
Número no válido . Las constantes numéricas son decimales(17), hexadecimales (0x11), u octales (021).
Alguna manera de corregirlo?
Muchas gracias!
No sé muy bien si estamos hablando del bat que te sugería en mi respuesta del 16 de agosto, entre otras cosas porque el SET que figuraba ahí para la variable DD no era "aritmético" pero vamos a ver que se puede hacer.
Me parece perfecto que hayas conseguido hacer lo necesario para averiguar algo más sobre el problema. Da la impresión de que, por alguna razón, ha cambiado el formato de la fecha. Para saber algo más deberías incluir, antes del pause correspondiente, esta línea:
Echo fecha: %date% dia: %date:~0,2%
Con esto podremos ver el formato de la fecha y lo que se está intentando guardar en la variable DD y nos dará una pista sobre lo que está pasando
Hola buen día, me parece que fue algo temporal, hoy funciona correctamente. Coloqué igual la línea que me pediste y la dejo ahí en caso que vuelva a hacer lo mismo para ver que me dice en cuanto al formato de la fecha (en caso que fallase). De igual manera te agradezco nuevamente por la enorme ayuda brindada
Hola buen día, te molesto nuevamente porque encontré un error en el script en el que quizás puedas echarme una mano con ello.
Tengo un Excel consultando cada cierto tiempo un archivo llamado ClimaActual.txt y resulta que al comenzar el script borra los txt y extrae el contenido del .zip y vuelve a crear el archivo ClimaActual.txt donde está la base de datos, y Excel como está programado para hacer la consulta de ese archivo cada cierto momento, éste no encuentra donde hace la consulta y me dá error y traba todo.
Mi consulta sería si hay posibilidad de no borrar el txt y simplemente crearlo en un lugar temporal para extraerle la info y colocarlo en el archivo ClimaActual.txt y guardarlo sin borrarlo.
Te recuerdo el script final
del S:\BSD\CLIMA\*.txt del S:\BSD\CLIMA\*.zip S:\BSD\CLIMA\wget.exe --no-check-certificate -O "S:\BSD\CLIMA\ClimaActual.zip" https://ssl.smn.gob.ar/dpd/zipopendata.php?dato=tiepre @echo off setlocal cd /d %~dp0 Call :UnZipFile "S:\BSD\CLIMA\" "S:\BSD\CLIMA\ClimaActual.zip" exit /b :UnZipFile <ExtractTo> <newzipfile> set vbs="%temp%\_.vbs" if exist %vbs% del /f /q %vbs% >%vbs% echo Set fso = CreateObject("Scripting.FileSystemObject") >>%vbs% echo If NOT fso.FolderExists(%1) Then >>%vbs% echo fso.CreateFolder(%1) >>%vbs% echo End If >>%vbs% echo set objShell = CreateObject("Shell.Application") >>%vbs% echo set FilesInZip=objShell.NameSpace(%2).items >>%vbs% echo objShell.NameSpace(%1).CopyHere(FilesInZip) >>%vbs% echo Set fso = Nothing >>%vbs% echo Set objShell = Nothing cscript //nologo %vbs% if exist %vbs% del /f /q %vbs% ren S:\BSD\CLIMA\*.txt ClimaActual.txt
Desde ya muchas gracias
No estoy muy seguro de haberte entendido bien. La única referencia al archivo ClimaActual.txt en el BAT está, precisamente, en la última línea. Ese renombrado debe recrear ese archivo si no existe. Si existiera daría un mensaje de error.
Si, como dices, el borrado que estorba es el de la primera línea (que borraría, entre otros, el archivo S:\BSD\CLIMA\ClimaActual.txt si existiera, lo que haría que la última línea funcione con seguridad) habría que ver que es lo que se quiere hacer. Si se suprime esa línea no se hará el borrado y no funcionará la última línea del BAT. Se podría retrasar el borrado de ese archivo hasta el último momento, en la penúltima línea. Pero todavía no tengo claro si el borrado de la primera línea borra más archivos TXT o solo el que nos ocupa.
Ya me contarás.
Hola, te cuento que lo resolví haciendo que la descarga del zip, descompresión y renombrado del txt vaya a una carpeta temporal, y como último paso que copie desde esa carpeta temporal a otra carpeta sustituyendo el archivo que contiene la base de datos, y hasta el momento no me ha dado problemas, obvio que queda sujeto a pruebas. No se me había ocurrido y me comenzaba a desesperar porque no quería molestar, pero bueno pruebo y cualquier cosa os molesto. Saludos y gracias por su tiempo
- Compartir respuesta