Как разделить длинные команды на несколько строк в командном файле?
Как разделить длинные команды на несколько строк в командном файле?
Ответы:
Вы можете разбить длинные строки с помощью каретки, ^
если помните, что каретка и символ новой строки после нее полностью удалены. Итак, если должен быть пробел, где вы ломаете линию, включите пробел. ( Подробнее об этом ниже. )
Пример:
copy file1.txt file2.txt
будет написано как:
copy file1.txt^
file2.txt
echo
.
co^␍py ^␍file1 ^␍file2
. Я предлагаю вам удалить свой комментарий, чтобы избежать путаницы, тем более что этот вопрос такой популярный
Правило для кареты:
Каретка в конце строки добавляет следующую строку, первый символ добавленной строки будет экранирован.
Вы можете использовать каретку несколько раз, но максимальная длина строки не должна превышать 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
Пустая строка важна для успеха. Это работает только с отложенным расширением, иначе остальная часть строки игнорируется после перевода строки.
Это работает, потому что каретка в конце строки игнорирует следующий перевод строки и экранирует следующий символ, даже если следующий символ также является переводом строки (возврат каретки всегда игнорируется в этой фазе).
copy ^[newline]"file1.txt" ^[newline]"file2.txt"
не работает! Я должен был добавить пробел: copy ^[newline] "file1.txt" ^[newline] "file2.txt"
.
(Это, в основном, переписывание ответа Уэйна, но с путаницей вокруг прояснения каретки. Поэтому я опубликовал его как CW. Я не стесняюсь редактировать ответы, но полностью переписывать их кажется неуместным)
Вы можете разбить длинные строки с помощью caret ( ^
), просто помните, что символ вставки и последующий символ строки полностью удаляются из команды, поэтому, если вы поставите его там, где потребуется пробел (например, между параметрами), убедитесь, что также включить пробел (либо перед ^
, либо в начале следующей строки - этот последний выбор может помочь прояснить, что это продолжение).
Примеры: (все протестировано на 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
)
Для удобочитаемости и здравомыслия, вероятно, лучше разбивать только между параметрами (не забудьте указать пробел).
Убедитесь, что ^
это не последнее, что есть в командном файле, так как это, похоже, является серьезной проблемой .
Несколько команд могут быть помещены в круглые скобки и распределены по многочисленным строкам; так что-то вроде 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 (
...
Кроме того, я заметил с помощью carets ( ^
), что if
условным выражениям нравилось, что они следовали только при наличии пробела:
if exist ^
cmd1.bat && cmd2.bat
отличается от формы parens: выполняется, cmd2.bat
если cmd1.bat
выполняется успешно (-без настройки %errorcode%
). Последняя форма выполняется безоговорочно. Несколько неожиданным (по крайней мере для меня) является то, что, очевидно, вы не можете использовать комбинацию обоих +, то есть добавить &&
до разрыва строки.
( echo <line break here> hello )
приводит к пустой строке.
Тем не менее, кажется, что разбиение по середине значений цикла for не нуждается в каретке (и попытка его использовать будет считаться синтаксической ошибкой). Например,
for %n in (hello
bye) do echo %n
Обратите внимание, что после приветствия или до свидания даже не требуется места.
for
синтаксиса: разделителями элементов в «for-set» являются пробел, запятая, точка с запятой, знак равенства, символ табуляции и новые строки.
do
часть содержит несколько вложенных if-else
операторов?
^
и после текста вашей команды.