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

88

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
David
la source
2
vous vouliez dire que vous avez une bonne raison de ne pas vouloir utiliser de guillemets.
Thomas
Pourquoi votre clé de guillemet est-elle cassée? :)
slhck
3
@slhck Ne vous inquiétez pas, ma touche Maj et la touche 2 sont parfaitement correctes! J'utilise une commande qui ne semble pas autoriser les caractères génériques quand ils apparaissent entre guillemets, c'est tout!
David
1
@MarkBooth et @WeltenWanderer ont bien essayé, mais malheureusement, cela ne fonctionne pas. Dans les 3 cas, je reçois un "svn: Error resolving case of ....."
David,
1
Avez-vous essayé l’ancien formatage 8.3 du nom (DOCUME ~ 1)?
Justin Pearce

Réponses:

55

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:\>
barlop
la source
comme subversion est un outil de programmation, il peut convenir à SO. voici une question connexe stackoverflow.com/questions/757435/... il pourrait vous être utiliser des guillemets ou caret pour l' obtenir à svn, vous utilisez peut - être avant chaque espace backslash
barlop
vous pouvez également essayer svn de cygwin, si vous êtes curieux .. avec quelques exemples de réponses à cette question et voyez si quelques-unes d’entre elles fonctionnent pour vous.
Barlop
5
Le symbole caret répond directement à ma question, je vais donc accepter votre réponse. Malheureusement, la commande SVN ne semble pas le reconnaître! Si je l’essaie, j’obtiens le message d’erreur suivant: "svn 'c:" n’est pas une copie de travail ". J'ai un autre moyen de contourner le problème et de simplement «cd» dans le répertoire, puis d'exécuter la commande SVN une fois là-bas. Je peux même chaîner les deux commandes en une seule ligne à l'aide de l'opérateur &&: cd "c: \ Documents and Settings \ nom d'utilisateur \ svn" && SVN add *. *
David
dans l'exemple du CD, caret n'est pas nécessaire, le CD n'a pas besoin d'espace
inséré
1
@ Chinggis6 intéressant .. cela ne fonctionne pas pour DIR non plus. Les commandes copy et dir sont toutes deux des commandes intégrées. Bien que copy et dir prennent un nom de fichier comme paramètre. Cela vaut peut-être la peine de demander sur le forum
dostips
35

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 se trouvent en dehors des guillemets, ils fonctionnent donc toujours correctement.

Kit Johnson
la source
7
aussi si on veut être minimaliste, on peut faire des guillemets juste autour de l’espace ou des caractères contenant l’espace, par exemple C: \> cd documents "and se" ttings (bien que cd exemple, cn n’a pas besoin d’échapper) espaces)
barlop
1
Merci beaucoup. J'aurais peut-être voté 4 ou 5 fois si possible ..
Sayka
@Sayka La question a été posée: "Comment puis-je échapper des espaces en ligne de commande dans Windows sans utiliser de guillemets? "
barlop
2
@barlop Bien sûr, mais la raison pour l'absence de guillemets est que l'astérisque ne fait pas son travail lorsqu'il se trouve à l'intérieur des guillemets. La solution proposée évite ce problème car les astérisques se trouvent en dehors des guillemets. Cette réponse ne correspond pas à la lettre de la question, mais à l' esprit de la question (c.-à-d. Que cela fonctionne dans le but recherché).
Kit Johnson
26

Malgré les réponses qui donnent 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. Enregistrer " echo %1" sous 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 %1sur foo bar. (Notez qu'il y a un caractère d'espace entre fooet bar.)

  3. Essai-et-erreur pendant quelques années et se rendre compte qu'il n'y a aucun moyen de le faire . Les gens suggéreront d'échapper à l'aide ^, mais test.bat foo^ barne produiront pas foo bar.

Donc, il n'y a aucun moyen d'obtenir la sortie foo bar, et le plus proche que nous puissions obtenir est d'exécuter test.bat foo" "barqui produit foo" "barou d'exécuter test.bat "foo bar"qui produit "foo bar".


Maintenant, la raison pour laquelle les autres réponses semblent au travail parce que le cdfait de son propre analyse supplémentaire, écartant du comportement de argument habituel en passant (l'habituel %1, %2, %3et etc dans des fichiers batch typiques).

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

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

Pourquoi ça marche? Cela est dû à cd se faire quelque chose d' équivalent de rejoindre les 7 habituels arguments dans une logique. 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 cdtous les 7 arguments ont été réunis dans un argument logique, ce array.join(" ")qui donne le chemin suivant:

c:\documents and settings \some folder with spaces

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


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

test.bat foo" "bar

qui produit foo" "barou:

test.bat "foo bar"

qui produit "foo bar"ou:

test.bat "foo "bar

qui produit "foo "barou:

test.bat foo" bar"

qui produit foo" bar"ou:

test.bat "foo b"ar

qui produit "foo b"arou:

test.bat fo"o bar"

qui produit fo"o bar"ou:

test.bat fo"o ba"r

qui produit fo"o ba"rou:

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 similitude, à savoir qu'ils produiront foo baraprès élimination des "caractères. cdL'auteur doit avoir compris cela aussi ... si nous devions déduire de son cdcomportement particulier qui élimine tout "ce 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

Pacerier
la source
15
Quel désordre la programmation par lots de Windows ...
Klangen
Merci. Peut-on déterminer si le CD utilise argv[]ou GetCommandLine()? pastebin.com/raw/t55iv0JS
barlop
7

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 ..;)

Milorulez
la source
8
cela peut ne pas fonctionner si le nom de fichier court a été désactivé
phuclv
3

Utilisez le nom de fichier court 8.3. Par exemple:

If exist c:\docume~1 goto :Ifoundthesucker
Andrew DeMerchant
la source
Voir le commentaire de Lưu Vĩnh Phúc sur la réponse de Milorulez .
G.Broser dit: Réintégrer Monica le
2

Pour ceux qui parlent de remplacement 8.3, veuillez noter les deux choses suivantes:

  • 8.3 peut être défini sur désactivé (ou activé) sur NTFS, de sorte qu'il ne peut pas toujours exister.
  • Le nom 8.3 d'un fichier / dossier peut changer sans préavis en créant, en renommant ou en supprimant d'autres éléments dans le même dossier.

Alors c:\docume~1peut pointer vers:

  • Nulle part (ê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.

Bien qu'il soit très rare qu'ils changent, il est fréquent qu'ils n'existent pas.

Si vous voulez savoir si la version 8.3 existe pour un dossier / fichier particulier, testez-la avec le paramètre /Xd'une dircommande ou encapsulez-la sur un objet forpour obtenir uniquement cette partie, etc.

Pour plus d'informations sur l'activation / la désactivation de la version 8.3 sur NTFS, consultez cet article du support technique Microsoft:
https://support.microsoft.com/en-us/help/121007/how-to-disable-8-3-file-name- création-sur-ntfs-partitions

Claudio
la source
0

Suite au message de @ Pang, et aux autres discussions sur les noms abrégés et les pièges, voici un moyen de résoudre dynamiquement un nom long en un nom abrégé:

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

Ensuite, vous pouvez évidemment utiliser le nom abrégé plutôt que les guillemets.

BuvinJ
la source