Как разделить длинные команды на несколько строк в командном файле?
Разделение длинных команд на несколько строк через командный файл
Ответ 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
Обратите внимание, что после приветствия или перед допросом не требуется никакого пространства.