Establecer una variable de ruta con espacios en la ruta en un archivo .cmd o archivo por lotes de Windows

112

Soy nuevo en la escritura de guiones y no puedo hacer que este funcione. Podría si moviera los archivos a una ruta sin un espacio, pero me gustaría que funcionara con el espacio si pudiera.

Quiero extraer un montón de actualizaciones de Office a una carpeta con un archivo .cmd. Para que el archivo por lotes se pueda usar en cualquier computadora, establezco una variable de ruta que solo tengo que cambiar en un lugar para ejecutarla en otra máquina. El problema es que el camino tiene un espacio. Si pongo comillas alrededor de la ruta en la definición, cmd.exe las coloca alrededor de la ruta antes de agregar el nombre del archivo y los cambios y el lote falla con "Error de sintaxis de línea de comando". Sin comillas, falla con "no se reconoce como un comando interno o externo, programa operable o archivo por lotes".

Para las pruebas, estoy usando el interruptor de ayuda hasta que pueda hacerlo funcionar o si puedo hacerlo. Puedo hacerlo usando un nombre de archivo / carpeta 8.3 (por ejemplo, Mis documentos como MyDocu ~ 1), pero ¿se puede hacer de otra manera?

Marcerickson
fuente
Las comillas deben contener la ruta con el nombre del archivo y deben seguir los parámetros de la línea de comandos. ¿Puede darnos más detalles sobre cómo se crea la línea de comando? Exactamente a qué te refieres con> Si pongo comillas alrededor de la ruta en la definición, cmd.exe las coloca alrededor de la ruta antes de agregar el nombre del archivo y los cambios
vladhorby

Respuestas:

104

Intente algo como esto:

SET MY_PATH=C:\Folder with a space

"%MY_PATH%\MyProgram.exe" /switch1 /switch2
aforia
fuente
Eso es lo que hice usando Reemplazar en el Bloc de notas. Gracias.
marcerickson
5
Me alegro de que haya ayudado. Sería bueno si votara y aceptara cualquier respuesta que crea que le ayudó.
aphoria
75

yo suelo

set "VAR_NAME=<String With Spaces>"

al actualizar la ruta:

set "PATH=%UTIL_DIR%;%PATH%"
koko
fuente
3
esta debería ser la respuesta aceptada. por alguna razón, llamar a set desde un bloque if no funciona si el valor tiene un espacio y no está entre comillas.
Kevin
33

Aquí hay dos opciones. Primero, puede almacenar la ruta sin comillas y simplemente citarla más tarde:

set MyPath=C:\Program Files\Foo
"%MyPath%\foo with spaces.exe" something

Otra opción que podría usar es una subrutina que sirve para eliminar las cadenas de comillas (pero en este caso en realidad no es una muy buena idea ya que está agregando comillas, eliminándolas y volviéndolas a agregar sin beneficio):

set MyPath="C:\Program Files\Foo"
call :foo %MyPath%
goto :eof

:foo
"%~1\foo.exe"
goto :eof

La %~1quita comillas alrededor del argumento. Esto es útil cuando se pasan los nombres de las carpetas entre comillas pero, como se dijo antes, en este caso particular no es la mejor idea :-)

Joey
fuente
Usé el primer método, usando Reemplazar en el Bloc de notas. El segundo parecía innecesariamente complicado. Gracias.
marcerickson
2
Tengo un archivo por lotes que obtiene parámetros. Usar set LALA=%~1fue lo que funcionó para mí.
JCH2k
El segundo método funciona perfectamente cuando se utilizan subrutinas
robe007
16

Prueba esto;

  1. crea una variable como se muestra a continuación

    SET "SolutionDir=C:\Test projects\Automation tests\bin\Debug"**
    
  2. Luego reemplace la ruta con variable. Asegúrese de agregar comillas para el comienzo y el final

    vstest.console.exe "%SolutionDir%\Automation.Specs.dll"
    
Shiran Jayawardena
fuente
8

Siempre coloco la ruta entre comillas dobles cuando estoy creando un archivo .bat. (Acabo de agregar la PAUSA para que no cierre la pantalla).

Por ejemplo:

"C:\Program Files\PageTech\PCLReader64_131\PCLReader64.exe"
PAUSE
JoBaxter
fuente
7

La forma correcta de hacer esto es así:

@ECHO off
SET MY_PATH=M:\Dir\^
With Spaces\Sub Folder^
\Dir\Folder
:: calls M:\Dir\With Spaces\Sub Folder\Dir\Folder\hello.bat
CALL "%MY_PATH%\hello.bat"
pause
djangofan
fuente
5

La forma más sencilla de solucionar este problema es poner el nombre de la carpeta entre comillas:

(cd\New Folder\...) --> (cd\"New Folder"\...)

Espera que esto ayude.

usuario5528279
fuente
2

Si necesita almacenar una ruta permanente (la ruta no se cambia cuando se reinicia cmd)

  1. Ejecute el símbolo del sistema como administrador (haga clic con el botón derecho en cmd.exe y seleccione ejecutar como administrador)

  2. En cmd setx path "%path%;your new path" luego ingrese

  3. Verifique si la ruta se tomó correctamente escribiendo ruta y presionando enter

mpmpeiris
fuente
1
Creo que la pregunta no se trata de la variable PATH , sino más bien de una variable de ruta . El OP aparentemente quiere almacenar una ruta particular en una variable y usar el valor en el script por lotes.
Andriy M
1

también solo intente agregar barras dobles como esta funciona solo para mí

set dir = "C: \\ 1. Alguna carpeta \\ Otra carpeta \\ Simplemente porque"

@echo en MKDIR% dir%

Dios mío, después de publicar, eliminaron el segundo \ en mi publicación, así que si abre mi comentario y muestra tres, debería leerlos como dos ...

Erwin
fuente