2009-11-07 17 views
6

No sé cómo describir exactamente lo que estoy tratando de hacer, pero aquí hay un ejemplo de archivo por lotes que demuestra lo que no puedo entender .:¿Cómo configuro una variable de entorno a un valor con espacios en un archivo por lotes?

Tengo un archivo por lotes. Dentro de ese archivo por lotes que estoy tratando de crear un directorio:

Set CopyFrom = %~dp0 

if Exist "%ProgramFiles(x86)" (
    Set TargetDir = %ProgramFiles(x86)%\My Directory Name has spaces 
) 

md %TargetDir%\NewSubFolder 
copy %CopyFrom%\SourceFile.zip %TargetDir%\NewSubFolder 

Mi archivo por lotes está fallando en la línea 4 con Set TargetDir =...:

\My was unexpected at this time 

Asumo esto es porque tengo los espacios en mi nombre de ruta Pensé que sólo podía envolver mi variables con citas:

Set TargetDir = "%ProgramFiles(x86)%\My Directory Name has spaces" 

Pero luego cuando llegue a la línea que crea el directorio falla porque %TargetDir% está ahora envuelto entre comillas. md "%TargetDir%"\NewSubFolder

¿Se puede arreglar esto o simplemente debo escribir un VBScript para resolver las cosas?

Respuesta

6

acaba de poner su expresión entre comillas así:

C:\>Set "TargetDir=%ProgramFiles%\My Directory Name has spaces" 
C:\>echo %TargetDir% 
C:\Program Files\My Directory Name has spaces 

Nota: Se ampliará la variable dentro de las comillas, y si también tiene espacios, que tendrá que ser citado.

Ahora se puede citar que para llevar a cabo su operación:

md "%TargetDir%\NewSubFolder" 
+0

Gracias, eso fue solo el boleto, muy apreciado. – BobTheBuilder

+0

Nunca se me ocurrió que podía envolver todo el artículo después de Poner entre comillas ... por supuesto, ¿no es exactamente intuitivo? – BobTheBuilder

+0

No, no es intuitivo. (No mucho sobre la línea de comandos de Windows es - por eso cambié a powershell). Lo pienso así: ambos lados de "=" son un único argumento para el comando set. – zdan

2

El problema en cuestión aquí son no los espacios como otros sugirieron, sino más bien el paréntesis de cierre en la variable de entorno ProgramFiles(x86) Esto hace que el analizador pensar que el bloque termina prematuramente (shameless self-promotion).

Cotizaciones do ayuda en este caso porque hacen que el analizador salte sobre toda la parte citada y con razón asume que el siguiente paréntesis es el cierre real. pero la solución podría ser mucho más fácil que eso:

if Exist "%ProgramFiles(x86)%" Set TargetDir=%ProgramFiles(x86)%\My Directory Name has spaces 

¿Por qué usar un bloque entre paréntesis en absoluto si todo lo que hacen es poner exactamente un comando en él?

set sí mismo no necesita ningún cotizaciones, excepto cuando sus argumentos no contienen caracteres especiales como <, >, |, & el que el depósito propiamente maneja aready. No es una panacea, sin embargo, hace que manejar la entrada del usuario o el contenido del archivo sea un dolor a veces.

Además, nunca coloque espacios alrededor del = en un comando set. Esto causará que se cree una variable de entorno con su nombre que termina en un espacio y su contenido comienza con un espacio.Esto se corrigió parcialmente en Windows 7 mediante la creación de silencio tanto la variable con el espacio al final y otro sin:

> set foo = bar 
> set foo 
foo=bar 
foo = bar 

Pero en versiones anteriores de Windows esto no sucedió así que nunca use espacios alrededor de la = menos usted sabe que esto es lo que quiere :-)

Cuestiones relacionadas