Podziel długie polecenia na wiele wierszy w pliku wsadowym systemu Windows

735

Jak mogę podzielić długie polecenia na wiele wierszy w pliku wsadowym?

Ondra Žižka
źródło

Odpowiedzi:

917

Możesz łamać długie linie za pomocą karetki, ^o ile pamiętasz, że karetka i następująca po niej nowa linia są całkowicie usunięte. Więc jeśli powinno być miejsce, w którym przerywasz linię, dołącz spację. ( Więcej na ten temat poniżej. )

Przykład:

copy file1.txt file2.txt

byłoby napisane jako:

copy file1.txt^
 file2.txt
Wayne
źródło
95
Możesz rozpocząć następny wiersz bez spacji, jeśli dodasz spację bezpośrednio przed ^i po tekście polecenia.
Joseph Daigle,
4
@SebaIllingworth - Nie, zawsze możesz dodać [SPACJĘ] + [^] i dwa puste wiersze, aby utworzyć w sumie 2 kanały liniowe, gdy jest echoedytowany.
James K
12
Ze względów bezpieczeństwa zawsze używaj pustych linii , patrz Prosty karat w pliku wsadowym zużywa całą pamięć
mat Wilkie
4
@GavinMiller: „caret ^ po skopiowaniu i file1.txt w nowym wierszu nie działa” To nieprawda. Możesz podzielić linię w dowolnym miejscu, w tym w środku słowa, na przykład co^␍py ^␍file1 ^␍file2. Sugeruję usunięcie komentarza, aby uniknąć nieporozumień, zwłaszcza że ten quest jest tak popularny
Borodin
3
Jednym z nich jest to, że ^ musi być ostatnim znakiem w linii - tzn. Bez spacji po. Miałem z tym problem i okazało się, że po daszku mam sporo miejsca - niezbyt dobrze widoczne w edytorze, którego używałem.
GregHNZ
266

Reguła dla karetki jest następująca:

Daszek na końcu linii dołącza następny wiersz, pierwszy znak dołączonej linii zostanie zastąpiony znakiem ucieczki.

Możesz używać karetki wiele razy, ale pełna linia nie może przekraczać maksymalnej długości ~ 8192 znaków (Windows XP, Windows Vista i Windows 7).

echo Test1
echo one ^
two ^
three ^
four^
*
--- Output ---
Test1
one two three four*

echo Test2
echo one & echo two
--- Output ---
Test2
one
two

echo Test3
echo one & ^
echo two
--- Output ---
Test3
one
two

echo Test4
echo one ^
& echo two
--- Output ---
Test4
one & echo two

Aby powstrzymać ucieczkę następnej postaci, możesz użyć przekierowania.

Przekierowanie musi nastąpić tuż przed kursorem. Ale istnieje jedna ciekawość z przekierowaniem przed daszkiem.

Jeśli umieścisz token w karetce, token zostanie usunięty.

echo Test5
echo one <nul ^
& echo two
--- Output ---
Test5
one
two


echo Test6
echo one <nul ThisTokenIsLost^
& echo two
--- Output ---
Test6
one
two

Możliwe jest także osadzanie kanałów w wierszu :

setlocal EnableDelayedExpansion
set text=This creates ^

a line feed
echo Test7: %text%
echo Test8: !text!
--- Output ---
Test7: This creates
Test8: This creates
a line feed

Pusta linia jest ważna dla sukcesu. Działa to tylko z opóźnionym rozwinięciem, w przeciwnym razie reszta linii zostanie zignorowana po przesunięciu wiersza.

Działa, ponieważ karetka na końcu linii ignoruje przejście do następnego wiersza i ucieka od następnego znaku, nawet jeśli następny znak jest również przesunięciem wiersza (powrót karetki jest zawsze ignorowany w tej fazie).

jeb
źródło
Ostatni blok kodu z przykładem wstawiania wiersza nie wyświetla pustej linii, nawet jeśli ona tam jest. (Przynajmniej nie pojawia się w IE7) Spróbuj sformatować używając cytatu blokowego.
dbenham
5
Pytanie brzmi: czy powinniśmy wspierać złe narzędzie, które nie przestrzegało zasad (ktoś nazywa to przeglądarką, ale tak nie jest), czy też powinieneś przełączyć się na przeglądarkę?
jeb
1
Miałem podwójne cudzysłowy otaczające moje wartości, jak w zestawie var = "tutaj tekst ^", ale to nie działa. Usuń podwójny cytat i jest w porządku.
rjt 5.04.16
1
@jeb, napisałem przykład nieudanego skryptu cmd, ale potem znalazłem to pytanie: stackoverflow.com/questions/4643376/...
rjt
To nie działa, jeśli następny wiersz zaczyna się znakiem cudzysłowu: copy ^[newline]"file1.txt" ^[newline]"file2.txt"nie działa! Musiałem dodać spację: copy ^[newline] "file1.txt" ^[newline] "file2.txt".
Alexander Gelbukh
70

(Jest to w zasadzie przepisanie odpowiedzi Wayne'a, ale z wyjaśnieniem zamieszania wokół karetki. Więc opublikowałem to jako CW. Nie boję się redagować odpowiedzi, ale całkowicie przepisanie ich wydaje się nieodpowiednie).

Możesz przełamać długie wiersze za pomocą znaku karetki ( ^), pamiętaj tylko, że karetka i następująca po niej nowa linia są całkowicie usuwane z polecenia, więc jeśli umieścisz ją w miejscu wymaganym spacji (np. Między parametrami), upewnij się, że aby uwzględnić również spację (albo przed ^, albo na początku następnego wiersza - ten ostatni wybór może pomóc uczynić go bardziej zrozumiałym, jest to kontynuacja).

Przykłady: (wszystkie przetestowane na Windows XP i Windows 7)

xcopy file1.txt file2.txt

można zapisać jako:

xcopy^
 file1.txt^
 file2.txt

lub

xcopy ^
file1.txt ^
file2.txt

lub nawet

xc^
opy ^
file1.txt ^
file2.txt

(To ostatnie działa, ponieważ nie ma spacji między xci ^, i nie ma spacji na początku następnego wiersza. Więc po usunięciu ^i i nowej linii, dostajesz ... xcopy)

Dla czytelności i rozsądku najlepiej jest przełamać tylko między parametrami (pamiętaj o spacji).

Upewnij się, że nie^ jest to ostatnia rzecz w pliku wsadowym, ponieważ wydaje się, że jest z tym poważny problem .

T.J. Crowder
źródło
18

W nawiasie można umieścić wiele poleceń i rozłożyć je na wiele wierszy; więc coś takiego echo hi && echo hellomożna umieścić w ten sposób:

( echo hi
  echo hello )

Zmienne mogą również pomóc:

set AFILEPATH="C:\SOME\LONG\PATH\TO\A\FILE"
if exist %AFILEPATH% (
  start "" /b %AFILEPATH% -option C:\PATH\TO\SETTING...
) else (
...

Zauważyłem też za pomocą tagów ( ^), że ifwarunkowe lubiły je śledzić tylko wtedy, gdy było spacje:

if exist ^
Todd Partridge
źródło
1
Linia cmd1.bat && cmd2.batróżni się od formy parens: wykonaj polecenie cmd2.batiff cmd1.batwykonane pomyślnie (bez ustawienia %errorcode%). Ta ostatnia forma jest wykonywana bezwarunkowo. Nieco nieoczekiwane (przynajmniej dla mnie) jest to, że oczywiście nie można użyć kombinacji obu +, tj. Dodać &&przed podziałem linii.
Paul Michalik
( echo <line break here> hello )skutkuje pustą linią.
Karl Morrison
najlepsza i najczystsza odpowiedź! opieki są brzydkie i problematyczne w wyrażeniu regularnym
neoscribe
9

Wydaje się jednak, że dzielenie w środku wartości pętli for nie wymaga karetki (i faktyczne próby użycia jednej z nich będą uważane za błąd składniowy). Na przykład,

for %n in (hello
bye) do echo %n

Pamiętaj, że po przywitaniu lub pożegnaniu nie jest potrzebne żadne miejsce.

Mohammed Safwat
źródło
Oczywiście jest to część forskładni: separatory elementów w „for-set” to spacja, przecinek, średnik, znak równości, znak TAB i znaki nowej linii.
Aacini,
Ale co jeśli doczęść zawiera wiele if-elseinstrukcji zagnieżdżonych ?
Vicky Dev,
Następnie możesz po prostu użyć nawiasów, aby załączyć instrukcje, takie jak dla% n w (cześć) do (echo% n echo% n)
Mohammed Safwat