[Batch] Instalador selectivo de updates Windows

Iniciado por ovichan, 13 Octubre 2012, 21:57 PM

0 Miembros y 1 Visitante están viendo este tema.

ovichan

Hola a todos, el caso es que ya sabeis lo tedioso que puede resultar aplicar las updates de windows manualmente, o de forma automatica cuando su numero asciende a 700 revisiones, como es mi caso. El agente de updates de windows solo me requiere 78 para que este protegido por lo que solo quiero instalar esas. Para ello he utilizado este codigo, para listas todas las updates disponibles:

@Echo off
Title Instalador con lista
set ruta=F:\HDD negro\Utiles y programas\Programas De Microsoft\Microsoft_Updates\updates\

for /f %%i in ('dir /b /o:n "*kb*.msu"') do (

if not exist "updates_total.txt" (
echo %%i >> "updates_total.txt" )
)

::2 parte
for /f "tokens=1 delims=*" %%i in (updates.txt) do (find /i "%%i" "%ruta%updates_total.txt" >> "updates_instalar.txt"  )


El archivo updates.txt tiene un formato asi:

*KB2655992*
*KB2691442*
*KB2698365*
*KB3719985*
*KB2506212*
*KB2507618*
*KB2536276*
*KB3544893*
*KB2560656*
*KB2564958*


El caso es que find funciona bien, pero lo que devuelve en el archivo "updates_instalar.txt" tiene un formato muy raro, y yo esperaba que fuese simplemente el nombre de la revision, para posteriormente usar este archivo de texto en otro FOR, y las ejecute. El formato erroneo es este:


---------- F:\HDD NEGRO\UTILES Y PROGRAMAS\PROGRAMAS DE MICROSOFT\MICROSOFT_UPDATES\UPDATES\UPDATES_TOTAL.TXT
Windows6.1-KB2655992-x64.msu 

---------- F:\HDD NEGRO\UTILES Y PROGRAMAS\PROGRAMAS DE MICROSOFT\MICROSOFT_UPDATES\UPDATES\UPDATES_TOTAL.TXT
Windows6.1-KB2691442-x64.msu 

.....


Imagino que habra alguna manera de eliminar los encabezados esos.

Inicialmente pense que podria kizas, listar las updates que el agente de windows update te informa para instalar, pero no tengo ni idea de como se podria hacer, quizas con wmic. Lo que si he visto por la red es la manera de listar las updates instaladas...

Gracias de antemano.

Eleкtro

#1
La que estás liando...  :xD

A ver, en el archivo updates.txt tienes listadas las 75 updates que quieres instalar no? (Solamente las que no estén instaladas en el sistema de esas 75), pues entonces:

Código (dos) [Seleccionar]
@Echo off
Title Instalador automatico de actualizaciones de Windows

:: By Elektro H@cker

PUSHD "F:\HDD negro\Utiles y programas\Programas De Microsoft\Microsoft_Updates\updates"

wmic qfe get HotFixID > "%TEMP%\WIN_Updates.tmp"

FOR /F "usebackq" %%@ IN ("UPDATES.TXT") DO (
FIND "%%@" "%TEMP%\WIN_Updates.tmp" >NUL || (
Echo: Instalando update: %%@
(WUSA ".\%%@" /quiet /norestart && (Echo: OK!) || (Echo: ERROR)) | MORE
)
)

Pause&Exit

REM O PARA INSTALAR (SELECTIVAMENTE) TODA LA CARPETA...
REM
REM PUSHD "F:\HDD negro\Utiles y programas\Programas De Microsoft\Microsoft_Updates\updates"
REM wmic qfe get HotFixID > "%TEMP%\WIN_Updates.tmp"
REM FOR /R %%@ IN (*.MSU) DO (
REM FIND "%%@" "%TEMP%\WIN_Updates.tmp" >NUL || (
REM Echo: Instalando update: %%@
REM (WUSA "%%@" /quiet /norestart && (Echo: OK!) || (Echo: ERROR)) | MORE
REM )
REM )
REM Pause&Exit


Saludos




EDITO: se me olvidaba comentar que ajustes el formato de la lista "updates.txt" con este comando:
Código (dos) [Seleccionar]
WUSA ".\%%@"
Quizás le falte añadir un "%%@.exe"

Saludos








ovichan

Jeje cuando no se sabe se buscan mil soluciones... aunque sean retorcidas  ;-). Lo que tengo en el updates.txt son las actualizaciones que me sugiere windows update. Como no se sacar el listado(no el de las que si estan instaladas) desde el gestor de windows update, he copiado a mano el numero de kb, lo he metido en un txt. Da igual que instale de nuevo las updates ya que el sistema detecta si la revision ya esta instalada. No se si me explico.

Con wmic qfe get HotFixID sacas el listado de las ya instaladas, pero no hay algun comando para que me liste las sugeridas por windows update?

Pero antes de eso...  el more si no me acuerdo mal que me lo explicaste es como un assert no??? Si le llega un codigo de error elige entre OK y ERROR??

El uso de @ es indiferente o tiene alguna aplicacion especial en este caso??

Esta parte tampoco la entiendo FIND "%%@" "%TEMP%\WIN_Updates.tmp" >NUL || (

Lo interpreto como encuentra el numero de kb en el archivo temporal de las updates instaladas y lo redireccionas a NUL Ó ....

Eleкtro

Cita de: ovichan en 14 Octubre 2012, 00:33 AMCon wmic qfe get HotFixID sacas el listado de las ya instaladas, pero no hay algun comando para que me liste las sugeridas por windows update?
No, no se puede, al menos con puro Batch.

Hay un programa CLI parecido al WUSA con el que creo que si que puedes hacerlo, pero es de pago, y no intentes buscarle un crack, es un soft muy underground, de todas formas no recuerdo el nombre de la aplicación, la versión básica era muy mala y la despedí :silbar:. Acabo de recordar que lo encontré en el foro software CLI de la página oficial de AutoIt.

Cita de: ovichan en 14 Octubre 2012, 00:33 AMmore es como un assert no???
Uf, para nada, tienes que dejar de buscarle el punto "C" a Batch, porque no lo tiene.

Cita de: CMDC:\Users\Administrador\Desktop>more /?
Muestra la información pantalla a pantalla.

No tiene más uso

Yo lo uso como un un "trick" (o truco) para insertar una línea en blanco, el "MORE" se procesa en esa línea falle o no falle

Prueba este comando directamente en consola para entenderlo mejor:
Código (dos) [Seleccionar]
CMD /Q /C "For %@ in (a b c d e f) do (Echo %@ | MORE | @MORE | @MORE | @MORE | @MORE | @MORE | @MORE | @MORE | @MORE | @MORE)"
o:
Código (dos) [Seleccionar]
dir /B "%WINDIR%" |MORE
PD: Te ahorras bastante escritura de código para añadir líneas de "Echo"

Cita de: ovichan en 14 Octubre 2012, 00:33 AMSi le llega un codigo de error elige entre OK y ERROR??
Si, pero por los operadores && y ||, no por el MORE.

Cita de: ovichan en 14 Octubre 2012, 00:33 AMEl uso de @ es indiferente o tiene alguna aplicacion especial en este caso??
es indiferente, me gustan las arrobas todolocas :rolleyes:

Cita de: ovichan en 14 Octubre 2012, 00:33 AMEsta parte tampoco la entiendo FIND "%%@" "%TEMP%\WIN_Updates.tmp" >NUL || (

Lo interpreto como encuentra el numero de kb en el archivo temporal de las updates instaladas y lo redireccionas a NUL Ó ....
Pues sencillamente si, lo redirecciona para no mostrar el formato molesto del que hablabas, pero el código de error de FIND es lo que importa y lo que se procesa en esa línea

PD: Voy a tener que empezar a cobrarte xD
Un saludo.








ovichan

Jajaja pues esta la cosa como para pagar jajaja... ademas hoy estoy disgustao que un disco duro con un proyecto de anime se me ha borrao por culpa de una movida...

Bueno gracias por todo y un saludote.

PD: Como metodo guarri al final he hecho esto esperando respuesta:

@Echo off
Title Instalador con lista
set ruta=F:\HDD negro\Utiles y programas\Programas De Microsoft\Microsoft_Updates\updates\


for /f "tokens=1 delims=*" %%i in (updates.txt) do (call :start %%i)
cls
echo La instalacion ha finalizado. & Pause>nul


:start

if exist "Windows6.1-%1-v3-x64.msu" (
wusa /quiet /norestart Windows6.1-%1-v3-x64.msu & echo La actualizacion %1 se ha instalado.
)
if exist "Windows6.1-%1-v2-x64.msu" (
wusa /quiet /norestart Windows6.1-%1-v2-x64.msu & echo La actualizacion %1 se ha instalado.
)
if exist "Windows6.1-%1-x64.msu" (
wusa /quiet /norestart Windows6.1-%1-x64.msu & echo La actualizacion %1 se ha instalado.
)

ciberbang

Alguien lo a logrado? podrian subir el codigo completo?. Gracias