Obtenir le nom du produit de WMIC pour une variable par lot

J’ai eu du mal à obtenir une sortie spécifique en utilisant WMIC en batch afin de créer un script de désinstallation automatique. Le problème que je rencontre est que le programme de désinstallation de l’application que je tente de supprimer est créé sous un SSID généré automatiquement sur chaque système (ex: C: \ ProgramData {07BFF8FA-C12F-46C7-8239-8EE83E21B5DA} \ nom de programme \ Uninstall.exe). De ce fait, je ne peux pas créer un emplacement de désinstallation statique basé sur le registre car la chaîne de désinstallation est également sous le même SSID dans le registre.

J’ai essayé différentes méthodes pour extraire les informations de désinstallation et le seul que j’ai trouvé est celui qui utilise WMIC:

wmic product where "Name like '%product name%'" get name 

qui produit:

 Name  

^ et un retour de chariot supplémentaire, et ce retour de chariot est le problème. Il définit la variable, puis l’efface.

Voici la boucle que j’essaie d’utiliser pour que cela fonctionne:

 @echo off for /f "skip=1 delims==" %%a in ( 'wmic product where "Name like '%product-name%' get name' ) do set PROD=%%a echo %PROD% 

qui produit:

 C:\Users\Administrator>ECHO is off. 

ce qui signifie que la variable% PROD% n’est pas définie du tout.

Si je lance le lot avec @echo ON, j’obtiens ceci:

 :\Users\Administrator>echo   :\Users\Administrator>echo ECHO is on. 

Notez que la sortie manque la lettre de lecteur. C’est exactement ce que je vois, donc c’est bizarre, et le paramètre est en cours de définition, écho alors non défini.

J’ai également essayé de le faire via un relais de fichier texte:

 wmic /OUTPUT:%~dp0\wmic.txt product where "Name like '%product-name%'" get name for /f %%a in ( "%~dp0\wmic.txt" | findstr /v "product-name" ) do set PROD=%%a 

Toute aide / conseil serait le bienvenu!


METTRE À JOUR!

lien suivant fourni par npocmaka, je suis venu avec ceci:

 for /f "skip=1 delims=" %a in ('wmic product where "Name like '%product-name%'" get name') do @for /f "delims=" %b in ("%a") do @echo %b 

qui génère correctement le nom du produit

Cependant, quand je l’exécute par lots en tant que:

 for /f "skip=1 delims=" %%a in ( 'wmic product where "Name like '%product-name%'" get name' ) do @for /f "delims=" %%b in ("%%a") do echo %%b 

Je reçois à la place:

 No Instance(s) Available. 

Ce qui me semble être un problème de WMIC avec la syntaxe ou quelque chose


RESOLU!

Crédit à npocmaka pour avoir suggéré une boucle FOR nestede et indiv pour indiquer la logique d’échappement pour la variable WMIC

La syntaxe correcte de la commande utilisée dans le lot:

 for /f "skip=1 delims=" %%a in ( 'wmic product where "Name like '%%product-name%%'" get name' ) do @for /f "delims=" %%b in ("%%a") do @echo %%b 

Merci beaucoup les gars!

EDIT .Donne que % est nécessaire pour être utilisé comme joker

 @echo off for /f "skip=1 delims==" %%a in ( 'wmic product where "Name like '%%product-name%%'" get name /format:table' ) do ( for /f "tokens=* delims=" %%# in ("%%a") do set PROD=%%a ) echo %PROD% 

c’est expliqué ici