2011-10-19 10 views

risposta

27

È possibile utilizzare due modi diversi

utilizzare la sintassi estesa di set con le citazioni set "var=content" definiranno var con il contenuto, contenuto è citato caratteri così speciali non sono problematici e utilizza il contenuto fino alla ultima citazione (senza la citazione in sé)

@echo off 
set a=some value with (parentheses) inside 
if 1 == 1 (
    set "PATH=%a%" 
) 

Usa ritardato di espansione (come la risposta di shf301), ma anche trasferire il valore per la portata principale.

@echo off 
setlocal enabledelayedexpansion 
set a=some value with (parentheses) inside 
if 1 == 1 (
    set "localScope_PATH=!a!" 
    rem now transfer it to the global scope 
    FOR /F "delims=" %%A in ("!localScope_PATH!") DO (
     endlocal 
     set "path=%%A" 
    ) 
) 

In questo caso l'esteso set-sintassi non è necessario, ho utilizzato solo per evitare spazi nascosti alla fine linea.

EDIT: Posso combinare questo con enabledelayedexpansion setlocal e l'utilizzo! invece di% a pigro valuta il valore della variabile? Quando ho provato ho ottenuto)! era inaspettato in questo momento.

È possibile, ma è controindicata produttivo, come

@echo off 
Setlocal EnableDelayedExpansion 
set a=some value with (parentheses) inside 
if 1 == 1 (
    set PATH=!a:^)=^^^)! 
    set path 
) 

Allora il vostro percorso contiene CARETS davanti alla ) come C:\programs (x86^)

Per capire come funziona l'espansione si può leggere SO:How does the Windows Command Interpreter (CMD.EXE) parse scripts?

EDIT2: più problemi con il percorso (contenente virgolette)
In base a questo question, può verificarsi un altro problema con la parentesi quando il percorso contiene citazioni.

Esempio
path="C:\Program Files (x86)";C:\Program Files (x86)\Skype

Ciò è consentito, anche se non è necessario usare le virgolette qui, ma questo distrugge l'estesa SET sintassi, come ora set "newPath=%path%" espande a

set "newPath="C:\Program Files (x86)";C:\Program Files (x86)\Skype" 

Ora almeno una parentesi non è tra virgolette ed è in grado di rompere un blocco di comando.

Ma è possibile semplicemente rimuovere tutte le virgolette dalla variabile percorso, come detto, le virgolette non sono necessarie qui.

set "newPath=%path:"=%" 
+0

'set" var = content "' - chi può averlo indovinato? :) –

+0

* In questo caso la sintassi di set estesa non è necessaria * Potresti spiegare? –

+0

Lo preferisco, in quanto evita problemi con gli spazi nascosti alla fine della linea – jeb

2

Usando l'espansione ritardata risolverà che:

@echo off 
setlocal enabledelayedexpansion 
set a=some value with (parentheses) inside 
if 1 == 1 (
    set PATH=!a! 
) 

Senza espansione ritardato il blocco if (dal if alla desinenza ),% a% è sostituita prima e poi il blocco viene analizzato e correre con ritardo. l'espansione! a! non viene espansa dopo che il blocco è stato analizzato, quindi la logica di analisi non vedrà il) in a e non causerà problemi.

+0

Bene, hai modificato la variabile ** local ** 'PATH'. Come hai intenzione di * trasferire * questo valore a livello globale? –

+0

Nella mia risposta è un esempio per trasferire variabili all'ambito globale – jeb

2

Le parentesi e le variabili sono sempre difficili da mescolare. Utilizzare invece una subroutine.

@Echo Off 
Set a=some value with (parentheses) inside 
If 1 == 1 Call :SetPath 
Echo %Path% 
Exit /B 

:SetPath 
Set "Path=%a%" 
SetX "Path" "%a%" 
Exit /B 

ho impostato la variabile due volte, una volta con Set per la corrente sessione di shell, e uno che utilizza SetX per impostarlo a livello di sistema per le sessioni di shell future. Rimuovi entrambi se non sono necessari.

4

Il ) in %a% è il problema qui. Puoi semplicemente fare qualche sostituzione per sfuggire allo ).

@echo off 
set a=some value with (parentheses) inside 
if 1 == 1 (
    set PATH=%a:)=^)% 
) 
+0

Posso combinarlo con 'setlocal EnableDelayedExpansion' e usare'! 'Invece di'% 'per pigro valutare il valore della variabile? Quando ho provato ho ottenuto ')! era inaspettato in questo momento. errore. –

+0

Puoi combinarlo, ma non è necessario in quanto l'espansione ritardata è sicura contro qualsiasi carattere speciale, anche ')' – jeb

+0

Io userei l'espansione ritardata o il mio metodo, non entrambi. Solo un'opinione –

Problemi correlati