web-dev-qa-db-fra.com

Comment échapper aux espaces en ligne de commande dans Windows sans utiliser de guillemets?

Par exemple, quelle est l'alternative à cette commande sans guillemets:

CD "c:\Documents and Settings"

La raison pour laquelle je ne souhaite pas utiliser de guillemets est que cette commande fonctionne:

   SVN add mypathname\*.*

mais cette commande ne marche PAS:

   SVN add "mypathname\*.*"

Le problème étant que lorsque je change de mypathname pour un chemin contenant des espaces, je dois tout citer. Par exemple:

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

Mais lorsque j'essaie, j'obtiens le message d'erreur suivant:

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

Tout fonctionne presque pour moi, mais avez-vous peut-être essayé line5 .. échapper à l'espace avec un symbole 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:\>

Ou par exemple ci-dessous où le curseur fait toute la différence.

On dirait d’en bas que le symbole caret pourrait être votre réponse, voir la ligne 3 ci-dessous.

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:\>
51
barlop

J'ai trouvé que mettre des guillemets autour d'une partie de l'emplacement fonctionne. Dans ton cas:

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

Bien que cela utilise des guillemets, il est important de noter que les astérisques sont en dehors de les guillemets, ils fonctionnent donc toujours correctement.

34
Kit Johnson

Malgré les réponses donnant l’illusion que cela fonctionne, le fait est que vous ne pouvez pas vous faufiler dans les arguments habituels de cmd. C'est facile à prouver:

  1. Enregistrez "echo %1" sous le nom test.bat. Ce fichier de commandes affichera le premier argument que cmd nous transmet.

  2. Maintenant, essayez et exécutez test.bat, en définissant la valeur de %1 sur foo bar. (Notez qu'il y a un caractère d'espace entre foo et bar.)

  3. Essaie et erreur pendant quelques années et réalise que (il n'y a aucun moyen de le faire}. Les gens suggéreront d'échapper à l'aide de ^, mais test.bat foo^ bar ne produira pas foo bar.

Donc, il n’ya aucun moyen d’obtenir la sortie foo bar, et le plus proche que nous puissions obtenir est l’exécution de test.bat foo" "bar qui produit foo" "bar, ou de l’exécution test.bat "foo bar" qui produit "foo bar".


Maintenant, la raison pour laquelle les autres réponses apparaissent pour fonctionner est que cd effectue c'est-à-dire propre une analyse syntaxique supplémentaire, divergeant du comportement de transmission habituelle des arguments (les méthodes habituelles %1, %2, %3 et etc dans fichiers batch typiques).

Par exemple, considérons la commande particulière:

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

Pourquoi ça marche? Ceci est dû à cdlui-même faisant quelque chose d'équivalent à joindre les arguments 7 habituels en un seul. Selon les arguments de cmd qui passent les normes, nous voyons 7 arguments:

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

C'est comme si cd avait réuni les 7 arguments en un seul, en faisant quelque chose qui ressemble à array.join(" "), ce qui donne le chemin:

c:\documents and settings \some folder with spaces

Notez que ce comportement est propre à cd uniquement) (et quelques autres fonctions). Cela n'a rien à voir avec les arguments habituels.


En effet, cd a une autre particularité. Rappelez-vous que nous avons indiqué ci-dessus que nous ne pouvions pas obtenir le foo bar de sortie? La sortie la plus proche que nous puissions obtenir est en exécutant:

test.bat foo" "bar

qui produit foo" "bar, ou:

test.bat "foo bar"

qui produit "foo bar", ou:

test.bat "foo "bar

qui produit "foo "bar, ou:

test.bat foo" bar"

qui produit foo" bar", ou:

test.bat "foo b"ar

qui produit "foo b"ar, ou:

test.bat fo"o bar"

qui produit fo"o bar", ou:

test.bat fo"o ba"r

qui produit fo"o ba"r, ou:

test.bat "fo"o" bar"

qui produit "fo"o" bar", ou:

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

qui produit "f""o""o"" ""b""a""r", ou même:

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

qui produit """"f"""o""""o"" ""ba"""r"""""""""".

Tous les exemples ci-dessus présentent une similarité: ils produiront foo bar après avoir coupé les caractères ". L’auteur de cd doit également s’être rendu compte de cela… si nous devons déduire de son comportement particulier que cd adopte _ qui {élimine tout le " qu’il reçoit}, permettant à toutes ces commandes de fonctionner:

  • 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

23
Pacerier

Le nom de fichier court semble fonctionner comme une brise.

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

Pour booster la mémoire ..;)

7
Milorulez

Utilisez le nom de fichier court 8.3. Par exemple:

If exist c:\docume~1 goto :Ifoundthesucker
3

Pour parler du remplacement de la version 8.3, saviez-vous que deux choses:

  • 8.3 peut être défini sur désactivé (ou activé) sur NTFS afin qu'ils n'existent pas toujours
  • 8.3 le nom d'un fichier/dossier peut changer sans avoir été notifié simplement en créant, en renommant ou en supprimant d'autres éléments sur le même dossier

Donc, c:\docume~1 peut pointer vers:

  • Non où (être invalide)
  • Le dossier que vous voulez
  • Un autre dossier
  • Un dossier variable dans le temps

Ce n’est pas sûr, à moins d’obtenir le nom abrégé et de l’utiliser dans des opérations atomiques.

Cela dit, il est très rare qu'ils changent, mais il est très courant qu'ils n'existent pas.

Si vous voulez savoir si la version 8.3 existe pour un dossier/fichier particulier, testez-la avec paramenter/X avec une commande dir ... ou encapsulez-la dans un for pour obtenir uniquement cette partie, etc.

Pour en savoir plus sur l'activation/désactivation de la version 8.3 sur NTFS, voir M $ web:

https://support.Microsoft.com/es-es/help/121007/how-to-disable-8.3-file-name-creation-on-ntfs-partitions

1
Claudio