2011-01-10 13 views
23

I comandi lunghi nei file batch di Windows possono essere suddivisi su più righe utilizzando lo ^ come indicato in Long commands split over multiple lines in Windows Vista batch (.bat) file.Come suddividere la doppia linea tra virgolette in più righe nel file batch di Windows?

Tuttavia, se il cursore si trova all'interno di una stringa con doppia quotatura, non funzionerà. Per esempio:

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

Questo stamperà "A very long line I want to ^ e ditemi split è un comando sconosciuto.

C'è un modo per aggirare questo?

risposta

18

Vedo tre possibili soluzioni.

1) Costruire la linea combinando più parametri per.

@echo off 
SETLOCAL EnableDelayedExpansion 

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

2) Lasciando il "preventivo" alla fine di ogni riga

@echo on 
SETLOCAL EnableDelayedExpansion 

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

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

Il primo spazio in ciascuna riga è importante, perché il cursore funziona carattere multilinea ma sfugge anche il primo personaggio, quindi anche una citazione sarebbe sfuggita.
Quindi sostituisco il # "non necessario dopo aver costruito la linea.

EDIT Aggiunto: 3) scomparsa cita

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

A mio parere questo è il modo migliore , funziona come il parser prima vedere le virgolette e quindi l'ultima cursore funziona, in quanto sembra essere al di fuori delle virgolette.
Ma questa espressione !"=! espande la variabile denominata "=, ma tale nome di variabile non può esistere (un segno di uguale può verificarsi solo come primo carattere) quindi non si espande.

È anche possibile creare sicure espressioni, esse scappano sempre dalle virgolette, indipendentemente se c'è una citazione o meno nella riga.
!"^"=!

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

Se si vuole evitare l'espansione ritardata, si potrebbe anche usare un for-loop come

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

La risposta non è semplice, ma questi sono alcuni trucchi interessanti! Vorrei poter avere più upvotes. Grazie! –

+0

Mi piace molto il metodo # 1. Ci sono dei segreti su questo metodo? – djangofan

+0

Fallisce con caratteri come '*?' E, poiché il ciclo for tenta di usarli come caratteri jolly. Ma poi puoi passare a un ciclo FOR/F – jeb

7

La risposta in avanti più retta è di sfuggire le virgolette. Verranno stampati, ma non verranno citati dal punto di vista funzionale per quanto riguarda CMD.EXE.

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

Eventuali caratteri speciali visualizzati nella riga devono anche essere sfuggiti poiché non vengono più citati dal punto di vista funzionale.

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

Come detto jeb, la continuazione della riga sfugge al primo carattere della riga successiva. Quindi se il primo carattere della riga successiva sembra essere un personaggio speciale, non dovrebbe essere sfuggito una seconda volta.Il codice qui sotto darà gli stessi risultati dell'esempio precedente.

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

+1, ma preferisco scomparire le virgolette, poiché non è necessario sfuggire ai caratteri speciali – jeb

+0

Mi piacciono anche le citazioni che scompaiono :-) – dbenham

+0

Finché sai che il carattere di escape è il carattere di escape, penso che questa tecnica sia molto più facile da ricordare. Non c'è bisogno di capire/abilitare l'espansione ritardata, né capire/memorizzare un'espansione ritardata * hack *. Ma a ciascuno il suo. –

Problemi correlati