Cómo escapar de las variables entre paréntesis dentro de si-cláusula en un archivo por lotes?

Ejecutar este archivo de proceso por lotes

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

da inside was unexpected at this time. error.

Cómo escapar a variable para evitar este error?

4 Kommentare

  1. 28

    Puede utilizar de dos maneras diferentes

    El uso de la sintaxis extendida de set con citas set "var=content" se establece var con el contenido,
    el contenido es citado para caracteres especiales no son problemáticos y se utiliza el contenido hasta la última cita (sin cita)

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

    Uso expansión retardada (como la respuesta de shf301), sino también transferir el valor para 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, el conjunto ampliado de la sintaxis no es necesario, yo lo he utilizado sólo para evitar los espacios ocultos, en el extremo de la línea.

    EDICIÓN:
    Puedo combinar esto con setlocal EnableDelayedExpansion y de usar ! en lugar de % a perezoso evaluar el valor de la variable? Cuando traté tengo )! 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
    )
    

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

    Para entender cómo las obras de ampliación se puede leer ASÍ que: ¿Cómo funciona el Intérprete de Comandos de Windows (CMD.EXE) analizar secuencias de comandos?

    EDIT2: Más problemas con la ruta de acceso (con comillas)

    De acuerdo a este pregunta puede que ocurra otro problema con el paréntesis cuando la ruta de acceso contiene citas.

    Muestra

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

    Esto está permitido, incluso no es necesario utilizar comillas aquí, pero esto destruye la extendida SET sintaxis, 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 las comillas y es capaz de romper un bloque de comandos.

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

    set "newPath=%path:"=%"
    
    • set "var=content" – ¿quién podría haber adivinado? 🙂
    • En este caso el conjunto ampliado de la sintaxis no es necesario Podría Usted explicar?
    • Yo lo prefiero, como evitar problemas con los espacios ocultos, en el extremo de la línea
    • Me estaba preguntando por qué no es necesario no lo fue la razón por la Que utilizó 🙂
    • por cierto, ¿podría de alguna manera en contacto con Usted?
    • Tratar de explicar No2: no es necesario, ya que el delaye de expansión es seguro en contra de caracteres especiales. He utilizado aquí sólo para mostrar cómo muchos de los símbolos de intercalación que se necesita.
    • El contacto es posible a través de PM en dostips.com
    • Me pasé varias horas tratando de reemplazar ) con ^) en la variable antes de encontrar su ayuda sólo para el uso conjunto de «var=contenido» en lugar de los reemplazos. Gracias!
    • Protector de la vida, gracias.

  2. 5

    La ) en %a% es el problema aquí. Usted puede hacer algo de sustitución para escapar de la ).

    @echo off
    set a=some value with (parentheses) inside
    if 1 == 1 (
        set PATH=%a:)=^)%
    )
    
    • Puedo combinar esto con setlocal EnableDelayedExpansion y el uso de ! en lugar de % perezoso para evaluar el valor de la variable? Cuando traté tengo )! was unexpected at this time. de error.
    • Se puede combinar, pero no es necesario como el retraso de la expansión es seguro contra todos los caracteres especiales, también )
    • Me gustaría utilizar cualquiera de expansión retardada o mi método, no tanto. Sólo una opinión.
  3. 3

    El uso de retraso expansión de la revisión que:

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

    Sin expansión retardada si el bloque (de la if a la conclusión ), %a% es reemplazada primero y, a continuación, el bloque se analiza y se ejecuta. Con el retraso de la expansión !una! no se expandió después de que el bloque se analiza. Así que la lógica de análisis de no ver la ) en a y no causan problemas.

    • Bueno, modificado local PATH variable. ¿Cómo vas a la transferencia de este valor de ámbito global?
    • En mi respuesta es un ejemplo de la transferencia de las variables de ámbito global
  4. 3

    Soportes y las variables siempre son un dolor a la mezcla. El uso de 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
    

    Me puse la variable dos veces, una vez con Conjunto para la sesión actual de la shell, y en uno con SetX para establecer todo el sistema para el futuro de shell de sesiones. Quite si son innecesarios.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea