Comparar versiones de un software desde un bat

Nuevamente por acá, necesitando resolver un dilema.

Ejecutando el siguiente script logro extraer la versión de un programa o ejecutable, en este caso "Teamviewer"

wmic datafile where "name='C:\\Program Files (x86)\\Teamviewer\\TeamViewer.exe'" get version|find "1"

Se me había ocurrido que a través de un bucle, extraer la versión sin puntos:

@echo off
FOR /f %%i in ('wmic datafile where "name='C:\\Program Files (x86)\\Teamviewer\\TeamViewer.exe'" get version^|find "1"') DO set ver=%%i&echo version con puntos: %%i
set ver=%ver:.=%
echo version sin puntos: %ver%
FOR /f "tokens=1,2,3,* delims=." %%i in ('wmic datafile where "name='C:\\Program Files (x86)\\Teamviewer\\TeamViewer.exe'" get version^|find "1"') DO set ver=%%i%%j%%k%%l&echo version sin puntos segunda opcion: %ver%

A continuación planteo el problema:

La versión actual al día de la fecha es: 15.13.60.

Por otro lado la versión que deseo comparar tiene la 15.2.2756

Al ejecutar el bat me da como resultado en ambos lo siguiente

151360 para la versión nueva y..

1522756 para la versión vieja...

Al querer utilizarlas para compararlas, la versión vieja termina siendo mayor, entonces viene mi consulta... ¿de qué manera puedo extraer y comparar las versiones de tanto el exe instalado como el ejecutable en si, para de alguna manera poder decidir, si es una versión anterior goto:updateTeam... Por dar un ej.

1 respuesta

Respuesta
1

Voy a intentar plantear el tema en términos un poco generales. Las versiones de software suelen caracterizarse por una serie de cifras separadas por puntos pero con criterios de prioridad, de manera que la primera cifra es la más importante, luego la segunda y así sucesivamente. En este caso concreto hablaríamos de tres cifras y se trata de ver si la versión obtenida de la máquina revisada es inferior a la versión "de control" porque si fuera inferior habría que actualizarla.

No creo que sea buena idea "unificar" la versión en un único número, porque de esa manera se pierde la priorización (supongo que se podría pensar en alguna manera de obtener ese número único multiplicando cada cifra por una cantidad fija, mayor que el mayor valor posible para esa cifra y sumando los resultados parciales pero no voy a elegir ese camino). Supongamos que la versión obtenida en la máquina fuera n1. N2. N3 y la versión de control fuera c1. C2. C3.

Diremos que c1. C2.c3 > n1. N2. N3:

1. Si c1 > n1 independientemente de los valores de las otras cifras

2. Si c1=n1 y c2>n2 independientemente de los valores de c3 y n3

3. Si c1=n1, c2=n2 y c3>n3

En los demás casos c1. C2. C3 no es mayor que n1. N2. N3 y por tanto no hay que actualizar la versión del software.

Te propongo este bat para hacer esa comparación en este caso concreto:

@echo off
set /a c1=15
set /a c2=13
set /a c3=60
for /f "tokens=1,2,3,* delims=." %%a in ('wmic datafile where "name='C:\\Program Files (x86)\\Teamviewer\\TeamViewer.exe'" get version^|find "1"') do set /a n1=%%a&set /a n2=%%b&set /a n3=%%c
echo %n1% %n2% %n3%
if %c1% gtr %n1% (echo parte 1 de control es mayor que interna&goto :actualizar
   ) else if %c2% gtr %n2% (echo parte 2 de control es mayor que interna&goto :actualizar
      ) else if %c3% gtr %n3% echo parte 3 de control es mayor que interna&goto :actualizar
echo La version interna es mayor o igual que la de control, no se actualiza
goto :eof
:Actualizar
Echo La version interna es menor que la de control, debe actualizarse

En este caso he puesto "a pelo" los valores de c1, c2 y c3 pero podrían obtenerse de algún otro sitio.

He estado revisando el BAT y creo que no está bien. Hay que contemplar explícitamente el caso de que los niveles anteriores sean iguales para que no se produzcan errores de tratamiento. Creo que debería ser así:

@echo off
set /a c1=15
set /a c2=13
set /a c3=60
for /f "tokens=1,2,3,* delims=." %%a in ('wmic datafile where "name='C:\\Program Files (x86)\\Teamviewer\\TeamViewer.exe'" get version^|find "1"') do set /a n1=%%a&set /a n2=%%b&set /a n3=%%c
echo %n1% %n2% %n3%
if %c1% gtr %n1% (echo parte 1 de control es mayor que interna&goto :actualizar
   ) else if %c1% equ %n1% if %c2% gtr %n2% (echo parte 2 de control es mayor que interna&goto :actualizar
      ) else if %c1% equ %n1% if %c2% equ %n2% if %c3% gtr %n3% echo parte 3 de control es mayor que interna&goto :actualizar
echo La version interna es mayor o igual que la de control, no se actualiza
goto :eof
:Actualizar
Echo La version interna es menor que la de control, debe actualizarse

Uff te juro que trato de ir aprendiendo sobre la marcha y todas las veces que te consulto algo se me presentan nuevos desafíos de aprendizaje y comprensión. El script funciona muy bien la verdad, logro comparar e interceder según la necesidad, y se me ocurrió si se puede evitar tener que colocar la versión actual como al principio del script. Por eso ahora te consulto.

Ahora intentaré primero extraer la versión del .exe guardarlo en alguna variable y recién pasar a examinar el software instalado para poder realizar las comprobaciones y accionar según lo necesitado. Seguramente me tendrás de nuevo por acá si no logro resolverlo para solicitarte ayuda.

Aprovecho la ocasión para saludar a toda la comunidad, en especial a ti, por estas fiestas.

Muchas gracias por toda la ayuda de siempre.

Se me ocurren dos formas de obtener la versión "de control":
1. Tenerla almacenada en un archivo, digamos "c:\varios\ctrl_tw.txt" en cuyo caso podríamos cargarla en el script de esta manera:

for /f "usebackq tokens=1,2,3,* delims=." %%a in ("c:\\varios\\ctrl_tw.txt") do set /a c1=%%a&set /a c2=%%b&set /a c3=%%c

2. Extraerla del sitio adecuado de otra máquina de la misma red, digamos \\miequipo\Program Files (x86)\Teamviewer y entonces se podría hacer así:

net use m: "\\miequipo\Program Files (x86)"
for /f "tokens=1,2,3,* delims=." %%a in ('wmic datafile where "name='m:\\Teamviewer.exe'" get version^|find "1"') do set /a n1=%%a&set /a n2=%%b&set /a n3=%%c

¡Excelente! Gracias! probé el primer método y funciona correctamente, me queda probar el segundo. Muchísimas gracias y felices fiestas!

Cuando termines de hacer tus pruebas si te parece bien cierras la consulta. Feliz Año 2021

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas