Lecture d’une valeur de registre dans une variable de traitement par lots, gestion des espaces en valeur

J’ai du mal à lire la valeur d’une clé de registre dans une variable. La valeur de registre peut ou non contenir des espaces. Dans ce cas, j’essaie de rechercher les chemins SDK.

Il est facile d’obtenir la valeur avec reg query , mais elle est retournée dans un format remarquablement inutile:

 C:\Users\Administrator\Desktop>reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1\WinSDKTools" /v InstallationFolder HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1\WinSDKTools InstallationFolder REG_SZ C:\Program Files\Microsoft SDKs\Windows\v7.1\bin\ 

Le nom de la clé, le type de clé et la valeur de la clé sont séparés par une série d’espaces et non par des tabulations.

Vous pensez que vous pourriez utiliser quelque chose comme:

 FOR /F "usebackq tokens=3* skip=2" %%L IN ( `reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1\WinSDKTools" /v InstallationFolder` ) DO SET sdkpath=%%L 

… mais si la clé contient des espaces, comme dans ce cas, le résultat émis sur la ligne de commande est le suivant:

 C:\Users\Administrator\Desktop>SET sdkpath=C:\Program 

Ce qui n’est pas utile. Il ne semble pas y avoir de variable générique pour dire “Toutes les correspondances”. Et vous ne pouvez pas simplement écrire:

 DO SET sdkpath=%%L %%M 

… car s’il n’y a pas d’ espaces dans le chemin, cela produira un littéral %M (et produira également un espace de fin).

Alors. Est-il possible de faire cette chose simple dans un fichier de commandes?

J’ai écrit la plupart de mes outils dans Powershell (et certains Perl), mais je dois utiliser un fichier de commandes pour la “simple” tâche d’ call le script d’environnement Visual Studio / Windows SDK, puis d’appeler le code dans des langages sains une fois l’environnement est mis en place.

Vous pensez qu’après 10 ans d’existence de cmd.exe et command.com avant cela, ce serait facile. Aidez-moi?

(Je peux utiliser les paquets Perl et Win32:: pour interroger le registre, mais cela ne m’aide pas à le mettre dans un lot var …)

Utiliser Win2k12.

J’ai lu:

  • Lire la valeur de Registre qui contient des espaces à l’aide d’un fichier de commandes
  • Script shell lecture registre de windows

et beaucoup d’autres, mais aucun ne gère le cas général de lire correctement une valeur d’une clé sans savoir si elle contient ou non des espaces / combien.

Ah c’est l’un des détails ennuyeux sur la commande for /f . Pour lire tous les caractères, y compris les espaces avec le * le jeton précédent doit être déclaré. tokens=2,* La raison fonctionnelle est indiquée dans la documentation.

Si le dernier caractère de la chaîne = est un astérisque (*), une variable supplémentaire est allouée et reçoit le texte restant sur la ligne après le dernier jeton analysé.

POUR la documentation

 FOR /F "usebackq tokens=2,* skip=2" %%L IN ( `reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1\WinSDKTools" /v InstallationFolder` ) DO SET sdkpath=%%M