2010-05-05 13 views
5

Tengo un problema de script por lotes de Windows que estoy criticando (sin juego de palabras). El guión problemática se ve así:Cómo establecer la ruta a otro valor de variable con espacios en el archivo de proceso por lotes de Windows

if defined _OLD_VIRTUAL_PATH (
    set PATH=%_OLD_VIRTUAL_PATH% 
) 

Cuando lo ejecuto y _OLD_VIRTUAL_PATH se establece consigo:

\Microsoft was unexpected at this time. 

_OLD_VIRTUAL_PATH es una variable que se estableció originalmente de PATH y contiene espacios - Soy bastante seguro de que ese es el problema. Pero, ¿cuál es la solución? Funciona con éxito si lo encierro entre comillas, pero no creo que se suponga que el valor completo de la variable PATH esté entre comillas.

Respuesta

7

Su problema aquí no son los espacios, sino más bien un paréntesis de cierre. Probablemente esté ejecutando un sistema de 64 bits donde el directorio Archivos de programa para aplicaciones de 32 bits es Program Files (x86). En un bloque entre paréntesis en un archivo por lotes, el paréntesis de cierre finaliza el bloque, por lo que el resto de la línea provoca un error de sintaxis.

Hay dos formas de solucionar este problema:

1) Coloque el argumento completa set entre comillas. Esto hace que los paréntesis de cierre para no ser reconocidos como final de la secuencia:

if defined _OLD_VIRTUAL_PATH (
    set "PATH=%_OLD_VIRTUAL_PATH%" 
) 

2) No utilice un bloque:

if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH% 
+0

Wow - Aprendí 2 cosas hoy ... Estaba seguro de que esta sintaxis explotaría, pero por supuesto, funciona. Sin embargo, no estoy seguro de por qué sería necesario para Evgeny: establecer un PATH con espacios nunca ha sido un problema para mí sin utilizar comillas. ¿Quizás el '_OLD_VIRTUAL_PATH' de Evgeny tenga algún otro carácter especial (que no sea un espacio) que necesite ser citado? –

+2

@Michael: No son los espacios los que son el problema. Reescribí la publicación (espero que a Chris no le importe, puede retroceder si es necesario) y explica qué está mal y por qué. – Joey

+0

Gracias Johannes, había olvidado el motivo, pero eso definitivamente tiene sentido. –

0

Bueno - Nunca supe de la operación defined en secuencias de comandos CMD hasta ahora mismo ...

Su guión parece funcionar bien para mí - qué línea es la que produce exactamente el error?

También puede probar:

if not "%_OLD_VIRTUAL_PATH%" == "" (
    set PATH=%_OLD_VIRTUAL_PATH% 
) 

Y créanme, si viene en Windows Scripting cmd esperaba que fuera algo parecido a lo que tiene en bash, tu cabeza será mucho dolor, muy pronto. Es posible que desee examinar el uso de otro lenguaje de scripting (PowerShell, Python, PERL, cualquier cosa) si el scripting de cmd no es un requisito absoluto. lo más importante (tal vez lo único) que el scripting de cmd tiene a su favor es que ya está instalado en cada caja de Windows.

+0

Hay un operador de "definido" en las extensiones de comando - que los trabajos de líneas DE ACUERDO. Es la línea 'set' que falla. – EMP

+0

el comando set funciona bien para mí, incluso con espacios en '_OLD_VIRTUAL_PATH'. ¿Qué es '_OLD_VIRTUAL_PATH' establecido exactamente? ¿Su script está formateado exactamente como lo tiene en la pregunta (cmd.exe puede ser muy exigente con la sintaxis, y no siempre de forma intuitiva)? –

Cuestiones relacionadas