Длинные команды разделены на несколько строк в пакете Windows Vista (.Bat-файл

Как заставить длинные команды проходить через несколько строк в пакетном файле Windows (Vista)?

5 ответов


вы можете разбить длинные строки с помощью каретки ^ пока вы помните, что курсор и новая строка, следующая за ним, полностью удалены. Итак, если должно быть пространство, где вы нарушаете линию, включите пространство. (подробнее об этом ниже.)

пример:

copy file1.txt file2.txt

было бы написано как:

copy file1.txt^
 file2.txt

правило для каретки:

курсор в конце строки, добавляет следующую строку, первый символ добавленной строки будет экранирован.

вы можете использовать Курсор несколько раз, но полная строка не должна превышать максимальную длину строки ~8192 символов (Windows XP, Windows Vista и 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

чтобы подавить экранирование следующего символа, вы можете использовать перенаправление.

перенаправление должно быть непосредственно перед знак вставки. Но есть одно любопытство с перенаправлением перед кареткой.

Если вы размещаете маркер на каретке, маркер удаляется.

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


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

и это также возможно embed line feeds в строку:

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

пустая строка важна для успеха. Это работает только с задержкой расширения, иначе остальная часть линии игнорируется после подачи линии.

он работает, потому что каретка на конце линии игнорирует следующая подача строки и экранирует следующий символ, даже если следующий символ также является подачей строки (возврат каретки всегда игнорируется на этом этапе).


(это в основном рерайт ответ Уэйна но с путаницей вокруг каретки прояснилось. Поэтому я разместил его как CW. Я не стесняюсь редактировать ответы, но полностью переписать их кажется неуместным.)

вы можете разбить длинные строки с помощью каретки (^), просто помните, что каретка и новая строка, которая следует за ней полностью удалены из команды, поэтому, если вы поместите его туда, где пространство потребуется (например, между параметрами), обязательно включите пространство (либо перед ^, или в начале следующей строки-Этот последний выбор может помочь сделать его более ясным, это продолжение).

примеры: (все протестировано на Windows XP и Windows 7)

xcopy file1.txt file2.txt

можно написать так:

xcopy^
 file1.txt^
 file2.txt

или

xcopy ^
file1.txt ^
file2.txt

или даже

xc^
opy ^
file1.txt ^
file2.txt

(последнее работает, потому что нет пространства между xc и ^, и без пробелов в начале следующей строки. Поэтому, когда вы удаляете ^ и новая линия, вы получите...xcopy.)

для читаемости и здравомыслия, вероятно, лучше всего разбивать только между параметрами (обязательно включать пространство).

убедитесь, что ^ is не последнее в пакетном файле, как там кажется, это серьезная проблема с этим.


несколько команд могут быть заключены в скобки и распределены по многочисленным строкам; так что что-то вроде echo hi && echo hello можно поставить так:

( echo hi
  echo hello )

переменные также могут помочь:

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

также я заметил с каретками (^), что if conditionals хотели, чтобы они следовали, только если пространство присутствовало:

if exist ^

Кажется, однако, что разделение в середине значений цикла for не требует каретки (и фактически попытка использовать ее будет считаться синтаксической ошибкой). Например,

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

обратите внимание, что пространство не требуется даже после hello или до bye.