2013-04-29 5 views
6

Ich habe eine Batch-Datei, die den Registrierungswert liest.Lesen Sie den Registrierungswert, der Leerzeichen enthält mit Batch-Datei

Allerdings enthält der Eintrag, den ich lese, Leerzeichen und ich scheine nur alles vor dem ersten Leerzeichen zu erfassen, wenn ich meine Variable einstelle.

set KEY_NAME="HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\My Entry" 
set VALUE_NAME=Home 

FOR /F "usebackq skip=2 tokens=1-3" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
    set ValueName=%%A 
    set ValueType=%%B 
    set Home=%%C 
) 

if defined ValueName (
    @echo Home = %Home% 
) else (
    @echo %KEY_NAME%\%VALUE_NAME% not found. 
) 

Der Heimat-Registrierungseintrag enthält tatsächlich diese Zeichenfolge: "C: \ Program Files (x86) \ Dir1 \ Dir2" und die Batch-Datei nur fängt diese: C: \ Program

Hat ein jemand hat Idee, wie das zu beheben ist?

Dank

+0

Was ist die Ausgabe von 'REG QUERY% KEY_NAME%/v% value_name%'? – user2033427

+0

Die Ausgabe zeigt mir die Registrierung Name, Typ und Daten (Jetzt in voller, d. H. Enthält die ganze Zeichenfolge :-)). Wie würde ich dann den Datenteil davon in einer Variablen speichern? Danke! – Yos

Antwort

7

Dieses Problem tritt auf, weil die Zeichenfolge Leerzeichen enthält und den zweiten Teil des Strings (möglicherweise mehr Teile, wenn es mehr Räume sind) werden als ein weiteres Token behandelt (in 4, 5, etc.) zu beheben Dies, um den Rest des Zeilendurchlauf C mit einem Sterne so %%:

FOR /F "usebackq skip=2 tokens=1,2*" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
    set ValueName=%%A 
    set ValueType=%%B 
    set Home=%%C 
) 

der Stern (*) bedeutet den Rest der Zeile in die nächste Variable (mit allen Räumen) zu übergeben.

+0

Ah ich sehe was du sagst.Das war meine Sorge, da der Weg tatsächlich viele Räume haben könnte und daher steigende Token etc. unmöglich zu bestimmen sind? Ich danke dir sehr. Ich habe meinen Code geändert und es scheint ein Vergnügen zu sein. Prost – Yos

+0

In meiner Prüfung bewirkt '2 *', dass Variablen für jedes durch Leerzeichen getrennte Element erzeugt werden. Eine 'reg query', die einen Pfad mit Leerzeichen zurückgibt, erzeugt also '% c' und '% d'. ZB: 'FOR/F" Tokens = 2,3 * Überspringen = 2 "%% L IN ( \t 'reg Anfrage" HKLM \ SOFTWARE \ Microsoft \ Microsoft SDKs \ Windows \ v7.1 \ WinSDKTools "/ v Installationsordner' ) DO echo %% M' gibt 'C: \ Program' zurück. –

4
@ECHO OFF 
SETLOCAL 
set KEY_NAME="HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\My Entry" 
set KEY_NAME="HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Space Sciences Laboratory, U.C. Berkeley\BOINC Setup" 
set VALUE_NAME=migrationdir 

FOR /F "usebackq skip=2 tokens=1,2*" %%A IN (
`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
    set "ValueName=%%A" 
    set "ValueType=%%B" 
    set Home="%%C" 
) 

IF DEFINED home SET home=%home:"=% 
if defined Home echo Home = %Home% 
if NOT defined Home echo %KEY_NAME%\%VALUE_NAME% not found. 

Da ich nicht ...\My Entry als Schlüssel verfügen, habe ich einen Schlüssel ersetzt habe ich.

Erstes Element - Da die erforderlichen Daten ein Leerzeichen enthalten und Leerzeichen ein Standardtrennzeichen ist, müssen Sie 1,2* als Token verwenden - den ersten, zweiten und Rest der Zeile.

Die nächste kleine Schwierigkeit besteht darin, dass das Datenelement AUCH ) enthält Zugstrecke als die schließende Klammer der FOR/f daher einen Fehler gibt interpretiert wird - in Ihrem Fall \Dir1\Dir2 hier nicht

erwartet

Ein Weg, dies zu überwinden ist, Zitat, dann die zu home

Aber noch einmal zugewiesenen Wert Streifen, die Schließ Klammer in home dient den TRUE Teil der IF-Anweisung zu beenden.

Das Einschalten der Anwesenheit/Abwesenheit eines Wertes, der HOME zugewiesen ist, überwindet dies. Offensichtlich könnte das gleiche für Valuename gesagt werden, obwohl es hier einen versteckten Fail-to-Fail gibt.

Wenn der angeforderte Registrierungseintrag nicht gefunden wird, dann wird die SET s im FOR/f nicht durchgeführt werden, damit die Werte der drei Variablen werden nicht von jedem Wert geändert sie haben können, bevor die FOR/f ausgeführt wird. Wenn daher home (oder valuename, wenn Sie diesen Wert verwenden) einen Wert von someexistingvalue vor dem for/f hat, dann können unerwartete Ergebnisse angezeigt werden.

(BTW - es ist legitim und sauberere schau die for/f an einem oder beiden der Klammern der IN Klausel zu brechen)

+0

Wow, was für eine großartige und gründliche Antwort! Ich benutze die Lösung wie von user2033427 beschrieben und es scheint gut zu funktionieren. Wie auch immer, Sie haben mir ein paar Dinge gegeben, über die ich nachdenken konnte, und es war gut, eine Erklärung zu haben. Der Trick bestand darin, dem Token-Befehl das * hinzuzufügen. Danke Leute! – Yos

+0

Hallo, nachdem ich mit beiden Beispielen herumgespielt habe, scheint mir dieser zu überprüfen, ob die Home-Variable zugewiesen wurde. Die obige Lösung warf einen Fehler auf, als Sie darauf hinwiesen, ob Home definiert wurde. Danke, dass ich diesen Code jetzt benutzt habe, da er großartig zu funktionieren scheint. Auch das oben Gesagte abgesehen von dem, was ich gerade erwähnt habe! :-) – Yos