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 Comentarios

  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.

Dejar respuesta

Please enter your comment!
Please enter your name here