2011-05-04 12:54:50 +0000 2011-05-04 12:54:50 +0000
92
92
Advertisement

Wie umgehe ich Leerzeichen in der Befehlszeile in Windows ohne Anführungszeichen?

Advertisement

Was ist zum Beispiel die Alternative zu diesem Befehl ohne Anführungszeichen:

CD "c:\Documents and Settings"

Der vollständige Grund, warum ich keine Anführungszeichen verwenden möchte, ist, dass dieser Befehl funktioniert:

SVN add mypathname\*.*

aber dieser Befehl funktioniert NICHT:

SVN add "mypathname\*.*"

Das Problem ist, dass ich das Ganze in Anführungszeichen setzen muss, wenn ich meinen Hyperpfadnamen in einen Pfad mit Leerzeichen ändere. Zum Beispiel:

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

Aber wenn ich dies versuche, erhalte ich die folgende Fehlermeldung:

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

Antworten (7)

59
59
59
2011-05-04 16:59:54 +0000

Bei mir klappt fast alles, aber haben Sie vielleicht versucht, Zeile 5… mit einem Caret-Symbol (^) dem Leerzeichen zu entkommen

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

Oder z.B. unten, wo das Caret wirklich den Unterschied ausmacht.

Sieht von unten so aus, als ob das Caret-Symbol Ihre Antwort sein könnte, siehe Zeile 3 unten.

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:\>
36
36
36
2013-04-24 07:45:18 +0000

Ich fand, dass es funktioniert, Zitate nur um einen Teil des Ortes herum zu platzieren. In Ihrem Fall:

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

Obwohl hier Anführungszeichen verwendet werden, ist es wichtig zu beachten, dass sich die Sternchen außerhalb der Anführungszeichen befinden, so dass sie immer noch korrekt funktionieren.

26
Advertisement
26
26
2015-08-26 02:01:44 +0000

Trotz der Antworten, die die Illusion erwecken, dass es funktioniert, ist es Tatsache, dass man sich nicht durch Leerzeichen in die üblichen cmd-Argumente einschleichen kann. Dies ist leicht zu beweisen:

  1. Speichern Sie “echo %1” als test.bat. Diese Batch-Datei wird das erste Argument ausgeben, das cmd uns übergibt:

  2. Versuchen Sie nun, test.bat auszuführen und den Wert von %1 auf foo bar zu setzen. (Beachten Sie, dass zwischen foo und bar ein Leerzeichen steht.)

  3. Versuchen Sie es ein paar Jahre lang und stellen Sie fest, dass es keine Möglichkeit gibt, es zu tun. Die Leute werden vorschlagen, die Verwendung von ^ zu vermeiden, doch test.bat foo^ bar wird foo bar nicht ausgeben.

Es gibt also keine Möglichkeit, die Ausgabe foo bar zu erhalten, und am nächsten kommen wir, wenn wir test.bat foo" "bar laufen lassen, was foo" "bar erzeugt, oder wenn wir test.bat "foo bar" laufen lassen, was "foo bar" erzeugt.


Nun, der Grund, warum die anderen Antworten scheinen zu funktionieren, ist, weil cd ein eigenes zusätzliches Parsing durchführt, das vom Verhalten der üblichen Argumentübergabe abweicht (das übliche %1, %2, %3 und usw. in typischen Batch-Dateien).

Betrachten Sie zum Beispiel den eigentümlichen Befehl:

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

Warum funktioniert er? Das liegt daran, dass cd selbst etwas tut, das dem Zusammenfügen der 7 üblichen Argumente zu einem logischen entspricht. Gemäß dem cmd-Argument, das Normen übergibt, sehen wir 7 Argumente:

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

Es ist, als hätte cd alle 7 Argumente zu einem logischen zusammengefügt und dabei etwas Ähnliches wie array.join(" ") getan, was den Pfad ergibt:

c:\documents and settings \some folder with spaces

Beachten Sie, dass dieses Verhalten nur cd eigentümlich ist (und einige andere Funktionen). Es hat nichts mit der üblichen Argumentübergabe zu tun.


Tatsächlich hat cd eine weitere Besonderheit. Erinnern Sie sich, dass wir oben gesagt haben, dass wir die Ausgabe foo bar nicht bekommen konnten? Am nächsten kommen wir der Ausgabe, wenn wir:

test.bat foo" "bar

ausführen, was foo" "bar ergibt, oder:

test.bat "foo bar"

, was "foo bar" ergibt, oder:

test.bat "foo "bar

, was "foo "bar ergibt, oder:

test.bat foo" bar"

, was foo" bar" ergibt, oder:

test.bat "foo b"ar

, was "foo b"ar ergibt, oder:

test.bat fo"o bar"

, was fo"o bar" ergibt, oder:

test.bat fo"o ba"r

, was fo"o ba"r ergibt, oder:

test.bat "fo"o" bar"

, was "fo"o" bar" ergibt, oder:

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

, was "f""o""o"" ""b""a""r" ergibt, oder sogar:

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

, was """"f"""o""""o"" ""ba"""r"""""""""" ergibt.

Alle obigen Beispiele haben eine Ähnlichkeit, nämlich dass sie foo bar erzeugen, nachdem wir die Zeichen " abgeschnitten haben. Der Autor von cd muss das auch erkannt haben… wenn wir aus dem eigentümlichen Verhalten von cd schließen würden, das alle " abschneidet, die es erhält , so dass all diese Befehle funktionieren:

  • 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

  • &007

8
8
8
2014-04-19 07:51:15 +0000

Der Kurzfilmname scheint wie ein Kinderspiel zu funktionieren.

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

Um den Speicher zu erweitern… ;)

3
Advertisement
3
3
2012-10-03 14:47:56 +0000

Verwenden Sie den 8.3-Kurzdateinamen. Zum Beispiel:

If exist c:\docume~1 goto :Ifoundthesucker
2
2
2
2017-05-12 08:43:24 +0000

Für diejenigen, die über den 8.3-Ersatz sprechen, beachten Sie bitte die folgenden zwei Dinge:

  • 8.3 kann auf NTFS deaktiviert (oder aktiviert) gesetzt werden, so dass es möglicherweise nicht immer existiert.
  • Der 8.3-Name einer Datei/eines Ordners kann sich ohne Vorankündigung ändern, indem einfach andere Dinge im selben Ordner erstellt, umbenannt oder gelöscht werden.

Also kann c:\docume~1 auf Folgendes zeigen:

  • Nirgendwo (ungültig sein)
  • Der gewünschte Ordner
  • Ein anderer Ordner
  • Ein variabler Ordner entlang der Zeit

Es ist nicht sicher, es sei denn, Sie erhalten den Kurznamen und verwenden ihn in atomaren Operationen.

Obwohl es sehr ungewöhnlich ist, dass sie sich ändern, ist es üblich, dass sie nicht existieren.

Wenn Sie wissen wollen, ob 8.3 für einen bestimmten Ordner/eine bestimmte Datei existiert, testen Sie ihn mit dem Parameter /X auf einem dir-Befehl oder kapseln Sie ihn auf einem for, um nur diesen Teil zu erhalten, usw.

Weitere Informationen darüber, wie man 8.3 auf NTFS aktiviert/deaktiviert, finden Sie in diesem Support-Artikel von Microsoft: https://support.microsoft.com/en-us/help/121007/how-to-disable-8-3-file-name-creation-on-ntfs-partitions

0
Advertisement
0
0
2019-08-08 20:42:46 +0000
Advertisement