Długie polecenia dzielone na wiele linii w Windows Vista batch (.bat) plik

Jak sprawić, by długie polecenia przechodziły przez wiele linii w pliku wsadowym Windows (Vista)?

Author: a_horse_with_no_name, 2008-09-16

5 answers

Możesz rozbijać 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. Jeśli więc powinna istnieć przestrzeń, w której łamiesz linię, Dołącz spację. (więcej na ten temat poniżej.)

Przykład:

copy file1.txt file2.txt

Zostałoby zapisane jako:

copy file1.txt^
 file2.txt
 723
Author: Wayne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-06 16:24:20

Zasada dla karetki brzmi:

Karetka na końcu linii dołącza następny wiersz, pierwszy znak dołączonej linii zostanie uniknięty.

Można używać karetki wiele razy, ale pełna linia nie może przekraczać maksymalnej długości linii ~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ępnego znaku, możesz użyć przekierowania.

Przekierowanie musi być tuż przed karetką. Ale istnieje jeden ciekawość z przekierowaniem przed karetką.

Jeśli umieścisz token na 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

I możliwe jest również osadzenie kanałów linii w łańcuchu:

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 rozszerzeniem, w przeciwnym razie reszta linii jest ignorowana po podaniu linii.

To działa, ponieważ karetka na końcu linii ignoruje następny kanał linii i ucieka następny znak, nawet jeśli następny znak jest również kanałem linii (zwroty karetki są zawsze ignorowane w tej fazie).

 224
Author: jeb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-24 19:56:57

(jest to w zasadzie przepisanie Odpowiedzi Wayne ' a, ale z zamieszaniem wokół karetki wyjaśnione. Więc wrzuciłem to jako CW. Nie wstydzę się edytować odpowiedzi, ale całkowicie przepisywanie ich wydaje się niestosowne.)

Możesz rozbijać długie linie za pomocą karetki (^), pamiętaj tylko, że karetka i następująca po niej nowa linia są usuwane całkowicie z polecenia, więc jeśli umieścisz ją tam, gdzie byłaby wymagana spacja (np. pomiędzy parametrami), należy również podać spację (albo przed ^, albo na początku następnej linii - ten drugi wybór może pomóc wyjaśnić, że 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 na xc i ^ i nie ma spacji na początku następnego Kolejka Więc kiedy usuniesz ^ i nową linię, otrzymasz...xcopy.)

Dla czytelności i zdrowego rozsądku najlepiej jest rozbijać tylko między parametrami (pamiętaj, aby uwzględnić spację).

Upewnij się, że ^ jest , a nie ostatnią rzeczą w pliku wsadowym, ponieważ wydaje się być poważnym problemem z tym.

 54
Author: T.J. Crowder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:50

Wiele poleceń może być umieszczonych w nawiasie i rozłożonych na liczne linie; więc coś w rodzaju echo hi && echo hello można umieścić w następujący sposób:

( echo hi
  echo hello )

Również zmienne mogą 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 również z carets (^), że if warunkowość lubiła, że podąża za nią tylko wtedy, gdy występuje przestrzeń:

if exist ^
 12
Author: Todd Partridge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-12 19:55:11

Wydaje się jednak, że dzielenie W Środku wartości pętli for nie wymaga karetki (a w rzeczywistości próba jej użycia będzie uważana za błąd składni). Na przykład,

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

Zauważ, że nie jest potrzebna spacja nawet po "hello" lub "before".

 7
Author: Mohammed Safwat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-24 11:07:50