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

88

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

CD "c:\Documents and Settings"

Der volle 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, wenn ich meinen Pfadnamen für einen Pfad mit Leerzeichen ändere, muss ich das Ganze zitieren. Zum Beispiel:

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

Aber wenn ich das versuche, bekomme ich folgende Fehlermeldung:

svn: warning: 'c:\Documents and Settings\username\svn\*.*' not found
David
quelle
2
Sie meinten, Sie hätten einen guten Grund, keine Anführungszeichen zu verwenden.
Thomas
Warum ist Ihr Anführungszeichen-Schlüssel kaputt? :)
Slhck
3
@slhck Mach dir keine Sorgen, meine Umschalttaste und die Taste 2 sind in Ordnung! Ich verwende einen Befehl, der keine Platzhalter zulässt, wenn sie in Anführungszeichen stehen. Das ist alles!
David
1
@MarkBooth und @WeltenWanderer netter Versuch aber leider klappt das nicht. In allen 3 Fällen erhalte ich die Meldung "svn: Fehler beim Auflösen des Falls von ....."
David
1
Haben Sie versucht, den Namen in 8.3 zu formatieren (DOCUME ~ 1)?
Justin Pearce

Antworten:

55

Es funktioniert fast alles für mich, aber haben Sie vielleicht versucht, line5 .. mit einem Caret-Symbol aus 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 zB unten, wo das Caret wirklich den Unterschied macht.

Sieht von unten so aus, als wäre das Caret-Symbol Ihre Antwort, 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:\>
barlop
quelle
Da Subversion ein Programmierwerkzeug ist, ist es möglicherweise für SO geeignet. Hier ist eine verwandte Frage: stackoverflow.com/questions/757435/… Es kann sein, dass Sie Anführungszeichen oder Caret verwenden, um svn zu erhalten. Dann verwenden Sie vielleicht einen Backslash vor jedem Leerzeichen
Barlop
Sie können auch versuchen, Cygwins Svn, wenn Sie neugierig sind ... mit einigen der Beispielantworten in dieser Frage und sehen, ob einige oder Variationen von ihnen für Sie funktionieren.
Barlop
5
Das Caret-Symbol beantwortet meine Frage direkt, sodass ich Ihre Antwort akzeptieren werde. Leider scheint der SVN-Befehl es nicht zu erkennen! Wenn ich es versuche, erhalte ich die Fehlermeldung "svn 'C:' ist keine Arbeitskopie". Ich habe aber einen anderen Weg, und das ist, einfach zuerst in das Verzeichnis zu 'cd' und dann dort den SVN-Befehl auszuführen. Ich kann die beiden Befehle sogar in einer einzigen Zeile mit dem Operator && verketten: cd "c: \ Dokumente und Einstellungen \ Benutzername \ svn" && SVN add *. *
David
im CD-Beispiel ist Caret nicht erforderlich, CD muss nicht
entkoppelt werden
1
@ Chinggis6 interessant .. es funktioniert auch nicht für DIR. Sowohl copy als auch dir sind eingebaute Befehle. Dies gilt jedoch auch für CD. Trotzdem nehmen copy und dir einen Dateinamen als Parameter. Vielleicht lohnt es sich, im Dostips-Forum
nachzufragen
35

Ich fand, dass es funktioniert, nur einen Teil des Ortes mit Anführungszeichen zu versehen. In deinem Fall:

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

Obwohl hierbei Anführungszeichen verwendet werden, ist es wichtig zu beachten, dass sich die Sternchen außerhalb der Anführungszeichen befinden, sodass sie weiterhin ordnungsgemäß funktionieren.

Kit Johnson
quelle
7
auch wenn man minimalistisch sein will, kann man nur das Leerzeichen oder nur die Zeichen, die das Leerzeichen enthalten, in Anführungszeichen setzen, z Leerzeichen)
Barlop
1
Danke vielmals. Ich hätte 4 oder 5 mal upvoted wenn möglich ..
Sayka
@ Sayka Die Frage wurde gestellt "Wie kann ich Leerzeichen in der Befehlszeile in Windows ohne Anführungszeichen entkommen ? "
Barlop
2
@barlop Sicher, aber der Grund für das Fehlen von Anführungszeichen war, dass der Stern seine Aufgabe nicht erfüllt, wenn er sich innerhalb der Anführungszeichen befindet. Die von mir angegebene Lösung vermeidet dieses Problem, da die Sternchen außerhalb der Anführungszeichen stehen. Diese Antwort hält sich nicht an den Buchstaben der Frage, sondern an den Geist der Frage (dh sie funktioniert für den beabsichtigten Zweck).
Kit Johnson
26

Trotz der Antworten, die den Eindruck erwecken, dass es funktioniert, können Sie sich nicht in Leerzeichen in die üblichen cmd-Argumente einschleichen. Das ist leicht zu beweisen:

  1. Speichern Sie " echo %1" als test.bat. Diese Batch-Datei gibt das erste Argument aus, das uns cmd übergibt.

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

  3. Probieren Sie es ein paar Jahre lang aus und stellen Sie fest, dass es keine Möglichkeit gibt, dies zu tun . Die Leute schlagen vor, mit zu fliehen ^, test.bat foo^ barwerden aber nicht ausgegeben foo bar.

Es gibt also keine Möglichkeit, die Ausgabe zu erhalten foo bar, und die nächstmögliche Möglichkeit besteht darin, auszuführen , test.bat foo" "barwas produziert foo" "bar, oder auszuführen, test.bat "foo bar"was produziert "foo bar".


Nun, der Grund , warum die anderen Antworten scheinen zu arbeiten, da cdtut es selbst ist zusätzlich Parsing, aus dem Verhalten des üblichen Arguments divergierend verläuft (die übliche %1, %2, %3und usw. in typischen Batch - Dateien).

Betrachten Sie zum Beispiel den eigentümlichen Befehl:

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

Warum funktioniert es? Dies ist auf cd sich selbst etwas zu tun Äquivalent der 7 Beitritt üblichen Argumente in eine logische Eins. Gemäß den cmd-Argumenten, die den Normen entsprechen, sehen wir 7 Argumente:

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

Es ist, als ob cdalle 7 Argumente zu einem logischen Argument zusammengefasst worden wären und etwas Ähnliches getan hätten array.join(" "), was den folgenden Pfad ergibt:

c:\documents and settings \some folder with spaces

Beachten Sie, dass dieses Verhalten nur (und einigen anderen Funktionen) eigencd ist . Es hat nichts mit der üblichen Argumentation zu tun.


In der Tat cdhat eine andere Besonderheit. Denken Sie daran, dass wir oben angegeben haben, dass wir die Ausgabe nicht erhalten konnten foo bar? Die nächste Ausgabe, die wir erhalten können, ist durch Ausführen von:

test.bat foo" "bar

welche produziert foo" "bar, oder:

test.bat "foo bar"

welche produziert "foo bar", oder:

test.bat "foo "bar

welche produziert "foo "bar, oder:

test.bat foo" bar"

welche produziert foo" bar", oder:

test.bat "foo b"ar

welche produziert "foo b"ar, oder:

test.bat fo"o bar"

welche produziert fo"o bar", oder:

test.bat fo"o ba"r

welche produziert fo"o ba"r, oder:

test.bat "fo"o" bar"

welche produziert "fo"o" bar", oder:

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

welche produziert "f""o""o"" ""b""a""r", oder sogar:

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

was produziert """"f"""o""""o"" ""ba"""r"""""""""".

Alle obigen Beispiele haben eine Ähnlichkeit, nämlich, dass sie erzeugt werden, foo barnachdem wir die "Zeichen abgeschnitten haben . cdDies muss auch der Autor erkannt haben ... wenn wir aus seinem cdeigentümlichen Verhalten schließen würden, das alles" , was es empfängt , abschneidet und all diese Befehle funktionieren lässt:

  • 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
quelle
15
Was für ein Chaos Windows Batch-Programmierung ...
Klangen
Vielen Dank. Können wir feststellen, ob CD verwendet wird argv[]oder GetCommandLine()? pastebin.com/raw/t55iv0JS
barlop
7

Der kurze Dateiname scheint wie ein Kinderspiel zu funktionieren.

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

Zur Steigerung des Gedächtnisses ..;)

Milorulez
quelle
8
es funktioniert möglicherweise nicht, wenn der kurze Dateiname deaktiviert wurde
phuclv
3

Verwenden Sie den Kurznamen 8.3. Zum Beispiel:

If exist c:\docume~1 goto :Ifoundthesucker
Andrew DeMerchant
quelle
Siehe Lưu Vĩnh Phúcs Kommentar zu Milorulez 'Antwort .
Gerold Broser
2

Wenn Sie über den Ersatz von 8.3 sprechen, beachten Sie bitte die folgenden zwei Punkte:

  • 8.3 kann unter NTFS deaktiviert (oder aktiviert) werden, sodass es möglicherweise nicht immer vorhanden ist.
  • Der 8.3-Name einer Datei / eines Ordners kann sich ohne vorherige Ankündigung ändern, indem Sie andere Elemente in demselben Ordner erstellen, umbenennen oder löschen.

c:\docume~1Kann also auf Folgendes hinweisen:

  • Nirgendwo (ungültig sein)
  • Den gewünschten Ordner
  • Ein weiterer Ordner
  • Ein variabler Ordner mit der Zeit

Es ist nicht sicher, es sei denn, Sie erhalten den Kurznamen und verwenden ihn für atomare Operationen.

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

Wenn Sie wissen möchten, ob 8.3 für einen bestimmten Ordner / eine bestimmte Datei vorhanden ist, testen Sie es mit einem Parameter /Xin einem dirBefehl oder kapseln Sie es in ein, forum nur diesen Teil abzurufen.

Weitere Informationen zum Aktivieren / Deaktivieren von 8.3 unter NTFS finden Sie in diesem Microsoft-Support-Artikel:
https://support.microsoft.com/en-us/help/121007/how-to-disable-8-3-file-name- Erstellung auf NTFS-Partitionen

Claudio
quelle
0

Im Anschluss an @ Pangs Post und an andere, die sich mit Kurznamen und den Fallstricken befassen, können Sie auf folgende Weise einen Langnamen dynamisch in einen Kurznamen auflösen:

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

Dann können Sie natürlich den Kurznamen anstelle von umgebenden Anführungszeichen verwenden.

BuvinJ
quelle