102 votes

Comment échapper aux espaces dans la ligne de commande sous 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 veux pas utiliser de guillemets est que cette commande fonctionne effectivement :

   SVN add mypathname\*.*

mais cette commande ne fonctionne pas :

   SVN add "mypathname\*.*"

Le problème est que lorsque je modifie mon nom de chemin pour un chemin contenant des espaces, je dois citer l'ensemble du chemin. Par exemple :

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

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

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

64voto

barlop Points 21549

Cela fonctionne presque toujours pour moi, mais avez-vous essayé la ligne 5 en échappant l'espace avec un symbole 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:\>

Ou par exemple ci-dessous, où le signe d'insertion fait vraiment toute la différence.

Il semble que le symbole de l'astérisque puisse ê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:\>

42voto

Kit Johnson Points 1008

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

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

Bien que ce texte utilise des guillemets, il est important de noter que les astérisques sont à l'extérieur de les guillemets, afin qu'ils fonctionnent toujours correctement.

30voto

Pacerier Points 25390

Bien que les réponses donnent l'illusion que cela fonctionne, le fait est que vous ne pouvez pas insérer d'espaces dans les arguments cmd habituels. C'est facile à prouver :

  1. Sauver " echo %1 " comme test.bat . Ce fichier batch va sortir le premier argument que cmd nous passe.

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

  3. Essai-erreur pendant quelques années et se rendre compte que il n'y a aucun moyen de le faire . Les gens suggèrent de s'échapper en utilisant ^ pourtant test.bat foo^ bar ne produira pas foo bar .

Donc, il n'y a aucun moyen d'obtenir la sortie foo bar et ce qui s'en rapproche le plus, c'est la course. test.bat foo" "bar qui produit foo" "bar ou en cours d'exécution test.bat "foo bar" qui produit "foo bar" .


Maintenant, la raison pour laquelle les autres réponses apparaître pour travailler, c'est parce que cd hace il est propre une analyse syntaxique supplémentaire, s'écartant du comportement du passage d'argument habituel (l'analyse habituelle %1 , %2 , %3 etc. dans des fichiers batch typiques).

Par exemple, considérez le commandement particulier :

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

Pourquoi cela fonctionne-t-il ? Cela est dû à cd lui-même faire quelque chose qui équivaut à rejoindre les 7 habituel en un seul argument logique. Selon les normes de passage d'arguments de cmd, nous voyons 7 arguments :

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

C'est comme si cd a réuni les 7 arguments en un seul logique, en faisant quelque chose de similaire à array.join(" ") ce qui produit le chemin :

c:\documents and settings \some folder with spaces

Notez que ce comportement est propre à cd seulement (et quelques autres fonctions). Cela n'a rien à voir avec le passage habituel des arguments.


En effet, cd a une autre particularité. Rappelez-vous que nous avons déclaré ci-dessus que nous ne pouvions pas obtenir la sortie foo bar ? La sortie la plus proche que nous pouvons 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 ont une similarité, à savoir qu'ils produiront foo bar après avoir coupé le " chars. cd L'auteur a dû s'en rendre compte aussi... si l'on en déduit que cd Le comportement particulier de l'entreprise qui supprime tous les " 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

9voto

Milorulez Points 91

Le nom de fichier court semble fonctionner comme un jeu d'enfant.

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

Pour booster la mémoire ;)

3voto

Utilisez le nom de fichier court 8.3. Par exemple :

If exist c:\docume~1 goto :Ifoundthesucker

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X