Jak mogę podzielić długie polecenia na wiele wierszy w pliku wsadowym?
Jak mogę podzielić długie polecenia na wiele wierszy w pliku wsadowym?
Odpowiedzi:
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
echo
edytowany.
co^␍py ^␍file1 ^␍file2
. Sugeruję usunięcie komentarza, aby uniknąć nieporozumień, zwłaszcza że ten quest jest tak popularny
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).
copy ^[newline]"file1.txt" ^[newline]"file2.txt"
nie działa! Musiałem dodać spację: copy ^[newline] "file1.txt" ^[newline] "file2.txt"
.
(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 xc
i ^
, 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 .
W nawiasie można umieścić wiele poleceń i rozłożyć je na wiele wierszy; więc coś takiego echo hi && echo hello
moż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 if
warunkowe lubiły je śledzić tylko wtedy, gdy było spacje:
if exist ^
cmd1.bat && cmd2.bat
różni się od formy parens: wykonaj polecenie cmd2.bat
iff cmd1.bat
wykonane 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.
( echo <line break here> hello )
skutkuje pustą linią.
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.
for
składni: separatory elementów w „for-set” to spacja, przecinek, średnik, znak równości, znak TAB i znaki nowej linii.
do
część zawiera wiele if-else
instrukcji zagnieżdżonych ?
^
i po tekście polecenia.