2009-01-10 19 views
7

Algunos archivos por lotes en Windows utilizan una sintaxis IF con múltiples líneas, como a continuación:archivos por lotes, Vista x64, si y el paréntesis

if var==rule (
    some comands 
) else (
    else commands 
) 

Ahora, Windows Vista x64 decidieron poner los 32 archivos de bits en "C : \ Archivos de programa (x86) ". Desafortunadamente, cada vez que utiliza una variable de entorno (como PATH) dentro de una línea múltiple IF sin comillas, el paréntesis dentro del valor de la variable confunde IF, cancelando el archivo por lotes. Por ejemplo:

if "%OS%"=="Windows_NT" (
    @setlocal 
    call :set_home 
    set _ARGS=%* 
) else (
    set _SCALA_HOME=%SCALA_HOME% 
    rem The following line tests SCALA_HOME instead of _SCALA_HOME, because 
    rem the above change to _SCALA_HOME is not visible within this block. 
    if "%SCALA_HOME%"=="" goto error1 
    call :set_args 
) 

Un archivo por lotes con esta fallará a pesar de que la línea donde aparece% SCALA_HOME% no se ejecuta. Esto es bastante molesto ¿Existe alguna solucion para esto?

Respuesta

9

Cambiar todas las instancias de %SCALA_HOME%-!SCALA_HOME!, y añadir la siguiente cerca de la parte superior del archivo:

setlocal enableextensions enabledelayedexpansion 

Las últimas vueltas en "retraso en la expansión de variables", lo que significa que las variables escritas en forma !VAR! son no expandido hasta que se usen, en lugar de cuando se analiza la declaración en sí. (En mi experiencia limitada, y ciertamente en este caso, esto significa que las expansiones variables tienen menos probabilidades de ser malinterpretadas como construcciones de sintaxis reales de archivo por lotes.) Gracias a Patrick Cuff por señalar esta mejor manera de hacerlo en un comentario.

P.S .: Como está descubriendo, el lenguaje de archivos por lotes cmd.exe es horriblemente roto de muchas maneras. Si no puede usar un lenguaje de scripting genuino (por ejemplo, si su tarea necesita ser realizada en otras computadoras), seriamente recomendaría noquear un "script" rápido de C/C++ que hace el trabajo, y compilarlo en .EXE.

+1

Si la expansión demorada resuelve este problema, no necesitaría una segunda secuencia de comandos por lotes, simplemente coloque 'setlocal enableextensions enabledelayedexpansion' en la parte superior de la secuencia de comandos. –

+0

¡No lo sabía, gracias Patrick! Mucho más bonito. –

+0

Intentaré usar setlocal enableextensions enabledelayedexpasion. Si funciona, necesitaré otra respuesta para establecer como aceptada. –

Cuestiones relacionadas