Archivo .bat que abra archivos y elimine texto específico

Pido de su apoyo para lo siguiente; Tengo una tarea repetitiva para múltiples archivos:
1. Abrir archivo. 2. Quitar una línea de texto específica y nunca cambiante. 3. Cerrar archivo y Guardar 4. <- número 1 otra vez por 'n' cantidad de veces (variable).

Lo que hice es generar un archivo .bat que los abra en automático para no andarlos buscando uno a uno o dar clic a cada uno, entonces, abre el archivo y en cuanto hago cambios y cierro; abre el siguiente... La duda es, ¿hay forma de automatizar esta tarea con ms-dos sin usar programas? Modifico xml, entonces el programa que uso es bloc de notas.

Respuesta
2

Si te he entendido bien quieres un BAT que revise todos los archivos de un tipo (en tu caso, con extensión XML) existentes en una carpeta y elimine de ellos una línea concreta (digamos la que contiene un texto a definir).

Para eso podría servir este BAT:

@echo off
Setlocal EnableDelayedExpansion
set carpeta=d:\carpeta prueba\AAAAA
set texto=schemaLocation
pushd %carpeta%
for /f "tokens=*" %%a in ('dir /b *.xml') do call :tratarch "%%a"
popd
goto :eof
:tratarch
echo tratando archivo %1
set grabar=N
del /q tmp.txt>nul 2>&1
for /f "usebackq tokens=*" %%x in (%1) do (
   echo %%x^^|find "%texto%" || set grabar=S
   if "!grabar!"=="S" echo %%x>>tmp.txt&set grabar=N
)
Echo copy /y tmp.txt %1

El COPY final está precedido de un ECHO para que se vea el comando que se ejecutaría pero no se ejecute (porque reescribiría el archivo original). He incluido una línea para que vaya mostrando los archivos que está tratando

El problema es que los BAT no "se llevan bien" con las líneas de los archivos XML, yo creo que la causa de ello es que el "lenguaje de programación BAT" no es "transparente" al contenido de las líneas y determinados caracteres muy presentes en esos archivos (especialmente los caracteres "<" y ">") impiden que se traten adecuadamente las líneas que los contienen.

Puedes probar con otro tipo de archivos de texto puro si quieres hacerte una idea del funcionamiento pero, insisto, no creo que puedas conseguirlo con un BAT si los archivos son XML. Sin embargo probablemente si que podrías hacerlo con PowerShell (PS). Si te interesa puedo intentar hacer algo parecido en PS aunque no soy muy experto en esa shell.

Aunque no hayas dicho nada sobre este asunto, como me interesa meterme un poco con PS y me viene bien tener asuntos concretos sobre los que investigar, te ofrezco un guión/script de PS que creo que podría servir para lo que quieres, si es que lo he entendido bien:

$carpeta="c:\users\g\documents\bat\carpeta prueba"
$texto="schemaLocation"
Push-Location $carpeta
$listArch = Get-ChildItem *.xml -Name
foreach ($archivo in $listArch) {
   Write-Host "Tratando archivo: " $archivo
   Remove-Item temp.txt -ErrorAction:SilentlyContinue
   foreach ($linea in Get-Content $archivo) {
      $lin = $linea | Select-String -Pattern $texto
      if ($lin -eq $null) {$linea | Out-File -FilePath temp.txt -Append -Encoding default}
      }
   Copy-Item temp.txt "$archivo"
}
Pop-Location

Sigue el mismo esquema de trabajo que el BAT con algunos matices (al hacerlo me he dado cuenta de que probablemente en el BAT no era necesario usar una rutina TRATARCH porque se podía resolver con un segundo bucle FOR).

Bueno, si te sigue interesando el asunto ya nos dirás.

He quedado encantado además que soy ya nuevo seguidor, la función con PS no sé por qué no se me había ocurrido y funciona excelente, sólo unas dudas más:
1. ¿Puede eliminar la línea completa en PS? Porque elimina el texto pero busco que elimine la línea entera como si se hiciera en el excel.
2. ¿Cómo se puede compilar en el script? Busco que de igual forma se haga como un bat, sólo dé doble clic y se haga en automático, yo lo entiendo pero la automatización va dirigida a un equipo que no es experto en el uso de la P.C., lo que necesitan es doble clic y listo.

Pendiente, nuevamente gracias.

Debería eliminar la línea completa. De hecho en mis pruebas lo hace así. Si quieres pásame un ejemplo de lo que hace en tu caso para que pueda comprobarlo.

Para ejecutar un script de PS como si fuera un BAT se puede, por ejemplo, construir un BAT que lo lance. Algo como:

@echo off
PowerShell -Command c:\users\g\documents\bat\gabper.ps1
Pause

Suponiendo que el script PS se llame GABPER. PS1 y que se encuentre ubicado en el path que se indica

Mire, me marca este error al ejecutar el bat: 

De hecho ahora que cambié el texto a borrar "<AddendaWMCartaPorte TipoOperacion="" PrefacturaId_TripId="" LCYVendorNumber="" SAPVendorNumber="" />". Se ejecuta pero no lo elimina, justo ese texto es el que quiero eliminar, o bien, la línea es la 29.

Me parece que has separado el nombre del script de la ruta. Por lo que veo debería ser:

@echo off
PowerShell -Command c:\users\josue.perez\Escritorio\Elimina\Addenda.ps1
Pause

Aunque no es descartable que tengas que poner "Desktop" en vez de "Escritorio" porque el Windows 10 es un poco "puñetero" con los nombres "regionalizados" (de hecho hay que poner "users" y ya no vale "usuarios"). En cuanto al texto a buscar te sugiero que no pongas el texto completo sino solo una parte significativa de la línea, algo que solo esté presente en esas líneas.

Ya me contarás

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas