¿Cómo editar un archivo txt desde Batch?

Necesito editar un archivo de texto a través de un comando Batch.
El contexto es el siguiente:

Necesito desinstalar todos los Hotfixes de varios PC. Encontré un programa llamado Windows Hotfix Uninstaller, pero no me funciona.
Lo que he hecho: Crear un batch que me genere una lista con todas las actualizaciones de Windows.
Utilizar una lista para desisntalar todos los parches.

El paso que me falta hacer para que sea todo automático es editar la lista para eliminarle la primera línea, y los primeros 2 caracteres de cada linea subsiguiente.

Necesito que pase de:

HotFixID 
KB2533552 
KB2884256 
KB2952664 
KB3020369 
KB3020370 
KB976002 
KB976902 

a esto

2533552 
2884256 
2952664 
3020369 
3020370 
976002 
976902 

Cualquier ayuda es infinitamente agradecida.

1 Respuesta

Respuesta
1

Prueba con esto.

Si el contenido del temp.txt es el que esperas quítale el "rem" a la última línea para que copie el temporal sobre el archivo ya editado (o trabaja con el temp.txt).

@echo off
Setlocal EnableDelayedExpansion
del /q temp.txt
if "%1" == "" goto ayuda
if not exist %1 goto error
for /F "skip=1 tokens=*" %%i in ('type %1') do (
set v=%%i
set v=!v:KB=!
echo !v!>>temp.txt )
goto fin
:Error
Echo No existe el archivo %1
goto fin
:Ayuda
Echo Elimina primera linea y "KB" de las otras lineas
Echo Formato: %0 archivo
Echo Ejemplo:
echo %0 kk.txt
:Fin
rem copy /y temp.txt %1

Como la página altera algunas cositas te comento que entre la "!" y la "v" no debe haber ningún espacio en ninguno de los dos casos. Y que los "echo" los puse con minúsculas, pero eso no afecta al resultado. Lo otro sí.

Ya me dirás.

La verdad no veo como hacerlo funcionar.

Para que me eliminara el archivo, intenté esto.

@echo off
Setlocal EnableDelayedExpansion
del %~dp0Lista.txt
if "%1" == "" goto ayuda
if not exist %1 goto error
for /F "skip=1 tokens=*" %%i in ('type %1') do (
set v=%%i
set v=!v:KB=!
echo !v!>>%~dp0Lista.txt )
goto fin
:Error
Echo No existe el archivo %1
goto fin
:Ayuda
Echo Elimina primera linea y "KB" de las otras lineas
Echo Formato: %0 archivo
Echo Ejemplo:
echo %0 kk.txt
:Fin
copy /y temp.txt %1
Pause

El BAT no hace lo que necesito. Sólo elimina el archivo creado con el BAT de generar la lista.

Ayuda pls!

No entiendo que es %~dp0Lista.txt. ¿Es el nombre del archivo que quieres tratar? Si copias el archivo que te puse, tal cual, en un bat (digamos gt.bat) y lo ejecutas te saldrá:

D:\BAT>gt
Elimina primera linea y "KB" de las otras lineas
Formato: gt archivo
Ejemplo:
gt kk.txt
D:\BAT>

Te pide el nombre del archivo a tratar. Supongamos que, en lugar de ese nombre tan raro (que podría dar problemas pues los bat no son muy "transparentes" a determinados caracteres por lo que te sugiero que, al menos para hacer pruebas le des un nombre sencillo) se llama gt.txt como en mis pruebas.

D:\BAT>type gt.txt
HotFixID
KB2533552
KB2884256
KB2952664
KB3020369
KB3020370
KB976002
KB976902
D:\BAT>type temp.txt
Este es el contenido del archivo
Antes de ejecutar el bat
Para que se vea lo que ocurre
D:\BAT>gt gt.txt
D:\BAT>type temp.txt
2533552
2884256
2952664
3020369
3020370
976002
976902

Puedes ver que el contenido del gt.txt es copia de tu ejemplo y que el temp.txt tiene un texto que no tiene nada que ver con esto. Tras ejecutar el bat gt sobre el archivo gt.txt el contenido de temp.txt es el que necesitas, según creo. Una vez comprobado esto ya se podría hacer que el temp.txt machacara el archivo original, eliminando el "rem" de la última instrucción, como te decía. Pruébalo y si no te funciona lista el bat y el archivo original y el temp.txt para que veamos que pasa.

¿Qué pasó con esto? ¿Lo has leído? ¿Lo has probado?

La verdad me lo solucionaron en otro foro.

Para obtener la info de los parches, estaba usando el comando

wmic qfe get "HotFixID" /format:table >%~dp0temp.txt

donde >%~dp0temp.txt significa que guarde un documento llamado temp.txt en la carpeta actual, sin importar desde donde se ejecute el .bat (%~dp0).
Ahora bien, la solución fue mucho más simple de lo que pensaba. Bastó con modificar un poco el comando para llegar a los parches, de la siguiente manera.

@echo off
setlocal enabledelayedexpansion
(for /f "delims=" %%a in ('wmic qfe get "HotFixID" ^| findstr [0-9]') do (
  set "$Line=%%a"
  echo !$Line:~2!))>%~dp0temp.txt

Con eso me evito un tercer bat para renombrar, y sólo necesito otro comando para eliminar todos los parches.

Gracias por todas las ayudas de todas formas!

Me alegro mucho de que se te haya resuelto el problema.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas