Cómo extraer un texto de el resultado de un batch

Tengo una duda eterna con respecto a la extracción de texto o de caracteres de un batch. Te cuento que lo que necesito saber es si la versión de Office tiene la licencia puesta o no, hasta donde sé, se hace de la siguiente manera:

Si es 32bits

cd C:\Program Files (x86)\Microsoft Office\Office16

si es 64 bits

cd C:\Program Files\Microsoft Office\Office16

Estando dentro de la carpeta colocar el siguiente código

Cscript ospp.vbs /dstatus

y de todo el resultado solo obtener la línea que dice LICENSE STATUS. ¿De qué manera se puede hacer?

Respuesta
1

Prueba con esto:

@echo off
if exist "C:\Program Files (x86)\Microsoft Office\Office16\*.*" set CarpOffice=C:\Program Files (x86)\Microsoft Office\Office16
if exist "C:\Program Files\Microsoft Office\Office16\*.*" set CarpOffice=C:\Program Files\Microsoft Office\Office16
pushd %CarpOffice%
for /f "tokens=3" %%a in ('cscript ospp.vbs /dstatus^|find "STATUS:"') do echo %%a
popd
pause

Es un poco esquemático y supongo que habría que mejorarlo. Y supongo que no es descartable que existan las dos carpetas, en cuyo caso habría que decidir que se hace. Yo he asumido que si existen las dos la que vale es la de 64 bits pero...

De momento capturo en %%a lo que dice la línea de "LICENSE STATUS:" en su tercer campo y lo muestro

Muchas gracias! funciona correctamente. Cuando tengas tiempo por favor explícame la función de pushd y popd. No entendí la función de ambos.

Pues resulta que he descubierto recientemente su gran utilidad, al menos para mí. PUSHD <nombre de carpeta> guarda la carpeta actual y sitúa el entorno de trabajo en la nueva carpeta cuyo nombre acompaña (<nombre de carpeta>). POPD recupera la situación previa, dejando el entorno de trabajo en la carpeta que se guardó. De este modo no tienes que andar cambiando de carpeta con comandos CD, o de unidad, si fuera el caso o te evitas utilizar el nombre completo (con todo el path incluido) para los archivos de la carpeta de trabajo.
PUSH y POP son instrucciones muy utilizadas en casi todos los lenguajes "ensambladores" (assemblers) y se utilizan para salvar en el STACK del programa y recuperarlo luego desde él, el contenido de registros que se vayan a utilizar por la rutina invocada. Si esto te suena a chino, ignóralo, es, más o menos, una explicación histórica de la existencia de estos comandos y del nombre que se les dio.
Como siempre puedes teclear PUSHD /? en una ventana CMD para que te informe.

Hola nuevamente, tengo una duda con otro script que no le encuentro la vuelta, seguramente me podrás ayudar.

tengo el siguiente código para extraer la versión de los programas instalados e instaladores:

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

me tira como resultado 15.13.6.0, no logro extraerlo en una variable, intento con un bucle FOR

FOR /f %i in ('wmic datafile where name="C:\\Program Files (x86)\\Teamviewer\\TeamViewer.exe" get version^|find "1"') DO (set ver=%i)

pero me tira el siguiente error:

C:\\Program Files (x86)\\Teamviewer\\TeamViewer.exe - Verbo de alias no válido.

Algo hago mal pero no logro interpretar en qué parte.

He estado buscando en la red y en https://stackoverflow.com/questions/25162348/find-the-version-of-a-installed-program-from-batch-file he encontrado, creo, la solución. Prueba con

FOR /f %i in ('wmic datafile where "name='C:\\Program Files (x86)\\Teamviewer\\TeamViewer.exe'" get version^|find "1"') DO (echo ver=%i)

(he puesto echo %i en lugar de set ver=%i pero básicamente es lo mismo)

¡Gracias! Funciona correctamente. Muchas gracias

Hola nuevamente, estoy intentando sobre esto poder realizar lo siguiente

al ejecutar 

FOR /f %i in ('wmic datafile where "name='C:\\Program Files (x86)\\Teamviewer\\TeamViewer.exe'" get version^|find "1"') DO (echo ver=%i)

me da como resultados números con caracteres especiales, en este caso Puntos.

15.2.2756.0

Me gustaría saber de qué manera podría yo omitir esos puntos para que queden solamente los números, es decir 15227560, para poder luego evaluarlos o usarlos en una variable.

Desde ya muchas gracias

Empezaré por decirte que tal vez fuera mejor que abrieras nuevas consultas cada vez que la pregunta sea diferente, sobre todo por facilitarle las cosas a otras personas que busquen algo parecido en el futuro.
Pero no tengo ningún inconveniente en contestarte en este mismo hilo, ya que es aquí donde lo has planteado.

En principio se me ocurren un par de alternativas:

1. Usar lo que la ayuda del comando SET llama "sustitución de variables" y ejemplifica con

set var=%var:str1=str2%

Indicando que en el valor de la variable VAR se sustituye la cadena STR1 por STR2

2. Usar los puntos como separadores en el DELIMS del FOR y luego agrupar los 4 TOKENS.

Voy a desarrollar las dos alternativas en un BAT completo, mejor que en la ejecución directa del comando FOR, por facilidad para mí:

@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%

Excelente! ¡Muchas Gracias!, la verdad que debería abrir un hilo para esto y lo voy a hacer, lo que me recomiendas ahora funciona bien, elimina los puntos, pero en otro hilo te voy a consultar algo, porque, por ej en versiones 15.2.2756, comparando con la versión actual al día de hoy, 15.13.6.0, al hacer las comparativas sin puntos me queda

1522756 versión vieja

151360 versión nueva

Es decir que no podría hacer las comparaciones ya que la versión vieja termina siendo mayor porque los decimales antes determinaban otra cosa.

si me recomiendas que abra otro hilo para esto lo hago de inmediato y la seguimos ahí, no tengo problema

Sí, creo que sería buena idea abrir otro hilo con un asunto algo como "Comparar versiones desde un bat" o algo así. Creo que es un problema que se puede plantear de vez en cuando. Pero hay que tener claros los criterios. Digamos que comparamos la versión a.b.c.d con A.B.C.D habría que tener claro que, por ejemplo:

a.b.c.d > A.B.C.D

Si a>A independientemente de los restantes campos

Si a=A y b>B independientemente de los restantes campos

si a=A, b=B y c>C independientemente de los restantes campos

si a=A, b=B, c=C y d>D independientemente de los restantes campos

En los restantes casos a.b.c.d no es mayor que A.B.C.D.
Esto es un ejemplo, pero el criterio tiene que ser así de nítido.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas