101 votos

¿Cómo se escapan los espacios en la línea de comandos en Windows sin usar comillas?

Por ejemplo, cuál es la alternativa a este comando sin comillas:

CD "c:\Documents and Settings"

La razón completa por la que no quiero usar comillas es que este comando SÍ funciona:

   SVN add mypathname\*.*

pero este comando NO funciona:

   SVN add "mypathname\*.*"

El problema es que cuando cambio mi nombre de usuario por una ruta con espacios tengo que citarlo todo. Por ejemplo:

SVN add "c:\Documents and Settings\username\svn\*.*"

Pero cuando lo intento me aparece el siguiente mensaje de error:

svn: warning: 'c:\Documents and Settings\username\svn\*.*' not found

2 votos

Querías decir que tienes una buena razón para "no" querer usar las comillas.

0 votos

¿Por qué, está rota tu tecla de comillas? :)

0 votos

@Thomas ¡Bien visto!

63voto

jondro Puntos 125

A mí me funciona casi todo, pero ¿has probado quizás la línea 5.. escapando el espacio con un símbolo de caret (^)

1 C:\Documents and Settings\user>cd ..

2 C:\Documents and Settings>cd ..

3 C:\>cd Documents and Settings

4 C:\Documents and Settings>cd..

5 C:\>cd Documents^ and^ Settings

6 C:\Documents and Settings>cd..

7 C:\>cd C:\documents and settings

8 C:\Documents and Settings>cd..

9 C:\>

O, por ejemplo, más abajo, donde el signo de intercalación marca realmente la diferencia.

Parece que el símbolo del caret puede ser la respuesta, véase la línea 3.

1 C:\>"c:\Documents and Settings\a.bat"
gaga

2 C:\>c:\Documents and Settings\a.bat
'c:\Documents' is not recognized as an internal or external command,
operable program or batch file.

3 C:\>c:\Documents^ and^ Settings\a.bat
gaga

C:\>

0 votos

Dado que subversion es una herramienta para programadores, puede ser apropiada para el SO. aquí hay una pregunta relacionada stackoverflow.com/questions/757435/ puede ser que uses las comillas o el caret para llevarlo a svn, entonces quizás uses la barra invertida antes de cada espacio

0 votos

También podrías probar el svn de cygwin, si tienes curiosidad.. con algunas de las respuestas de ejemplo en esa pregunta y ver si alguna o variaciones de ellas te funcionan.

5 votos

El símbolo del signo de intercalación responde directamente a mi pregunta, así que acepto su respuesta. Por desgracia, el comando SVN no parece reconocerlo. Si lo intento, recibo este mensaje de error "svn 'C:' no es una copia de trabajo". Tengo otra manera de evitarlo y es simplemente 'cd' al directorio primero y luego ejecutar el comando SVN una vez allí. Incluso puedo encadenar los dos comandos en una sola línea utilizando el operador &&: cd "c: \Documents y Ajustes \username\svn " && SVN add *.*

42voto

oldmankit Puntos 390

He descubierto que poner comillas alrededor de una parte de la ubicación funciona. En tu caso:

SVN add C:\"Documents and Settings"\username\svn\*.*

Aunque esto utiliza comillas, lo importante es notar que los asteriscos son en el exterior las comillas, para que sigan funcionando correctamente.

9 votos

Además, si se quiere ser minimalista, se puede poner entre comillas sólo el espacio o sólo los caracteres que contienen el espacio, por ejemplo, C:>cd documents" y se "ttings (aunque en el ejemplo de cd, no es necesario escapar los espacios)

1 votos

Muchas gracias. Yo podría haber upvoted 4 o 5 veces si es posible ..

0 votos

@Sayka La pregunta era "¿Cómo puedo escapar de los espacios en la línea de comandos en Windows? ¿sin usar comillas? "

30voto

Pacerier Puntos 7440

A pesar de que las respuestas dan la ilusión de que funciona, el hecho es que no se pueden colar espacios en los argumentos habituales de cmd. Esto es fácil de demostrar:

  1. Guardar " echo %1 " como test.bat . Este archivo por lotes dará salida al primer argumento que nos pase cmd.

  2. Ahora, intente ejecutar test.bat , fijando el valor de %1 a foo bar . (Tenga en cuenta que hay un espacio char entre foo y bar .)

  3. Prueba y error durante unos años y darse cuenta de que no hay manera de hacerlo . La gente sugerirá escapar usando ^ Sin embargo test.bat foo^ bar no se emitirá foo bar .

Por lo tanto, no hay manera de obtener la salida foo bar y lo más cercano que podemos conseguir es correr test.bat foo" "bar que produce foo" "bar o corriendo test.bat "foo bar" que produce "foo bar" .


Ahora, la razón de las otras respuestas aparece para trabajar es porque cd hace es propio análisis sintáctico adicional, desviándose del comportamiento del paso de argumentos habitual (el %1 , %2 , %3 y etc en los típicos archivos por lotes).

Por ejemplo, considere la peculiar orden:

cd c:\documents and settings \some folder with spaces

¿Por qué funciona? Esto se debe a cd sí mismo haciendo algo equivalente a unirse a los 7 habitual argumentos en una sola lógica. Según las normas de paso de argumentos de cmd, vemos 7 argumentos:

  1. c:\documents
  2. and
  3. settings
  4. \some
  5. folder
  6. with
  7. spaces

Es como si cd ha unido los 7 argumentos en uno solo lógico, haciendo algo parecido a array.join(" ") que produce la ruta:

c:\documents and settings \some folder with spaces

Tenga en cuenta que este comportamiento es propio de cd sólo (y algunas otras funciones). No tiene nada que ver con el paso de argumentos habitual.


Sí, es cierto, cd tiene otra peculiaridad. Recuerde que dijimos arriba que no podíamos obtener la salida foo bar ? La salida más cercana que podemos obtener es ejecutando:

test.bat foo" "bar

que produce foo" "bar o:

test.bat "foo bar"

que produce "foo bar" o:

test.bat "foo "bar

que produce "foo "bar o:

test.bat foo" bar"

que produce foo" bar" o:

test.bat "foo b"ar

que produce "foo b"ar o:

test.bat fo"o bar"

que produce fo"o bar" o:

test.bat fo"o ba"r

que produce fo"o ba"r o:

test.bat "fo"o" bar"

que produce "fo"o" bar" o:

test.bat "f""o""o"" ""b""a""r":

que produce "f""o""o"" ""b""a""r" o incluso:

test.bat """"f"""o""""o"" ""ba"""r"""""""""":

que produce """"f"""o""""o"" ""ba"""r"""""""""" .

Todos los ejemplos anteriores tienen una similitud, que es que producirán foo bar después de recortar el " caracteres. cd El autor de la obra debe haberse dado cuenta de esto también... si deducimos de cd El comportamiento peculiar de la empresa, que recorta todos los " recibe permitiendo que todos estos comandos funcionen:

  • cd c:\documents and settings

  • cd "c:\documents and settings"

  • cd "c:"\"documents and settings"

  • cd c:\"documents" "and" "settings"

  • cd c:\"docu"ments an"d set"tings"

  • cd c:"\"docu"ments an"d set"ti"""ngs

  • cd "c"":""\"docu"ments an"d set"ti"""ngs

  • cd "c"":""\"do""cu"me"nts a"n""d set"ti"""ngs

  • cd c"""":""""\"""d"""oc""""u"me"""""nt"s a"n""d set"""""""ti""""ngs

19 votos

Qué lío la programación por lotes de Windows...

0 votos

Gracias. ¿Podemos determinar si el CD está usando argv[] o GetCommandLine() ? pastebin.com/raw/t55iv0JS

9voto

Milorulez Puntos 21

El nombre corto parece funcionar como una brisa.

" E:\Progra ~1 \Java\Eclipse\eclipse.exe " -vmargs -Xms1024m -Xmx2048m

Para potenciar la memoria.. ;)

8 votos

Puede que no funcione si se ha desactivado el nombre corto del archivo

0 votos

Gracias. Esta es la única solución que me ha funcionado al ejecutar un comando por SSH que apuntaba a una carpeta con espacios.

0 votos

¿Cómo se encuentra el nombre corto del archivo?

3voto

Utilice el nombre corto 8.3. Por ejemplo:

If exist c:\docume~1 goto :Ifoundthesucker

0 votos

Véase el comentario de Luu Vinh Phúc a Respuesta de Milorulez .

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: