Comandos de PowerShell en Batch

brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención   -  
brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención   -

Hola,

No entiendo nada de PowerShell, me limito a usar algunas órdenes en archivos por lotes cuando es más fácil o cuando la opción Batch no existe.

El retorno se realiza sin problema incluso cuando la orden de PowerShell incluye un pipe, como por ejemplo aquí (y donde, por supuesto, la variable %letter% correspondiente a las letras de particiones sucesivas se ha definido previamente).

powershell.exe -command "& { get-volume -DriveLetter %letter% | Format-Table -HideTableHeaders }">>%~dp0_tailledisque.txt 

Por otro lado me falla al intentar integrar esto que funciona perfectamente en la terminal de PowerShell:

[System.IO.DriveInfo]::GetDrives() | Format_Table

Tengo dudas sobre si el intérprete de comandos choca con los corchetes; si quiero probar con un comando ECHO redirigiendo este "texto" a un archivo .txt o .ps1, me falla a menos que los escape:

echo ^[System.IO.DriveInfo^]::GetDrives() ^| Format_Table>>%~dp0test.txt

Pero regreso al principio si lo pongo dentro de las llaves de powershell.exe, es él quien falla con estos caracteres de escape.

No es fundamental, obtenengo la mayor parte de los campos deseados por otro Cmdlet sin "caracteres especiales", pero para resolver este tipo de problema en el futuro, ¿cuál es la sintaxis correcta?


Gracias.

6 respuestas

jee pee Mensajes publicados 9435 Fecha de registro   Estado Moderador Última intervención   9 971
 

Hola,

En Powershell para redirigir la salida, hay que indicar qué flujo se está redirigiendo:

 get-volume -DriveLetter C|Format-Table -HideTableHeaders 1>out.txt

el flujo va de 1 a 6 o * : https://learn.microsoft.com/fr-fr/powershell/module/microsoft.powershell.core/about/about_redirection?view=powershell-7.4

En las dos últimas comandos tienes Format_Table mientras que debería ser Format-Table. Y tal vez el resultado no se considera una tabla ya que es una lista de objetos: valor.


0
brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención   4 148
 

Hola,

Tienes razón, había escrito el guion correctamente en la consola de PowerShell; de lo contrario nunca habría obtenido la respuesta. No sé qué hice al escribir el comando en un Batch kilométrico sin nunca ver el error del guion...

Gracias.

0
brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención   4 148 > brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención  
 

Mientras te tengo y si me permito abusar, ¿por qué el resultado es correcto en PowerShell y no en Batch?

powershell.exe -command "& { Get-CimInstance win32_logicaldisk | where caption -eq "C:" | foreach-object {write " $($_.caption) total $('{0:N2}' -f ($_.Size/1gb)) Go libre $('{0:N2}' -f ($_.FreeSpace/1gb)) Go"} }


 

0
jee pee Mensajes publicados 9435 Fecha de registro   Estado Moderador Última intervención   9 971 > brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención  
 

No sé, a menudo la gestión de CRLF ya no es fácil, y ahora al apilar dos entornos diferentes

0
barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 930
 

Para obtener el mismo resultado en batch, hay que utilizar write-host en lugar de write.


0
brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención   4 148
 

Perfecto, soy una verdadera torpe en muchas cosas, PowerShell incluida.

Solo un detalle si es posible: una vez que haya terminado eso, no tabula:

Tengo un plan B mediante:

powershell.exe -command "& { Get-CimInstance -ClassName Win32_LogicalDisk | Select-Object -Property DeviceID,@{'Name' = 'Total (Go)'; Expression= {[math]::round($_.Size/1GB, 2)}},@{'Name' = 'Libre (Go)'; Expression= {[math]::round($_.FreeSpace/1GB, 2)}} }" 

ahí sí está tabulado, pero ¿hay alguna forma de deshacerse de las líneas de título?


Intenté un montón de otras fórmulas pero o no tabulan, o escriben GB en estilo anglosajón, o me privan de decimales...

Lo sé, siempre se puede hacer aritmética sobre los octetos y tengo una solución funcional pero que me gustaría evitar; es larga como un día sin pan si hay que probar, digamos, 10 To a cientos de Mo para hacer el esfuerzo, ya que hay que limitar la salida a 9 dígitos en cada paso, verificar según la longitud de la cadena original si una misma longitud cruza dos unidades según si los 9 dígitos restantes son o no superiores a 1024^3 y volver a colocar la coma, número de caracteres antes y después en el lugar correcto.

Gracias.

0
jee pee Mensajes publicados 9435 Fecha de registro   Estado Moderador Última intervención   9 971 > brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención  
 

siempre puedes añadir el formato-tabla

 Get-CimInstance -ClassName Win32_LogicalDisk | Select-Object -Property DeviceID,@{'Name' = 'Total (Go)'; Expression= {[math]::round($_.Size/1GB, 2)}},@{'Name' = 'Libre (Go)'; Expression= {[math]::round($_.FreeSpace/1GB, 2)}} | Format-Table -HideTableHeaders
0
brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención   4 148 > jee pee Mensajes publicados 9435 Fecha de registro   Estado Moderador Última intervención  
 
Casi perfecto: en la fórmula base, fui yo quien añadió el rollo tipo "Total (Go)" que reemplazaba al estándar en la fila de títulos. Como ahora lo hemos eliminado, ya no tengo títulos, pero tampoco como en la primera imagen en <6> a qué corresponde cada valor (Total o Libre) y la unidad de medida en cada línea. Cómo debería hacer, si procede, para integrarlos en las "Expression" (tabuladas, por supuesto...)? Gracias.
0
jee pee Mensajes publicados 9435 Fecha de registro   Estado Moderador Última intervención   9 971
 

¿Puedes intentar el carácter de tabulación `t

Get-CimInstance win32_logicaldisk | where caption -eq "C:" | foreach-object {write "`t $($_.caption) total`t $('{0:N2}' -f ($_.Size/1gb)) Go libre`t $('{0:N2}' -f ($_.FreeSpace/1gb)) Go"} 
  C: total 75,00 Go libre 25,32 Go

0
brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención   4 148
 

Gracias por la existencia del carácter de tabulación, es posible que termine por instruirme en PowerShell.

En cuanto a recorrer todos los lectores, para obtener la información relativa a un lector en la misma línea, hay que, como barnabe0057 indicó, reemplazar write por write-host lo que nos da, una vez eliminada la tabulación antes de la letra del lector y movida la de "Libre" después de la palabra "Go" de "Total":
 

Mucho mejor, de lo contrario la diferencia de tamaño de los lectores continúa generando un desfase entre el número y "Go" del que no logro deshacerme.

Obtengo como se indica en la segunda fórmula y la imagen en <6> una tabulación correcta sin las unidades, pero como la fórmula es única para todos los lectores, hay una línea en blanco después y una línea en blanco antes, seguida de dos líneas de títulos.

Se llega a "la buena solución" redirigiendo la salida a un archivo del que se filtran las líneas excedentes y tabulando la salida, pero es una lástima, es menos "elegante" que si se estuviera ante una única fórmula PowerShell en bruto de construcción:
 

@echo off CHCP 65001>NUL powershell.exe -command "& { Get-CimInstance -ClassName Win32_LogicalDisk | Select-Object -Property DeviceID,@{'Name' = 'Total'; Expression= {[math]::round($_.Size/1GB, 2)}},@{'Name' = 'Libre'; Expression= {[math]::round($_.FreeSpace/1GB, 2)}} }">>%~dp0_lect.txt FOR /F "tokens=1-3 skip=3 delims= " %%A IN ('type "%~dp0_lect.txt"') DO ( SET lecteur=%%A SET total=%%B SET libre=%%C CALL :DISPLAY ) GOTO END :DISPLAY echo %lecteur% %total% Go %libre% Go exit /b :END pause del ~dp0_lect.txt
0
barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 930 > brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención  
 

Para alinear los diferentes tamaños no es nada del otro mundo:

@echo off
setlocal enableextensions enabledelayedexpansion
CHCP 65001>NUL
set "pow=Get-CimInstance -ClassName Win32_LogicalDisk | Select-Object -Property DeviceID,@{'Name' = 'Total'; Expression= {[math]::round($_.Size/1GB, 2)}},@{'Name' = 'Libre'; Expression= {[math]::round($_.FreeSpace/1GB, 2)}}"
call :routine pow
pause
exit /b

:routine
FOR /F "tokens=1-3 skip=3 delims= " %%A IN ('powershell.exe -command "& { !%~1! }"') DO (
  SET "lecteur=%%A"
  SET "total= %%B"
  SET "libre= %%C"
  echo. !lecteur! !total:~-10! Go !libre:~-10! Go
)
exit /b

Lo que es más complicado es convertir los Go en To cuando sea necesario.

0
brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención   4 148 > barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención  
 

Es exactamente lo que terminé haciendo en el script en <11> después de tantear un buen rato con PowerShell, con el que estoy enojado, pasando por una rutina CALL porque también estoy enojado con las variables de expansión retardada.

0
jee pee Mensajes publicados 9435 Fecha de registro   Estado Moderador Última intervención   9 971 > brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención  
 

en lo que propone @barnabe0057 lo que parece inicialmente interesante es la propuesta de recortar a la izquierda una variable que permite alinear números de longitudes diferentes, ¿tú precisamente siempre te has centrado en ese alineamiento, no?

SET "total= 10000,00" SET "libre= 555,22" echo. %total:~-10% Go & echo. %libre:~-10% Go 
  10000,00 Go 555,22 Go
0
brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención   4 148 > jee pee Mensajes publicados 9435 Fecha de registro   Estado Moderador Última intervención  
 

Sí, exactamente, miré demasiado rápido y me obsesioné con el alineamiento de las columnas de cifras y de la unidad Go sin desfase en toda la línea según el tamaño.

En <11> mis cifras están alineadas a la izquierda, no es un drama, ahí donde su propuesta es más ortodoxa en alinearlas a la derecha (con solo una anomalía para la tarjeta SD en N: que lee 59,3 en lugar de 59,30 y que, de hecho, debería leer 59,60 (64 Go/1,024^3)-59,60, ya que se trata de una tarjeta en blanco en la que copié un archivo de 1 Ko, sin lo cual algunas órdenes fallan donde el explorador devuelve 59,4-59,22, los misterios de Windows, de hecho sin importancia...).

0
brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención   4 148
 

He encontrado una solución no muy elegante pero que produce la forma deseada: los ps1 se crean con echo desde el batch y luego se redirigen a un primer archivo de texto que, si es necesario, redirijo a un segundo eliminando los títulos y las líneas vacías (la más pesadilla es la que se genera automáticamente al final del archivo y que corresponde al "salto de línea").
 

0
barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 930
 

La présentation rend bien.

Estoy interesado en tu script, ¿lo compartirías?

Yo mismo tengo un antiguo script de este estilo que me gustaría actualizar con el tuyo.

0
brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención   4 148 > barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención  
 

Oye, pero como te dije, es eficaz pero no muy ortodoxo.

https://www.cjoint.com/c/NDbjPBonshF

0
barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 930 > brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención  
 

Gracias por compartirlo.

Lo he adaptado un poco a mi propio estilo: https://pastebin.com/3JUD7WW0

.

Aún me falta fusionarlo con mi propia herramienta para que se convierta en mi futuro cuchillo suizo.

0
brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención   4 148 > barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención  
 

Me lo mostrarás, pero no puedo ver la salsa intermedia, me rechazan con 403 acceso no autorizado.

0
barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 930 > brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención  
 

Aquí está el código:

@echo off Mode con cols=105 lines=40 ::ADVERTENCIA ::LAS PARTICIONES O DISCOS DEBEN TENER UN NOMBRE, NO DEBE HABER ESPACIOS setlocal enableextensions enabledelayedexpansion CHCP 65001 >nul IF NOT "%os%"=="Windows_NT" ( echo Error...OS Inválido... pause exit ) call :module rem powershell.exe -ExecutionPolicy Bypass -File "%~dp0fonctions.psm1" :: ------------------------------------------------------------------------------------------- :: se muestran las infos del sistema :: ------------------------------------------------------------------------------------------- echo. & echo ^[103;91mBúsqueda en curso Ordenador "%COMPUTERNAME%" Por favor espere.... [0m echo. ::Nombre_del_ordenador FOR /F "tokens=2 delims==" %%A in ('wmic os get CSName /value') DO SET "nomPC=%%A" ::Modelo FOR /F "tokens=2 delims==" %%A in ('wmic computersystem get Manufacturer /value') DO SET "manufacturer=%%A" FOR /F "tokens=2 delims==" %%A in ('wmic computersystem get Model /value') DO SET "model=%%A" FOR /F "tokens=2 delims==" %%A in ('wmic bios get SerialNumber /value') DO SET "serialnumber=%%A" ::OS FOR /F "tokens=2 delims==|" %%A in ('wmic os get Name /value') DO SET "osname=%%A" FOR /F %%A in ('wmic os get OSArchitecture ^| find /i "bit"') DO SET "osarchi=%%A" FOR /F "tokens=4" %%A in ('systeminfo ^| find /i "Version" ^| find /v "BIOS"') DO SET "osversion=%%A" FOR /F "tokens=2 delims==" %%A in ('wmic os get ServicePackMajorVersion /value') DO SET "sp=%%A" FOR /F "tokens=3" %%A in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v "DisplayVersion"') DO SET "Version=%%A" ::Nombre del Procesador FOR /F "tokens=2 delims==" %%A in ('wmic cpu get name /value') DO SET "nomproc=%%A" FOR /F "tokens=2 delims==" %%I in ('wmic cpu get numberofcores /value') DO SET "cores=%%I" echo Nombre ordenador: %nomPC% echo Modelo: %manufacturer% %model% echo Tipo de Procesador: %processor_architecture% %nomproc% %cores% núcleo(s) echo Número de Serie: %serialnumber% echo OS: %osname% %osarchi% bits Service Pack %sp% echo Version: %Version% - NT= %osversion% echo Arranque: ^< %FIRMWARE_TYPE% Modo ^> :: ------------------------------------------------------------------------------------------- :: se usan comandos de Powershell :: ------------------------------------------------------------------------------------------- set "pow1=Get-WMIObject win32_ComputerSystem | foreach-object {write-host " Memoria total: $('{0:N2}' -f ($_.TotalPhysicalMemory/1gb)) Go"}" set "pow2=Get-WMIObject Win32_OperatingSystem | Measure-Object -Property FreePhysicalMemory -Sum | %% {[Math]::Round($_.sum/1024/1024, 2)}" set "pow3=Get-PhysicalDisk | Select DeviceID, Size, BusType, MediaType, Model | Format-Table -HideTableHeaders" set "pow4=Get-CimInstance -ClassName Win32_LogicalDisk | Select-Object -Property DeviceID,@{'Name' = 'Total'; Expression= {[math]::round($_.Size/1GB, 2)}},@{'Name' = 'Libre'; Expression= {[math]::round($_.FreeSpace/1GB, 2)}}" call :discos pow3 call :partitions pow4 call :memoire pow1 pow2 del /f /q "%~dp0fonctions.psm1" echo. & pause exit :: ------------------------------------------------------------------------------------------- :: rutina de recuperación de los discos :: ------------------------------------------------------------------------------------------- :discos echo. ECHO ^[104;93mDisco N°, Bus, Tipo, Tamaño, Nombre : [0m FOR /F "tokens=1-4,* delims= " %%A IN ('powershell.exe -command "& { !%~1! }"') DO ( FOR /F "tokens=1,2 delims= " %%H in ('powershell.exe -command "& { Import-Module %~dp0fonctions.psm1; ConversionUnites %%B }"') DO ( call :alignement "%%H" taille set "taille=!taille:~-6! %%I" ) echo %%A %%C %%D !taille! "%%E" ) echo. ECHO ^[104;93mDisques y particiones : [0m FOR /F "delims=" %%A IN ('powershell.exe -command "& { Import-Module %~dp0fonctions.psm1; InfosPartitions }"') do echo %%A | findstr ": ," goto :eof :: ------------------------------------------------------------------------------------------- :: rutina de recuperación de las particiones :: ------------------------------------------------------------------------------------------- :partitions echo. ECHO ^[104;93mOcupación de las particiones : [0m FOR /F "tokens=1-3 skip=3 delims= " %%G IN ('powershell.exe -command "& { !%~1! }"') DO ( SET "lector=%%G" call :alignement "%%H" total call :alignement "%%I" libre echo. !lector! ^>^>^> Total / Libre : !total:~-8! / !libre:~-8! Go ) goto :eof :: ------------------------------------------------------------------------------------------- :: rutina de recuperación de la memoria :: ------------------------------------------------------------------------------------------- :memoire FOR /F "tokens=3 delims=: " %%A IN ('powershell.exe -command "& { !%~1! }"') DO CALL :alignement "%%~A" RamTotal FOR /F "tokens=1" %%A IN ('powershell.exe -command "& { !%~2! }"') DO CALL :alignement "%%~A" RamLibre echo. ECHO ^[104;93mMemoria RAM : [0m echo. Memoria total : %RamTotal:~-7% Go echo. Memoria libre : %RamLibre:~-7% Go goto :eof :: ------------------------------------------------------------------------------------------- :: rutina de alineación de tamaños (recorte a la izquierda) :: ------------------------------------------------------------------------------------------- :alignement echo %~1 | findstr "," >nul && SET "fill=00" || SET "fill=,00" SET "%2= %~1!fill!" FOR /F "tokens=1,2 delims=," %%E IN ('echo !%2!') DO ( SET "Decimale=%%F" SET "%2=%%E,!Decimale:~0,2!" ) goto :eof :: ------------------------------------------------------------------------------------------- :: rutina de generación del módulo "fonctions.psm1" :: ------------------------------------------------------------------------------------------- :module If Exist "%tmp%\cbf0.0.8.f9ece1fa63465a986c041a6f24848309" goto:cbf.f9ece1fa63465a986c041a6f24848309 (Set/p =ZnVuY3Rpb24gQ29udmVyc2lvblVuaXRlcyB7DQoNCiAgICBwYXJhbShbbG9uZ10gJHNpemUpDQoNCiAgICAkdW5pdGUgPSBAKCdLbycsJ01vJywnR28nLCdUbycsJ1BvJykNCiAgICAkaT0tMQ0KDQogICAgRG8gew0KCSAgICAkc2l6ZS89MTAyNA0KCSAgICAkaSsrDQogICAgfSBVbnRpbCAoICRzaXplIC1sdCAxMDAwICkNCg0KICAgICR0YWlsbGU9JHNpemUuVG9TdHJpbmcoIi4wMCIpICsgIiAiDQoNCiAgICByZXR1cm4gJHRhaWxsZSArICR1bml0ZVskaV0NCg0KfQ0KDQoNCmZ1bmN0aW9uIEluZm9zUGFydGl0aW9ucygpIHsNCg0KICAgIEdldC1XbWlPYmplY3QgV2luMzJfRGlza0RyaXZlIHwgRm9yRWFjaC1PYmplY3Qgey ANC iAgICAgICAgJGRpc2sgPSAkXyANCiAgICAgICAgJHBhcnRpdGlvbnMgPSAiQVNTT0NJQVRPUlMgT0YgIiArICJ7V2luMzJfRGlza0RyaXZlLkRldmljZUlEPSckKCRkaXNrLkRldmljZUlEKSd9ICIgKyAiV0hFUkUgQXNzb2NDbGFzcyA9IFdpbjMyX0Rpc2tEcml2ZVRvRGlza1BhcnRpdGlvbiIgDQogICAgDQogICAgICAgIEdldC1XbWlPYmplY3QgLVF1ZXJ5ICRwYXJ0aXRpb25zIHwgRm9yRWFjaC1PYmplY3QgeyANCiAgICAgICAgICAgICRwYXJ0aXRpb24gPSAkXyANCiAgICAgICAgICAgICRkcml2ZXMgPSAiQVNTT0NJQVRPUlMgT0YgIiArICJ7V2luMzJfRGlza1BhcnRpdGlvbi5EZXZpY2VJRD0nJCgkcGFydGl0aW9uLkRldmljZUlEKSd9ICIgKyAiV0hFUkUgQXNzb2NDbGFzcyA9IFdpbjMyX0Rpc2tEcml2ZVRvRGlza1BhcnRpdGlvbiIgDQogICAgDQogICAgICAgICAgICBHZXQtV21pT2JqZWN0IC1RdWVyeSAkZHJpdmVzIHwgRm9yRWFjaC1PYmplY3QgeyANCiAgICAgICAgICAgICAgICBOZXctT2JqZWN0IC1UeXBlIFBTQ3VzdG9tT2JqZWN0IC1Qcm9wZXJ0eSBAeyANCiAgICAgICAgICAgICAgICBEaXNrTW9kZWwgICA9ICRkaXNrLk1vZGVsIA0KICAgICAgICAgICAgICAgIFBhcnRpdGlvbiAgID0gJHBhcnRpdGlvbi5OYW1lIA0KICAgICAgICAgICAgICAgIERyaXZlTGV0dGVyID0gJF8uRGV2aWNlSUQgDQogICAgICAgICAgICAgICAgVm9sdW1lTmFtZSAgPSAkXy5Wb2x1bWVOYW1lIA0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KDQpmdW5jdGlvbiBDaGVja1NpdGUoKSB7DQoNCiAgICBwYXJhbShbc3RyaW5nXSAkdXJsKQ0KDQogICAgdHJ5DQogICAgew0KICAgICAgICAkUmVzcG9uc2UgPSBJbnZva2UtV2ViUmVxdWVzdCAtVXJpICIkdXJsIiAtVXNlQmFzaWNQYXJzaW5nIC1Ta2lwQ2VydGlmaWNhdGVDaGVjaw0KICAgICAgICAkU3RhdHVzQ29kZSA9ICRSZXNwb25zZS5TdGF0dXNDb2RlDQogICAgfSBjYXRjaCB7DQogICAgICAgICRTdGF0dXNDb2RlID0gJF8uRXhjZXB0aW9uLlJlc3BvbnNlLlN0YXR1c0NvZGUudmFsdWVfDQogICAgfQ0KICAgIA0KICAgIGlmIChbc3RyaW5nXTo6SXNOdWxsT3JFbXB0eSgkU3RhdHVzQ29kZSkpIHsNCiAgICAgICAgJFN0YXR1c0NvZGUgPSAiNDA0Ig0KICAgIH0NCiAgICByZXR1cm4gJFN0YXR1c0NvZGUNCn0= )<Nul>"%tmp%\cbf0.0.8.f9ece1fa63465a986c041a6f24848309" :cbf.f9ece1fa63465a986c041a6f24848309 >Nul Certutil -f -decode "%tmp%\cbf0.0.8.f9ece1fa63465a986c041a6f24848309" "%~dp0fonctions.psm1" goto :eof 
0
barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 930
 

Para la licencia de Windows hay esto:

########################################################## # # Get-ProductKey.ps1 # Descripción : obtiene la clave de producto de Windows # # http://www.powershell-scripting.com/ # La comunidad PowerShell francófona # # Uso : PS > ./Get-ProductKey.ps1 ########################################################## # Creación de la tabla de conversión base 24 $map="BCDFGHJKMPQRTVWXY2346789" # Lectura de la clave del registro $value = (get-itemproperty "HKLM:\\SOFTWARE\Microsoft\Windows NT\CurrentVersion").digitalproductid[0x34..0x42] # Conversión de los valores a Hex para mostrar la Key cruda $hexa = "" $value | foreach { $hexa = $_.ToString("X2") + $hexa } Write-Output "Raw Key Big Endian: $hexa" # Cálculo de la Product Key $ProductKey = "" for ($i = 24; $i -ge 0; $i--) { $r = 0 for ($j = 14; $j -ge 0; $j--) { $r = ($r * 256) -bxor $value[$j] $value[$j] = [math]::Floor([double]($r/24)) $r = $r % 24 } $ProductKey = $map[$r] + $ProductKey if (($i % 5) -eq 0 -and $i -ne 0) { $ProductKey = "-" + $ProductKey } } Write-Output "Product Key: $ProductKey" pause

O bien esto:

(Get-WmiObject SoftwareLicensingService).OA3xOriginalProductKey

0
brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención   4 148
 

Soy curioso como una gata.

Los dos scripts de licencia no producen el mismo resultado, tal vez sean ambiguos según si la licencia es OEM o no.

Como yo suponía, ese programa solo devuelve los programas, no las aplicaciones de Windows: por lo tanto no tenemos forma de saber si hubo en el equipo objetivo una misión de servicio público, por ejemplo, al desinstalar Cortana.

Curiosamente, además, me muestra en primer plano varias líneas en blanco y una con un número de versión sin nombre, y se seleccionan los objetos Publisher y InstallDate sin mostrarlos?

Lo que nos volvería a plantear un problema de formato, por ejemplo:
Paquete de controladores de Windows - Dynastream Innovations, Inc. ANT LibUSB Drivers (04/11/2012 1.2.40.201)
movería todo a la derecha debido a su longitud.

0
brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención   4 148 > brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención  
 

Y además solo devuelve los programas instalados en la partición del sistema

0
brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención   4 148 > brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención  
 

Si tu ajustes les informations à Disque N°, Bus,... et les couleurs de titres pour qu’elles soient correctement alignées, ce n’est pas le caractère d’échappement adéquat qui manque, mais peut-être une conséquence délibérée, et on ne peut pas le copier-coller.


On l’obtient soit en le copiant d’un script où il existe déjà, soit en le générant une fois pour toutes:

FOR /F "delims=#" %%E IN ('"prompt #$E# & FOR %%E IN (1) DO REM"') DO SET "ESC=%%E" ECHO %ESC% > esc.txt

soit en allant se servir sur un site approprié, par exemple (Crédits à Michele Locati):

https://gist.githubusercontent.com/mlocati/fdabcaeb8071d5c75a2d51712db24011/raw/b710612d6320df7e146508094e84b92b34c77d48/win10colors.cmd
 

0
barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 930 > brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención  
 

Con respecto al alineamiento de los títulos, lo he dejado de lado, bueno, por el momento.

0
barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 930 > brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención  
 

Con respecto a las aplicaciones de Windows como Cortana, se pueden enumerar de esta forma:

Get-AppxProvisionedPackage -Online | Format-Table DisplayName, Version
0
barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 930
 

Necesito un tester para este mini script que permite exportar los perfiles wifi, brucine ¿estás ahí?

if not exist "%~dp0Profils wifi sur %COMPUTERNAME%" (mkdir "%~dp0Profils wifi sur %COMPUTERNAME%") for /f "skip=1 tokens=2 delims=:" %%A in ('netsh wlan show profiles ^| findstr ":"') do netsh wlan export profile name="%%A" key=clear folder=".\Profils wifi sur %COMPUTERNAME%"

0
brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención   4 148
 

Frances: Retraducir al español.

A partir del texto proporcionado solo se debe entregar la traducción al español, manteniendo el mismo tono y estructura. A continuación se ofrece la traducción fiel al original:

fracasa en un primer intento porque mi adaptador Wi-Fi está desactivado (a propósito): por lo tanto, hay que prever un mensaje de error en este caso.

Solo tengo un adaptador Wi-Fi (físico); aunque hubiese varios (físicos o virtuales) que no se pueden activar todos a la vez y que el script devolverá solo el que esté activado.

Una vez activado, falla una segunda vez porque la sintaxis de findstr devuelve un espacio antes del nombre del adaptador (" SFR_A918_5GHZ"), por lo que la variable debe eliminar el primer carácter en modo, suponiendo que dicha variable se llama wifi
set "wifi=%wifi:~1%".

Cabe mencionar que solo se muestra 5GHZ, supongo que es porque la Box está configurada para esa frecuencia.

En esas condiciones funciona, es una copia del archivo xml, ¿que quieres, la copia o solo su existencia?

0
barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 930 > brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención  
 

Estando en Linux, estoy probando en una VM de Windows 10 que no tiene adaptador wifi, así que estoy ciego en ese aspecto, por eso necesito a alguien que me ayude.

.

El objetivo es guardar los diferentes perfiles de la máquina y poder restaurarlos si es necesario, así que necesito los perfiles en formato XML.

.

Si no es pedir demasiado, ¿podrías corregir mi código para que pueda integrarlo en el script global?

.

Sobre el script, he corregido en la lista de programas las primeras líneas que no daban el nombre del programa así como la versión.

He añadido la lista de las "Windows Apps"

Con respecto al archivo PowerShell, he transformado la función de conversión en un método estático, así que he podido crear una sobrecarga del método. Por ello mi archivo ya no es un archivo psm1 sino ps1.

.

Aquí está en lo que voy:

@echo off ::Modo con cols=105 lines=40 ::ADVERTENCIA ::LAS PARTICIONES O DISCOS DEBEN TENER UN NOMBRE, NO DEBE TENER ESPACIO setlocal enableextensions enabledelayedexpansion CHCP 65001 >nul IF NOT "%os%"=="Windows_NT" ( echo Error...OS inválido... pause exit ) set "tools=%~dp0mytools.ps1" call :PsScript powershell.exe -ExecutionPolicy Bypass -File "%tools%" set "pow0=(Get-WmiObject SoftwareLicensingService).OA3xOriginalProductKey" set "pow1=Get-WMIObject win32_ComputerSystem | foreach-object {write-host " Memoria total: $('{0:N2}' -f ($_.TotalPhysicalMemory/1gb)) Go"}" set "pow2=Get-WMIObject Win32_OperatingSystem | Measure-Object -Property FreePhysicalMemory -Sum | %% {[Math]::Round($_.sum/1024/1024, 2)}" set "pow3=Get-PhysicalDisk | Select DeviceID, Size, BusType, MediaType, Model | Format-Table -HideTableHeaders" set "pow4=Get-CimInstance -ClassName Win32_LogicalDisk | Select-Object -Property DeviceID,@{'Name' = 'Total'; Expression= {[math]::round($_.Size/1GB, 2)}},@{'Name' = 'Libre'; Expression= {[math]::round($_.FreeSpace/1GB, 2)}}" set "pow5=Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | where {$_.DisplayName -notlike ''} | Select-Object DisplayName, DisplayVersion, Publisher | Sort-Object DisplayName | Format-Table -HideTableHeaders" set "pow6=Get-AppxProvisionedPackage -Online | Format-Table DisplayName, Version -HideTableHeaders" set "pow7=Gwmi Win32_LogicalDisk | where {$_.DriveType -ne '5'} | Select-Object -Property DeviceID,@{'Name' = 'Total'; Expression= {[math]::round($_.Size/1GB, 2)}},@{'Name' = 'Libre'; Expression= {[math]::round($_.FreeSpace/1GB, 2)}}" :: ------------------------------------------------------------------------------------------- :: se muestran las infos système :: ------------------------------------------------------------------------------------------- echo. & echo ^[103;91mRecherche en cours Ordinateur "%COMPUTERNAME%" Por favor, espere.... [0m echo. ::Nom_ordinateur FOR /F "tokens=2 delims==" %%A in ('wmic os get CSName /value') DO SET "nomPC=%%A" ::Modèle FOR /F "tokens=2 delims==" %%A in ('wmic computersystem get Manufacturer /value') DO SET "manufacturer=%%A" FOR /F "tokens=2 delims==" %%A in ('wmic computersystem get Model /value') DO SET "model=%%A" FOR /F "tokens=2 delims==" %%A in ('wmic bios get SerialNumber /value') DO SET "serialnumber=%%A" ::OS FOR /F "tokens=2 delims==|" %%A in ('wmic os get Name /value') DO SET "osname=%%A" FOR /F %%A in ('wmic os get OSArchitecture ^| find /i "bit"') DO SET "osarchi=%%A" FOR /F "tokens=4" %%A in ('systeminfo ^| find /i "Version" ^| find /v "BIOS"') DO SET "osversion=%%A" FOR /F "tokens=2 delims==" %%A in ('wmic os get ServicePackMajorVersion /value') DO SET "sp=%%A" FOR /F "tokens=3" %%A in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v "DisplayVersion"') DO SET "Version=%%A" ::Nom Processeur FOR /F "tokens=2 delims==" %%A in ('wmic cpu get name /value') DO SET "nomproc=%%A" FOR /F "tokens=2 delims==" %%I in ('wmic cpu get numberofcores /value') DO SET "cores=%%I" call :licence pow0 echo Nom ordinateur: %nomPC% echo Modèle: %manufacturer% %model% echo Type Processeur: %processor_architecture% %nomproc% %cores% cœur(s) echo Numéro Série: %serialnumber% echo OS: %osname% %osarchi% bits Service Pack %sp% echo Version: %Version% (%osversion%) echo Boot: ^< %FIRMWARE_TYPE% Mode ^> echo Clé produit: %productkey% :: ------------------------------------------------------------------------------------------- :: on utilise des commandes Powershell :: ------------------------------------------------------------------------------------------- call :disques pow3 call :partitions pow7 call :memoire pow1 pow2 call :programmes pow5 pow6 set "profils=Profils wifi sur %COMPUTERNAME%" if not exist "%~dp0%profils%" (mkdir "%~dp0%profils%") for /f "skip=1 tokens=2 delims=:" %%A in ('netsh wlan show profiles ^| findstr ":"') do netsh wlan export profile name="%%A" key=clear folder=".\%profils%" rem del /f /q "%tools%" echo. & pause exit :: ------------------------------------------------------------------------------------------- :: routine de récupération de la licence Windows :: ------------------------------------------------------------------------------------------- :licence FOR /F "tokens=* delims=" %%A IN ('powershell.exe -command "& { !%~1! }"') DO set "productkey=%%A" if not defined productkey (set "productkey=00000-00000-00000-00000-00000") goto :eof :: ------------------------------------------------------------------------------------------- :: routine de récupération des disques :: ------------------------------------------------------------------------------------------- :disques echo. ECHO ^[104;93mDisque N°, Bus, Type, Taille, Nom : [0m FOR /F "tokens=1-4,* delims= " %%A IN ('powershell.exe -command "& { !%~1! }"') DO ( FOR /F "tokens=1,2 delims= " %%H in ('powershell.exe -command "& { Import-Module %tools%; [MyTools]::ConversionUnites(%%B) }"') DO ( set "taille=%%H" set "taille= !taille:~-6! %%I" ) echo. %%A %%C %%D !taille! "%%E" ) echo. ECHO ^[104;93mDisques et partitions : [0m FOR /F "delims=" %%A IN ('powershell.exe -command "& { Import-Module %tools%; InfosPartitions }"') do echo %%A | findstr ": ," goto :eof :: ------------------------------------------------------------------------------------------- :: routine de récupération des partitions :: ------------------------------------------------------------------------------------------- :partitions echo. ECHO ^[104;93mOccupation des partitions : [0m FOR /F "tokens=1-3 skip=3 delims= " %%G IN ('powershell.exe -command "& { !%~1! }"') DO ( SET "lecteur=%%G" SET "total= %%H" SET "libre= %%I" echo. !lecteur! ^>^>^> Total / Libre : !total:~-8! / !libre:~-8! Go ) goto :eof :: ------------------------------------------------------------------------------------------- :: routine de récupération de la taille mémoire :: ------------------------------------------------------------------------------------------- :memoire FOR /F "tokens=3 delims=: " %%A IN ('powershell.exe -command "& { !%~1! }"') DO set "RamTotal= %%~A" FOR /F "tokens=1" %%A IN ('powershell.exe -command "& { !%~2! }"') DO set "RamLibre= %%~A" echo. ECHO ^[104;93mMémoire RAM : [0m echo. Mémoire totale : %RamTotal:~-7% Go echo. Mémoire libre : %RamLibre:~-7% Go goto :eof :programmes echo. ECHO ^[104;93mListe des programmes : [0m FOR /F "tokens=*" %%A IN ('powershell.exe -command "& { !%~1! }"') DO echo.%%A echo. ECHO ^[104;93mListe des "Windows Apps" : [0m FOR /F "tokens=*" %%A IN ('powershell.exe -command "& { !%~2! }"') DO echo.%%A goto :eof :: ------------------------------------------------------------------------------------------- :: routine de génération du script "mytools.ps1" :: ------------------------------------------------------------------------------------------- :PsScript If Exist "%tmp%\cbf0.0.8.26478eb6ed3f0d0e349fbac8e8e701fc" goto:cbf.26478eb6ed3f0d0e349fbac8e8e701fc (Set/p =Q2xhc3MgTXlUb29scyB7DQoNCiAgICBzdGF0aWMgW3N0cmluZ10gQ29udmVyc2lvblVuaXRlcyhbbG9uZ10gJHNpemUpIHsNCg0KICAgICAgICBpZiAoJHNpemUgLWx0IDEwMDApIHsNCiAgICAgICAgICAgIHJldHVybiAkc2l6ZS5Ub1N0cmluZygpICsgIiAiICsgIm9jdGV0cyINCiAgICAgICAgfQ0KDQogICAgICAgIFtkb3VibGVdICR0YWlsbGUgPSAkc2l6ZQ0KICAgICAgICBbYXJyYXldICR1bml0ZSA9IEAoJ0tvJywnTW8nLCdHbycsJ1RvJywnUG8nKQ0KICAgICAgICBbaW50XSAkaSA9IC0xDQoNCiAgICAgICAgRG8gew0KCSAgICAgICAgJHRhaWxsZS89MTAyNA0KCSAgICAgICAgJGkrKw0KICAgICAgICB9IFVudGlsICggJHRhaWxsZSAtbHQgMTAwMCApDQoNCiAgICAgICAgJHRhaWxsZSA9IFttYXRoXTo6Um91bmQoJHRhaWxsZSwyLFtTeXN0ZW0uTWlkcG9pbnRSb3VuZGluZ106OkF3YXlGcm9tWmVybykNCg0KICAgICAgICBbYXJyYXldICR2YWxldXI9JHRhaWxsZS5Ub1N0cmluZygpLlNwbGl0KCIsIikNCg0KICAgICAgICAkZGVjaW1hbGU9KCR2YWxldXJbMV0gKyAiMDAiKS5TdWJzdHJpbmcoMCwyKQ0KICAgIA0KICAgICAgICAkcmVzdWx0YXQ9JHZhbGV1clswXSArICIsIiArICRkZWNpbWFsZSArICIgIiArICR1bml0ZVskaV0NCg0KICAgICAgICByZXR1cm4gJHJlc3VsdGF0DQoNCiAgICB9DQoNCiAgICBzdGF0aWMgW3N0cmluZ10gQ29udmVyc2lvblVuaXRlcyhbbG9uZ10gJHNpemUsW2ludF0gJHByZWNpc2lvbikgew0KDQogICAgICAgIGlmICgkc2l6ZSAtbHQgMTAwMCkgew0KICAgICAgICAgICAgcmV0dXJuICRzaXplLlRvU3RyaW5nKCkgKyAiICIgKyAib2N0ZXRzIg0KICAgICAgICB9DQoNCiAgICAgICAgW2RvdWJsZV0gJHRhaWxsZSA9ICRzaXplDQogICAgICAgIFthcnJheV0gJHVuaXRlID0gQCgnS28nLCdNbycsJ0dvJywnVG8nLCdQbycpDQogICAgICAgIFtpbnRdICRpID0gLTENCg0KICAgICAgICBEbyB7DQoJICAgICAgICAkdGFpbGxlLz0xMDI0DQoJICAgICAgICAkaSsrDQogICAgICAgIH0gVW50aWwgKCAkdGFpbGxlIC1sdCAxMDAwICkNCg0KICAgICAgICBpZiAoJHByZWNpc2lvbiAtZ3QgMTUpIHsgJHByZWNpc2lvbiA9IDE1IH0NCg0KICAgICAgICAkdGFpbGxlID0gW21hdGhdOjpSb3VuZCgkdGFpbGxlLCRwcmVjaXNpb24sW1N5c3RlbS5NaWRwb2ludFJvdW5kaW5nXTo6QXdheUZyb21aZXJvKQ0KDQogICAgICAgIFthcnJheV0gJHZhbGV1cj0kdGFpbGxlLlRvU3RyaW5nKCkuU3BsaXQoIiwiKQ0KDQogICAgICAgICRkZWNpbWFsZT0oJHZhbGV1clsxXSArICIwMDAwMDAwMDAwMDAwMDAwMDAwMCIpLlN1YnN0cmluZygwLCRwcmVjaXNpb24pDQogICAgDQogICAgICAgICRyZXN1bHRhdD0kdmFsZXVyWzBdICsgIiwiICsgJGRlY2ltYWxlICsgIiAiICsgJHVuaXRlWyRpXQ0KDQogICAgICAgIHJldHVybiAkcmVzdWx0YXQNCg0KICAgIH0NCg0KfQ0KDQpmdW5jdGlvbiBJbmZvc1BhcnRpdGlvbnMoKSB7DQoNCiAgICBHZXQtV21pT2JqZWN0IFdpbjMyX0Rpc2tEcml2ZSB8IEZvckVhY2gtT2JqZWN0IHsgDQogICAgICAgICRkaXNrID0gJF8gDQogICAgICAgICRwYXJ0aXRpb25zID0gIkFTU09DSUFUT1JTIE9GICIgKyAie1dpbjMyX0Rpc2tEcml2ZS5EZXZpY2VJRD0nJCgkZGlzay5EZXZpY2VJRCknfSAiICsgIldIRVJFIEFzc29jQ2xhc3MgPSBXaW4zMl9EaXNrRHJpdmVUb0Rpc2tQYXJ0aXRpb24iIA0KICAgIA0KICAgICAgICBHZXQtV21pT2JqZWN0IC1RdWVyeSAkcGFydGl0aW9ucyB8IEZvckVhY2gtT2JqZWN0IHsgDQogICAgICAgICAgICAkcGFydGl0aW9uID0gJF8gDQogICAgICAgICAgICAkZHJpdmVzID0gIkFTU09DSUFUT1JTIE9GICIgKyAie1dpbjMyX0Rpc2tQYXJ0aXRpb24uRGV2aWNlSUQ9JyQoJHBhcnRpdGlvbi5EZXZpY2VJRCknfSAiICsgIldIRVJFIEFzc29jQ2xhc3MgPSBXaW4zMl9Mb2dpY2FsRGlza1RvUGFydGl0aW9uIiANCiAgIA0KICAgICAgICAgICAgR2V0LVdtaU9iamVjdCAtUXVlcnkgJGRyaXZlcyB8IEZvckVhY2gtT2JqZWN0IHsgDQogICAgICAgICAgICAgICAgTmV3LU9iamVjdCAtVHlwZSBQU0N1c3RvbU9iamVjdCAtUHJvcGVydHkgQHsgDQogICAgICAgICAgICAgICAgRGlza01vZGVsICAgPSAkZGlzay5Nb2RlbCANCiAgICAgICAgICAgICAgICBQYXJ0aXRpb24gICA9ICRwYXJ0aXRpb24uTmFtZSANCiAgICAgICAgICAgICAgICBEcml2ZUxldHRlciA9ICRfLkRldmljZUlEIA0KICAgICAgICAgICAgICAgIFZvbHVtZU5hbWUgID0gJF8uVm9sdW1lTmFtZSANCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9 )<Nul>"%tmp%\cbf0.0.8.26478eb6ed3f0d0e349fbac8e8e701fc" :cbf.26478eb6ed3f0d0e349fbac8e8e701fc >Nul Certutil -f -decode "%tmp%\cbf0.0.8.26478eb6ed3f0d0e349fbac8e8e701fc" "%tools%" goto :eof
0
brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención   4 148 > barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención  
 

Es ch..., hay que añadir cada vez los códigos de escape de color que la publicación no retiene.

Siguiendo con el peraflo de la presentación, tienes una línea en blanco después de "Recherche en cours" que no tienes después de las otras secciones.

Como se mencionó anteriormente, la rutina devuelve las aplicaciones de Windows y los programas instalados en la partición del sistema, no los que están, como en mi caso, principalmente instalados en una partición dedicada (F:, no importa); ya no recuerdo si el registro agrupa esa información o si la ruta es propia de cada software, voy a intentar verificarlo.

En el Wifi y como se ilustra arriba, para deshacerse del espacio después de los dos puntos en findstr (en su estado la respuesta es
"El perfil « SFR_A918_5GHZ » no se encuentra en ninguna interfaz.")
y ante la falta de saber hacerlo directamente a nivel de la variable %%A en el bucle FOR, obtengo el resultado mediante:

if not exist "%~dp0Profils wifi sur %COMPUTERNAME%" (mkdir "%~dp0Profils wifi sur %COMPUTERNAME%") for /f "skip=1 tokens=2 delims=:" %%A in ('netsh wlan show profiles ^| findstr ":"') do set wifi=%%A set "wifi=%wifi:~1%" netsh wlan export profile name="%wifi%" key=clear folder=".\Profils wifi sur %COMPUTERNAME%"



 

0
brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención   4 148 > brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención  
 

rectificación, solo es una parte de los programas instalados en F: que no aparecen, sin que ello signifique necesariamente que sean programas autoejecutables; por ejemplo, Microsoft Money y Avidemux se quedan fuera.

También olvidaba, mi tránsito feo por archivos de texto temporales permite a Disco N°... alinear la información, no tu sintaxis.

0
barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 930 > brucine Mensajes publicados 24686 Fecha de registro   Estado Miembro Última intervención  
 

Gracias por el comentario.

En cuanto a la lista de programas, pensé que todo estaba agrupado en:

 HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall

Buscaré si encuentro algo al respecto.

0