2011-10-19 13 views

Respuesta

27

Se pueden utilizar dos formas diferentes

utilizar la sintaxis extendida de set con citas set "var=content" marcarán var con el contenido, contenidos se cita personajes tan especiales no son problemáticos y utiliza el contenido hasta el última cita (sin la cita en sí)

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

uso retrasó la expansión (como la respuesta de shf301), sino también transferir el valor en el ámbito principal.

@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" 
    ) 
) 

En este caso, la configuración de sintaxis extendida no es necesario, que la usaban sólo para evitar espacios ocultos en el extremo de la línea.

EDIT: ¿Puedo combinar esto con EnableDelayedExpansion setlocal y usar! en lugar de% a perezoso evaluar el valor de la variable? ¡Cuando lo intenté, lo conseguí! fue inesperado en este momento.

Puede, pero es contra productivo, como

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

Luego, su ruta contiene símbolos de intercalación en frente de la ) como C:\programs (x86^)

Para entender cómo funciona la expansión se puede leer SO:How does the Windows Command Interpreter (CMD.EXE) parse scripts?

EDIT2: Más problemas con la ruta (que contiene comillas)
Según este question puede aparecer otro problema con paréntesis cuando la ruta contiene comillas.

la muestra está permitido
path="C:\Program Files (x86)";C:\Program Files (x86)\Skype

Esto, a pesar que no es necesario el uso de comillas aquí, pero esto destruye la sintaxis extendida SET, como ahora set "newPath=%path%" se expande a

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

Ahora al menos un paréntesis no está dentro de comillas y es capaz de romper un bloque de comandos.

Pero simplemente puede eliminar todas las comillas de la variable de ruta, como se dijo, las comillas no son necesarias aquí.

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

'set" var = content "' - ¿Quién podría haberlo adivinado? :) –

+0

* En este caso, la sintaxis establecida no es necesaria * ¿Podría explicarlo? –

+0

Lo prefiero, ya que evita problemas con espacios ocultos en el extremo de la línea – jeb

2

Uso de expansión retardada fijará que:

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

Sin expansión retardada el si el bloque (de la if a la ) fin,% a% se sustituye primero y luego se analiza el bloque y correr con retraso. la expansión! a! no se expande después de analizar el bloque. Por lo tanto, la lógica de análisis no verá el) en a y no causará problemas.

+0

Bueno, modificó la variable ** local ** 'PATH'. ¿Cómo vas a * transferir * este valor al alcance global? –

+0

En mi respuesta hay una muestra para transferir variables al alcance global – jeb

2

Los corchetes y las variables son siempre difíciles de mezclar. Use una subrutina en su lugar.

@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 

que establecer la variable dos veces, una vez usando Set para la sesión de shell actual, y el otro con SetX para configurarlo de todo el sistema para sesiones futuras de concha. Eliminar cualquiera si no son necesarios.

4

El ) en %a% es el problema aquí. Puedes hacer una sustitución para escapar del ).

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

¿Puedo combinar esto con 'setLocal EnableDelayedExpansion' y usar'! 'En lugar de'% 'para evaluar el valor de la variable lazy? ¡Cuando lo intenté, obtuve ')! fue inesperado en este momento. error. –

+0

Puede combinarlo, pero no es necesario, ya que la expansión retrasada es segura contra cualquier carácter especial, también ')' – jeb

+0

Usaría la expansión retrasada o mi método, no ambos. Solo una opinion –

Cuestiones relacionadas