.bat Modificación archivo por fecha de registro del día

Sucede que en una ruta existen varios archivos y todos los días llega un archivo nuevo que debe de modificarse diariamente manualmente, quitando algunas lineas erróneas, ahora lo que necesito es que el .bat pueda encontrar y modificar en todos los archivos el más actual solamente.

¿El .bat puede identificar el archivo por la fecha que da el sistema operativo?

También otro dato que aporto es que el archivo tiene una nomenclatura con la fecha, por ejemplo fecha de hoy (REC3_PORT_OUT_H_20181025.txt) .

En el siguiente código aportados por ustedes, ¿se podrá añadir lo que trato de explicar?.

@echo off
Setlocal EnableDelayedExpansion
del /q salida.txt
for /f "tokens=*" %%a in (entrada.txt) do (
set linea=%%a
set aux=!linea:~72,1!
If not #!aux!#==## echo %%a>>salida.txt
)

1 respuesta

Respuesta
1

Este bat puede conseguir que se aplique el procedimiento al archivo más reciente de la carpeta indicada en la variable RUTA (que debes rellenar con lo que te interese):

@echo off
Setlocal EnableDelayedExpansion
set ruta=d:\Carpeta prueba
cd "%ruta%"
del /q salida.txt
for /f "tokens=*" %%a in ('dir /b /o-d') do (call :limpiar "%%a"&goto :eof)
:limpiar
dir %~1
for /f "tokens=*" %%x in (%~1) do (
set linea=%%x
set aux=!linea:~72,1!
if not #!aux!#==## echo %%x>>salida.txt
)

El comando DIR %~1 sirve para que saque la comprobación de la fecha/hora y nombre del archivo que se ha tratado y poder así ver si es o no el más reciente de la carpeta. Una vez que te convenzas de que siempre es así puedes eliminarlo. Como antes en SALIDA.TXT se dejan las líneas de más de 72 caracteres del archivo de partida (el más reciente de la carpeta).

Gracias, pero me está imprimiendo en la salida la línea del for y no los datos que quiero.

esto imprime : for /f "tokens=*" %%a in ('dir /b /o-d') do (call :limpiar "%%a"&goto :eof)

Así está mi código:

@echo off
Setlocal EnableDelayedExpansion
set ruta=C:\Users\mgarridh\Downloads\archivo con error
cd "%ruta%"
del /q salida.txt
for /f "tokens=*" %%a in ('dir /b /o-d') do (call :limpiar "%%a"&goto :eof)
:limpiar
dir %~1
for /f "tokens=*" %%x in (%~1) do (
set linea=%%x
set aux=!linea:~72,1!
if not #!aux!#==## echo %%x>>salida.txt
)

Creo que la ruta no es una verdadera ruta. Debería ser el nombre de una carpeta y más parece el nombre de un archivo. Si es así en la ejecución del bat saldrá algo como "El nombre del directorio no es válido.". Si lanzas el bat desde el explorador de Windows y no desde una ventana CMD sería bueno que incluyeras un PAUSE en el FOR para poder ver algo antes de que se cierre la ventana. Quedaría así (solo te pongo el FOR):

for /f "tokens=*" %%a in ('dir /b /o-d') do (call :limpiar "%%a"&pause&goto :eof)

Más detalles:

Al no poder cambiar al directorio, por no ser RUTA el nombre de un directorio, se queda en el que está y el archivo más reciente de ahí es el propio BAT. Le aplica la regla de sacar solo a SALIDA.TXT las líneas de más de 72 caracteres y la única que la cumple es, precisamente, la del FOR. Por eso es la única línea que aparece en SALIDA.TXT

Ha funcionado correctamente, Gracias !

Ahora me salta otro problema: Resulta que dentro del directorio donde el .bat buscará el archivo por fecha y hora más reciente, existirán otros archivos con distinto nombre, pero pueden tener la misma fecha y hora, lo cual este .bat debe omitir a los demás archivos y solo hacer la modificación para el archivo con nomenclatura REC3_PORT_OUT_H_20181027.txt

Dentro del código ya facilitado se podrá hacer esta validación ?

No hay problema en incluir en el comando DIR sobre el que trabaja el FOR los comodines necesarios para delimitar los archivos que se buscan. Si los que interesan tienen la "estructura nominal" REC3_PORT_OUT_H_AAAAMMDD.txt el FOR en cuestión sería:

for /f "tokens=*" %%a in ('dir /b /o-d REC3_PORT_OUT_H_*.txt') do (call :limpiar "%%a"&pause&goto :eof)

Y si ya no necesitas el PAUSE dentro del FOR, lo puedes quitar

Excelente !

Este archivo de salida se puede mover a otra carpeta ?

¡Pues claro! Supongamos que lo quieres mover a la carpeta "c:\Lo que sea\Carpeta Salida". Bastaría con modificar el FOR para que diga esto (ya le he quitado el PAUSE):

for /f "tokens=*" %%a in ('dir /b /o-d REC3_PORT_OUT_H_*.txt') do (call :limpiar "%%a"&move "%ruta%\salida.txt" "c:\Lo que sea\Carpeta Salida"&goto :eof)
La pregunta no admite más respuestas

Más respuestas relacionadas