2013-04-29 11 views
6

Ho un file batch che legge il valore del registro.Leggere il valore del registro che contiene spazi utilizzando il file batch

Tuttavia la voce che sto leggendo contiene spazi e mi sembra solo di catturare tutto ciò prima del primo carattere di spazio per impostare la mia variabile.

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. 
) 

La voce del Registro di casa in realtà contiene questa stringa: "C: \ Program Files (x86) \ Dir1 \ Dir2" e il file batch cattura solo questo: C: \ Programmi

Qualcuno ha un idea di come risolvere questo?

Grazie

+0

Qual è l'output di 'REG QUERY% KEY_NAME%/v% value_name%'? – user2033427

+0

L'output mi mostra il nome, il tipo e i dati del Registro di sistema (ora in pieno i.e. include l'intera stringa :-)). Come dovrei quindi memorizzare la parte dei dati di esso in una variabile? Thankss! – Yos

risposta

7

Questo problema si verifica perché la stringa contiene spazi e la seconda parte della stringa (possibilmente più parti se ci sono più spazi) vengono trattati come un altro gettone (a 4, 5, ecc) Per fissare questo, passare il resto della linea a %% C con un asterisco simili:

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 
) 

l'asterisco (*) significa passare il resto della linea nella variabile successiva (con tutti gli spazi).

+0

Ah capisco cosa stai dicendo.Questa era la mia preoccupazione in quanto il percorso poteva effettivamente avere molti spazi e quindi aumentare i token ecc. È impossibile da determinare? Grazie mille. Ho cambiato il mio codice e sembra funzionare a meraviglia. Cheers – Yos

+0

Nel mio test, '2 *' provoca la creazione di variabili per ogni elemento separato dallo spazio. Quindi una 'reg query' che restituisce un percorso con spazi produrrà un'% c' e '% d'. Ad esempio: token "FOR/F" = 2,3 * skip = 2 "%% L IN ( \t 'query reg" HKLM \ SOFTWARE \ Microsoft \ Microsoft SDK \ Windows \ v7.1 \ WinSDKTools "/ v InstallationFolder' ) DO echo %% M' restituisce 'C: \ Program'. –

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. 

Dal momento che non ho ...\My Entry come una chiave, ho sostituito una chiave devo.

Primo elemento: poiché i dati richiesti contengono uno spazio e lo spazio è un delimitatore predefinito, è necessario utilizzare 1,2* come token - il primo, il secondo e il resto della linea.

La prossima po 'di difficoltà è che il dato anche contenere ) whic viene interpretata come la parentesi del FOR/f quindi dando un errore di chiusura - nel tuo caso, \Dir1\Dir2 Non si prevede qui

Un modo per superare questo è quello di quotare, quindi rimuovere il valore assegnato a home

Ma ancora una volta, la parentesi di chiusura in home serve a terminare la parte VERO dell'istruzione IF.

accensione sulla presenza/assenza di un valore assegnato alla HOME supera questo. Ovviamente, lo stesso si potrebbe dire per Valuename anche se qui è nascosto un fail-to-fail.

Se la voce del Registro richiesto non viene trovato, allora le SET s nel FOR/f non vengono eseguite, quindi i valori delle tre variabili non vengono modificate da qualsiasi valore che possono avere prima della FOR/f viene eseguita. Pertanto, se home (o valuename se si sceglie di utilizzare tale valore) ha un valore di someexistingvalue prima che i risultati for/f poi imprevisti possono essere presentate.

(BTW - è legittimo e più ordinato, cercando di rompere il for/f a una o entrambe le parentesi della clausola IN)

+0

Wow, che risposta eccezionale e approfondita! Sto usando la soluzione come descritto da user2033427 e sembra funzionare alla grande. Comunque mi hai dato delle cose a cui pensare e bello avere una spiegazione. Il trucco stava aggiungendo il * al comando token. Grazie ragazzi! – Yos

+0

Ciao, dopo aver giocato con entrambi gli esempi sembra che questo mi permettesse di controllare se la variabile home fosse stata assegnata, la soluzione di cui sopra stava generando un errore come hai fatto notare quando cercavi di verificare se la casa era stata definita. Grazie, ho usato questo codice ora che sembra funzionare alla grande. Così ha fatto quanto sopra, a parte ciò che ho appena menzionato! :-) – Yos

Problemi correlati