2011-01-10 4 views
23

Lange Befehle in Windows-Stapeldateien können in mehrere Zeilen aufgeteilt werden, indem ^ wie in Long commands split over multiple lines in Windows Vista batch (.bat) file erwähnt verwendet wird.Wie teilt man doppelt zitierte Zeilen in mehrere Zeilen in der Windows-Stapeldatei auf?

Wenn das Caret jedoch in einer doppelten Zeichenfolge in Anführungszeichen steht, funktioniert es nicht. Zum Beispiel:

echo "A very long line I want to^
split into two lines" 

Dies wird "A very long line I want to ^ drucken und sagen Sie mir split ist ein unbekannter Befehl.

Gibt es eine Möglichkeit, dies zu umgehen?

Antwort

18

Ich sehe drei mögliche Problemumgehungen.

1) Erstellen der Linie, die mehrere For-Parameter kombiniert.

@echo off 
SETLOCAL EnableDelayedExpansion 

set "line=" 
for %%a in ("line1" 
"line2" 
"line3" 
"line4" 
) do set line=!line!%%~a 
echo !line! 

2)

@echo on 
SETLOCAL EnableDelayedExpansion 

set "line=line1 & x#"^ 
"line2 & a#"^ 
"line3 & b #"^ 
"line4 & c " 

set "line=!line:#" "=!" 
echo !line! 

Der erste Raum der „quote“ am Ende jeder Zeile verlassen in jeder Zeile ist wichtig, weil die caret als mehrzeilige Charakter funktioniert, aber es entgeht auch das erste Zeichen, also auch ein Zitat, wäre geflüchtet.
Also ersetze ich die unesshafte # "" nach dem Aufbau der Linie.

EDIT Hinzugefügt: 3) Disappearing zitiert

setlocal EnableDelayedExpansion 
echo "A very long line I want to !"=!^ 
split into two lines" 

diese Meiner Meinung nach ist die beste Art und Weise, es funktioniert wie der Parser zuerst die Anführungszeichen sehen und damit die letzte caret funktionieren wird, wie es scheint außerhalb der Zitate zu sein.
Aber dieser Ausdruck !"=! erweitert die Variable mit dem Namen "=, aber solch ein Variablenname kann nicht existieren (ein Gleichheitszeichen kann nur als erstes Zeichen auftreten), so dass es zu nichts erweitert.

Sie können auch sichere Ausdrücke erstellen, sie werden immer aus Anführungszeichen entkommen, unabhängig, ob es ein Zitat oder nicht in der Zeile gibt.
!"^"=!

echo This multiline works !"^"=!^ 
as expected 
echo "This multiline works !"^"=!^ 
too" 

Wenn Sie verzögerte Expansion wollen vermeiden, können Sie auch eine -FÜR-Schleife verwenden, wie

for %%^" in ("") do (
echo "This multiline works %%~"^ 
too" 
) 
+0

Die Antwort ist nicht einfach, aber das sind ein paar coole Tricks! Ich wünschte, ich könnte mehrere Upvotes haben. Vielen Dank! –

+0

Ich mag wirklich Methode # 1. Gibt es irgendwelche Fragen zu dieser Methode? – djangofan

+0

Es schlägt mit Zeichen wie '*?' Fehl und versucht als For-Schleife, sie als Platzhalter zu verwenden. Aber dann können Sie zu einer FOR/F-Schleife wechseln – jeb

7

Die direkteste Antwort ist die Anführungszeichen zu entkommen. Sie werden gedruckt, aber sie werden den Inhalt nicht funktional zitieren, soweit es CMD.EXE betrifft.

Alle Sonderzeichen, die in der Zeile erscheinen, müssen ebenfalls maskiert werden, da sie nicht mehr funktional zitiert werden.

Wie Jeb sagte, entgeht die Zeilenfortsetzung dem ersten Zeichen der nächsten Zeile. Wenn also das erste Zeichen der nächsten Zeile ein Sonderzeichen ist, sollte es kein zweites Mal ausgegeben werden.Der folgende Code gibt genau die gleichen Ergebnisse wie das vorherige Beispiel.

@echo off 
echo ^"A very long line I want to^
split into two lines^
that also contains special characters ^^^
& ^| ^> ^< ^" 
+1

+1, aber ich bevorzuge Verschwinden Zitate, wie Sie müssen nicht die Sonderzeichen zu entkommen – jeb

+0

Ich mag die verschwinden Zitate besser als auch :-) – dbenham

+0

Solange Sie wissen, ist Caret der Flucht Charakter, ich denke, diese Technik ist viel leichter zu merken. Keine Notwendigkeit, verzögerte Expansion zu verstehen/aktivieren, oder eine verzögerte Expansion zu verstehen/zu merken * hack *. Aber jedem sein eigenes. –

Verwandte Themen