variable entorno batch-file cmd windows-console

batch file - ¿Cómo configuro una variable de entorno a un valor con espacios en un archivo por lotes?



variable path windows 10 (2)

Simplemente ponga su expresión entre comillas como esta:

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

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

Ahora puede citarlo para realizar su operación:

md "%TargetDir%/NewSubFolder"

No sé cómo describir exactamente lo que trato de hacer, pero he aquí un ejemplo de archivo por lotes que demuestra lo que no puedo entender:

Tengo un archivo por lotes. Dentro de ese archivo por lotes 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 falla en la línea 4 Set TargetDir =... con:

/My was unexpected at this time

Supongo que esto es porque tengo espacios en mi nombre de ruta. Pensé que podría simplemente envolver mi variable con comillas:

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

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

¿Se puede arreglar esto o debería simplemente escribir un VBScript para resolver las cosas?


El problema en cuestión aquí no son 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 piense que el bloque termina prematuramente ( autopromoción desvergonzada ).

Las citas ayudan en este caso porque hacen que el analizador salte sobre toda la parte citada y con razón asumen que el siguiente paréntesis es el que realmente cierra. 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 haces pone exactamente un comando en él?

set sí mismo no necesita ninguna comilla, excepto cuando sus argumentos contienen caracteres especiales como < , > , | , & que la propia cáscara ya maneja. 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 de = en un comando set . Esto hará que se cree una variable de entorno cuyo nombre termine en un espacio y su contenido comience por un espacio. Esto se corrigió parcialmente en Windows 7 creando silenciosamente tanto la variable con el espacio al final como una 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 del = menos que sepa que esto es lo que quiere :-)