Batch-Datei mehrzeiligen Befehl mit doppelten Anführungszeichen
Wenn mit dem ^ - symbol geben Sie eine mehrzeilige Befehle mit Argumenten bei der Verwendung von Anführungszeichen zu verwenden, Zeichenfolgen mit Leerzeichen, das ^ - symbol ist auch bestanden, kann das jemand erklären so ist?
arbeiten.cmd
@echo off
call openfiles.cmd ^
C:\dir\filename.txt ^
C:\another_dir\another_file.txt
notworking.cmd
@echo off
call openfiles.cmd ^
"C:\dir with spaces\file with spaces.txt" ^
"C:\another dir with spaces\another file with spaces.txt"
openfiles.cmd sieht aus wie
@echo off
for %%x in (%*) do (
IF EXIST %%x (
call "c:\Program Files\Notepad++\notepad++.exe" %%x
) ELSE (
call echo Not found %%x
)
)
pause
die Fehler, die ich bekomme so Aussehen wie
C:\>call openfiles.cmd "C:\dir with spaces\file with spaces.txt" ^
ELSE was unexpected at this time.
- Denkt für den Versuch im obigen Beispiel habe ich extra Leerzeichen vor dem Anführungszeichen das original nicht, es scheint mein problem zu beheben
- Es nicht, da die quotes escaped und daher sind die Räume aufgeteilt werden kann die Dateinamen in kleinere Teile
- "Doppel" ist mein neues Lieblings-Wort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass das Zitat am Anfang der zweiten Zeile wird entgangen durch die multi-line-caret.
Also das Letzte Zitat in der Zeile beginnt das zitieren statt zu stoppen, und so wird der Cursor in die zweite Zeile behandelt wird als normales Zeichen.
Caret-Regel:
Einem caret-Zeichen entgeht der nächste Charakter, so dass der Charakter verliert alle special effects.
Wenn das nächste Zeichen ein Zeilenvorschub diese fallen und nehmen das nächste Zeichen (auch wenn das auch ein Zeilenvorschub).
Mit dieser einfachen Regel können Sie die Dinge erklären, wie
#3
erstellt eine Datei namens "Katze Hund" als Raum entgangen war und nicht arbeiten als Trennzeichen mehr.Aber es ist immer noch möglich, um diese Regel zu brechen!
Sie müssen nur eine Umleitung kurz vor dem caret-Zeichen, ist es immer noch Tropfen den Zeilenvorschub (multiline funktioniert immer noch), aber der nächste Charakter nicht entkommen mehr.
So können Sie auch verwenden diese, um Ihre mehrzeiligen Befehl
Oder mit einem makro
Nach dem Versuch einige verschiedene Dinge, die ich geschafft, es funktioniert nur mit einem extra Raum direkt vor dem Anführungszeichen.
Änderungen notworking.cmd den folgenden arbeitete
beachten Sie die Leerzeichen vor dem Anführungszeichen
^
nicht nur entgeht dernewline
sondern auch das erste Zeichen nach dem Zeilenumbruch und so Ihre erste"
wurde als ein Zeichen interpretiert, anstatt zu zitieren und Ihr Angebot am Ende der zweiten Zeile zitiert die^
Charakter, so dass es verliert seine Funktionalität. Durch ein Leerzeichen am Anfang der zweiten Zeile, die erste"
auf der zweiten Zeile nicht entkommen mehr und der Befehl funktioniert wie erwartet. Weitere details in meiner Antwort.kurz:
"
Zeichen werden müssen^
-entkommen, ansonsten cmd wörtlich kopiert^
Zeichen, die zwischen"
Paare.Warnung:
^
kopiert das Zeichen nach der Einfügemarke buchstäblich es verlieren alle Metazeichen Funktionalität, wenn es hatte. In einer multi-line-Szenario nicht nur die newline/linefeed kopiert wörtlich, aber auch das erste Zeichen in der neuen Linie ist auch entgangenErklärung:
Die
^
caret MetazeichenFolgende definition kopiert wird sub-Abschnitt des Artikels die "Alle Zitate Befehl Linie Argumente der falsche Weg", die von Daniel Colascione am April 23, 2011
nun für die wichtig relevanten Teil der vorgestellten problem:
Beachten Sie, dass wenn Sie
^"
, die"
verliert seine Funktionalität, wie das zitieren, so seien Sie vorsichtig getroffen werden müssen.Demo:
ohne
^
-Flucht"
wird
mit
^
-Flucht"
wird
und führt das Programm
Beachten Sie, dass
^
-escaping der Anführungszeichen macht Sie verlieren Ihre zitieren-Funktionalität, so dass dieser Befehl könnte auch ausgeführt werden, wie:c:\Program^ Files\test.bat
. Der Grund, warum wir normalerweise setzen Sie ihn in Anführungszeichen zu entfernen, die Abgrenzung der Funktion des Raumes Metazeichen, aber caret Flucht das Leerzeichen die gleiche Funktionalität bietet.mit
^
-Flucht"
, aber der Platz verschoben zur vorherigen Zeilewird
aber der Befehlszeile Berichte 'c:\Program' wird nicht erkannt...
Dies ist denn mit dem Leerzeichen in der ersten Zeile und der
"
Charakter^
-entkommen, die<space>
wird als Trennzeichen interpretiert und nicht als Zeichen.Mit dem zweiten Beispiel der
<space>
ist das erste Zeichen in der Zeile nach einem^
und ist dabei entkommen und interpretiert als Zeichen und nicht als Trennzeichen verwendet werden.Quellen:
Microsoft-Blog-Artikel
echo bla ^<LF>"cat & dog"
^
nicht nur kopiert wörtlich die<LF>
, aber die"
auf der neuen Linie aswell, so dass es Metazeichen verlieren Ihre Funktionalität zu zitieren. und dann die&
interpretiert die Metazeichen anstelle von text.^
-auf der Flucht vor der&
oder ein Leerzeichen am Anfang der neuen Zeile ist ein work-around, den ich gefunden habe.