Разделение длинных команд на несколько строк через командный файл

Как разделить длинные команды на несколько строк в командном файле?

Ответ 1

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

Пример:

copy file1.txt file2.txt

будет записываться как:

copy file1.txt^
 file2.txt

Ответ 2

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

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

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

Также можно вставлять строки в строку:

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

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

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

Ответ 3

(Это в основном переписка Wayne answer, но с путаницей вокруг каретки, проясненной. Поэтому я разместил ее как 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.)

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

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

Ответ 4

Несколько команд могут быть помещены в круглые скобки и распределены по нескольким строкам; поэтому что-то вроде 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 им нравились, только если присутствовало пространство:

if exist ^

Ответ 5

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

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

Обратите внимание, что после приветствия или перед допросом не требуется никакого пространства.