2014-03-12 2 views
7

Ich habe Schwierigkeiten, den Wert eines Registrierungsschlüssels in eine Variable zu lesen. Der Registrierungswert kann Leerzeichen enthalten oder nicht. In diesem Fall versuche ich, SDK-Pfade nachzuschlagen.Lesen eines Registrierungswerts zu einer Stapelvariablen, die Leerzeichen in Wert behandelt

Es ist einfach, den Wert mit reg query zu bekommen, aber es ist in einem bemerkenswert wenig hilfreich Format zurückgegeben:

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\ 

Der Schlüsselname, Schlüsseltyp und Schlüsselwert wird durch eine Reihe von Räumen, nicht Tabulator getrennt.

Sie würden denken, dass Sie so etwas wie verwenden:

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 

... aber wenn der Schlüssel Leerzeichen enthält, wie in diesem Fall das Ergebnis auf der Kommandozeile emittiert wird:

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

Das ist nicht hilfreich. Es scheint keine Platzhaltervariable zu sein, um "Alle Übereinstimmungen" zu sagen. Und man kann nicht einfach schreiben:

DO SET sdkpath=%%L %%M 

... denn wenn es nicht Leerzeichen im Pfad, dass ein wörtliches %M produziert (und würde auch ein Leerzeichen erzeugen).

So. Gibt es eine Möglichkeit, diese einfache Sache in einer Batch-Datei zu tun?

Ich habe die meisten meiner Werkzeuge in Powershell (und einige Perl) geschrieben, aber ich muss eine Batch-Datei für die "einfache" Aufgabe call in das Visual Studio/Windows SDK-Umgebungsskript und dann den Code aufrufen in vernünftigen Sprachen sobald die Umgebung eingerichtet ist.

Sie würden denken, dass nach 10 Jahren von cmd.exe Existenz, und command.com vor es wäre dies einfach. Hilfe?

(Ich kann Perl verwenden und die Win32:: Pakete der Registrierung abgefragt werden, aber es hilft mir, es in einen Stapel var erhalten nicht ...)

Win2k12 verwenden.

Ich habe gelesen:

und viele andere, aber keine handhaben die allgemeinen Fall korrekt einen Wert von einem Schlüssel zu lesen, ohne zu wissen, ob oder nicht es enthält Leerzeichen/wie viele.

Antwort

9

Ah das ist eine der nervigen Details über den for /f Befehl. Um alle Zeichen einschließlich der Leerzeichen mit dem * zu lesen, muss das vorherige Token deklariert werden. tokens=2,* Der Funktionsgrund ist in der Dokumentation angegeben.

Wenn das letzte Zeichen in den Tokens = string ist ein Stern (*), eine weitere Variable zugeordnet und empfängt die restlichen Text in der Zeile nach dem letzten Token, das analysiert wird.

FOR 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 
+2

Wow. Jetzt hasse ich Batch-Dateien mehr denn je. Aber vielen Dank. –

Verwandte Themen