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

88

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

CD "c:\Documents and Settings"

La razón 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 mypathname por una ruta con espacios, necesito citar todo. Por ejemplo:

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

Pero cuando intento esto me sale el siguiente mensaje de error:

svn: warning: 'c:\Documents and Settings\username\svn\*.*' not found
David
fuente
2
querías decir que tienes una buena razón para "no" querer usar comillas.
Thomas
¿Por qué, se rompe su clave de comillas? :)
slhck
3
@slhck ¡No se preocupe, mi tecla de mayúsculas y la tecla número 2 están perfectamente bien! Estoy usando un comando que no parece permitir comodines cuando aparecen entre comillas, eso es todo.
David
1
@MarkBooth y @WeltenWanderer buen intento pero desafortunadamente esto no funciona. En los 3 casos recibo un "svn: Error al resolver el caso de ....."
David
1
¿Has probado el antiguo formato 8.3 del nombre (DOCUME ~ 1)?
Justin Pearce

Respuestas:

55

Casi todo funciona para mí, pero tal vez has intentado la línea 5 ... escapar del espacio con un símbolo de intercalación (^)

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, debajo de donde el cursor realmente marca la diferencia

Se ve desde abajo como el símbolo de intercalación puede ser su respuesta, vea la línea 3 a continuación.

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:\>
barlop
fuente
Como la subversión es una herramienta de programación, puede ser apropiada para SO. aquí hay una pregunta relacionada stackoverflow.com/questions/757435/… podría ser que use comillas o carets para llegar a svn, luego quizás use la barra invertida antes de cada espacio
barlop
también puede probar el svn de cygwin, si tiene curiosidad ... con algunas de las respuestas de ejemplo en esa pregunta y ver si alguna o variaciones de ellas funcionan para usted.
barlop
55
El símbolo de intercalación responde directamente a mi pregunta, así que aceptaré tu respuesta. ¡Desafortunadamente el comando SVN no parece reconocerlo! Si lo intento, aparece este mensaje de error "svn 'C:' no es una copia de trabajo". Sin embargo, tengo otra forma de evitarlo y eso 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 usando el operador &&: cd "c: \ Documents and Settings \ username \ svn" && SVN add *. *
David
en el ejemplo de CD, no es necesario tener
cuidado
1
@ Chinggis6 interesante ... tampoco funciona para DIR. Tanto copy como dir están integrados en comandos ... aunque también lo es CD. Aunque copy y dir toman un nombre de archivo como parámetro. Puede valer la pena preguntar en el foro
dostips
35

Descubrí 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 están fuera de las comillas, por lo que aún funcionan correctamente.

Kit Johnson
fuente
77
Además, si uno quiere ser minimalista, puede hacer comillas alrededor del espacio o solo los caracteres que contienen el espacio, por ejemplo, C: \> documentos cd "y ajustes" (aunque en ese ejemplo de cd, uno no necesita escapar espacios)
barlop
1
Muchas gracias. Podría haber votado 4 o 5 veces si fuera posible ..
Sayka
@Sayka La pregunta fue "¿Cómo escapo espacios en la línea de comandos en Windows sin utilizar comillas? "
barlop
2
@barlop Claro, pero la razón de que no haya comillas fue que el asterisco no hace su trabajo cuando está dentro de las comillas. La solución que he dado evita este problema porque los asteriscos están fuera de las comillas. Esta respuesta no se ajusta a la letra de la pregunta, pero sí al espíritu de la pregunta (es decir, funciona para el propósito previsto).
Kit Johnson el
26

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

  1. Guardar " echo %1" como test.bat. Este archivo por lotes generará el primer argumento que cmd nos pasa.

  2. Ahora, intente y ejecute test.bat, estableciendo el valor de %1a foo bar. (Tenga en cuenta que hay un espacio de caracteres entre fooy bar.)

  3. Prueba y error durante unos años y date cuenta de que no hay forma de hacerlo . La gente sugerirá escapar usando ^, pero test.bat foo^ barno dará salida foo bar.

Por lo tanto, no hay forma de obtener la salida foo bar, y lo más cerca que podemos estar es ejecutar lo test.bat foo" "barque produce foo" "bar, o ejecutar lo test.bat "foo bar"que produce "foo bar".


Ahora, la razón por las otras respuestas aparecen al trabajo se debe a que cdhace su propio análisis adicional, que diverge del comportamiento del argumento habitual que pasa (la habitual %1, %2, %3y etc en archivos por lotes típicos).

Por ejemplo, considere el comando peculiar:

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

Por que funciona Esto se debe a cd sí mismo haciendo algo equivalente a unirse a los 7 habituales argumentos en un uno lógico. Según el argumento cmd que pasa las normas, vemos 7 argumentos:

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

Es como si cdhubiera unido todos los 7 argumentos en uno lógico, haciendo algo similar array.join(" "), lo que produce el camino:

c:\documents and settings \some folder with spaces

Tenga en cuenta que este comportamiento es peculiar cdsolo (y algunas otras funciones). No tiene nada que ver con pasar argumentos habituales.


De hecho, cdtiene otra peculiaridad. ¿Recuerdas que dijimos anteriormente que no pudimos 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 bardespués de que recortemos los "caracteres. cdEl autor debe haberse dado cuenta de esto también ... si tuviéramos que inferir del cdcomportamiento peculiar que recorta todo "lo que 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

Pacerier
fuente
15
Qué desorden la programación por lotes de Windows ...
Klangen
Gracias. ¿Podemos determinar si CD está usando argv[]o GetCommandLine()? pastebin.com/raw/t55iv0JS
barlop
7

El nombre de archivo corto parece funcionar como una brisa.

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

Para aumentar la memoria ..;)

Milorulez
fuente
8
puede no funcionar si se ha deshabilitado el nombre de archivo corto
phuclv
3

Use el nombre de archivo corto 8.3. Por ejemplo:

If exist c:\docume~1 goto :Ifoundthesucker
Andrew DeMerchant
fuente
Vea el comentario de Lưu Vĩnh Phúc a la respuesta de Milorulez .
Gerold Broser
2

Para aquellos que hablan sobre el reemplazo 8.3, tenga en cuenta las siguientes dos cosas:

  • 8.3 se puede establecer en deshabilitado (o habilitado) en NTFS, por lo que no siempre puede existir.
  • El nombre 8.3 de un archivo / carpeta puede cambiar sin previo aviso simplemente creando, renombrando o eliminando otras cosas en la misma carpeta.

Entonces c:\docume~1puede señalar:

  • En ninguna parte (ser inválido)
  • La carpeta que quieres
  • Otra carpeta
  • Una carpeta variable a lo largo del tiempo

No es seguro, a menos que obtenga el nombre corto y lo use en operaciones atómicas.

Aunque es muy raro que cambien, es común que no existan.

Si desea saber si existe 8.3 para una carpeta / archivo en particular, pruébelo con un parámetro /Xen un dircomando o encapsúlelo en un forsolo para obtener esa parte, etc.

Para obtener más información sobre cómo habilitar / deshabilitar 8.3 en NTFS, consulte este artículo de soporte de Microsoft:
https://support.microsoft.com/en-us/help/121007/how-to-disable-8-3-file-name- creacion-en-particiones-ntfs

Claudio
fuente
0

Continuando con la publicación de @ Pang, y otros discutiendo nombres cortos y las trampas, aquí hay una manera de resolver dinámicamente un nombre largo a un nombre corto:

for %A in ("C:\Some\long path\which must exist\to be resolved") do @echo %~sA

Entonces, obviamente, puede usar el nombre corto en lugar de las comillas.

BuvinJ
fuente