¿Cómo se configura una variable de entorno a un valor con espacios en un archivo por lotes?

StackOverflow https://stackoverflow.com/questions/1694437

  •  18-09-2019
  •  | 
  •  

Pregunta

No sé cómo describir exactamente lo que estoy tratando de hacer, pero aquí hay un archivo por lotes ejemplo que demuestra lo que no puedo averiguar:.

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 Set TargetDir =... con:

\My was unexpected at this time

Estoy asumiendo que esto es porque tengo los espacios en mi nombre de ruta. Pensé que sólo podía envolver mi variable, con comillas:

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á envuelto entre comillas. md "%TargetDir%"\NewSubFolder

Puede esto ser fijo o debería simplemente escribir un VBScript para arreglar las cosas?

¿Fue útil?

Solución

Sólo hay que poner su expresión entre comillas como esto:

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"

Otros consejos

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

DO ayuda en este caso, porque hacen el salto analizador citado por toda la pieza y con razón, asumen el siguiente paréntesis se cierre real de uno. 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é utilizar 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, aunque lo que hace que el manejo de los contenidos de entrada del usuario o del archivo correctamente un dolor a veces.

También, por favor nunca ponga espacios alrededor de la = en un comando set. Esto hará que una variable de entorno que se creará con su Nombre que termina en un espacio y su contenido a partir de un espacio. Esto se corrigió parcialmente en Windows 7 mediante la creación de silencio tanto la variable con el espacio en el extremo y otro sin:

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

Sin embargo, en las versiones anteriores de Windows esto no sucedió así que nunca utilice espacios alrededor de la = a menos que sepa que esto es lo que quiere: -)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top