К сожалению, это невозможно продемонстрировать в комментарии, потому что несколько пробелов уменьшены до одного. Поэтому я делаю в ответе то, что на самом деле является просто комментарием к ответу @ solutionJ, который я считаю лучшим.

ые команды в пакетных файлах Windows можно разбить на несколько строк с помощью^ как упомянуто вДлинные команды разделены на несколько строк в пакетном файле Windows Vista (.bat).

Однако, если каретка находится внутри строки в двойных кавычках, она не будет работать. Например:

echo "A very long line I want to ^
split into two lines"

Это напечатает"A very long line I want to ^ и скажи мнеsplit это неизвестная команда

Есть ли способ обойти это?

Ответы на вопрос(4)

но они не будут функционально цитировать содержимое, если речь идет о CMD.EXE.

@echo off
echo ^"A very long line I want to ^
split into two lines^"

Любые специальные символы, которые появляются в строке, также должны быть экранированы, поскольку они больше не являются функционально заключенными в кавычки.

@echo off
echo ^"A very long line I want to ^
split into two lines ^
that also contains special characters ^^ ^& ^| ^> ^< ^"

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

@echo off
echo ^"A very long line I want to ^
split into two lines ^
that also contains special characters ^^ ^
& ^| ^> ^< ^"
 dbenham12 апр. 2012 г., 22:43
Мне также больше нравятся исчезающие цитаты :-)
 G-Wiz22 окт. 2013 г., 04:29
Пока вы знаете, что карета - это спасательный персонаж, я думаю, что эту технику гораздо легче запомнить. Нет необходимости понимать / включать отложенное расширение, а также понимать / запоминать отложенное расширениемотыга, Но каждому свое.
 jeb12 апр. 2012 г., 22:26
+1, но я предпочитаю исчезать кавычки, так как вам не нужно экранировать специальные символы

что совершенно очевидно, что происходит, и что в левой части есть пространственное разделение уродливого содержимого cmd, а справа - фактическое содержимое. И это может быть улучшено в удобочитаемости, помещая больше места между левой и правой частью:

set      CMD=   docker run --rm
set CMD=%CMD%     --platform=linux
set CMD=%CMD%     -v %CD%:/work
set CMD=%CMD%     dockcross/%IMAGE_NAME%
set CMD=%CMD%     /bin/sh -c
set CMD=%CMD%       "mkdir build-%IMAGE_NAME% &&
set CMD=%CMD%       cd build-%IMAGE_NAME% &&
set CMD=%CMD%       cmake .. &&
set CMD=%CMD%       cmake --build ."

К сожалению, это невозможно продемонстрировать в комментарии, потому что несколько пробелов уменьшены до одного. Поэтому я делаю в ответе то, что на самом деле является просто комментарием к ответу @ solutionJ, который я считаю лучшим.

и я никогда не видел, чтобы это предложило где-либо, поэтому я решил опубликовать его здесь. Конечно, это не элегантно в объективном смысле. Я бы сказал, что у него есть свой уникальный уродливый вид и некоторые ограничения, но я считаю его гораздо более «эргономичным» по сравнению с альтернативами.

В частности, этот метод обладает уникальной характеристикой: ему не нужно ничего избегать, но при этом выполняется типичная замена переменных. Это позволяет мне взять некоторую строку, которая выглядит именно так, как я хочу, распределить ее по нескольким строкам и добавить префикс к каждой строке, не изменяя ничего в строке. Таким образом, нет необходимости в методах проб и ошибок, чтобы выяснить, как могут взаимодействовать специальные символы и escape-символы. В целом, я думаю, что это уменьшает когнитивную нагрузку, необходимую для детерминированного создания сложной строковой переменной на нескольких строках, что хорошо для меня, потому что я не хочу задумываться и расстраиваться из-за случайной сложности, такой как нюансы команды windows переводчик. Кроме того, подобная техника может быть использована в Linux Bash, что делает его несколько портативным.

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

set IMAGE_NAME=android-arm64
set CMD=docker run --rm
set CMD=%CMD% --platform=linux
set CMD=%CMD% -v %CD%:/work
set CMD=%CMD% dockcross/%IMAGE_NAME%
set CMD=%CMD% /bin/sh -c
set CMD=%CMD% "mkdir build-%IMAGE_NAME% &&
set CMD=%CMD% cd build-%IMAGE_NAME% &&
set CMD=%CMD% cmake .. &&
set CMD=%CMD% cmake --build ."

echo %CMD%

В моем случае это команда, поэтому я могу запустить ее с помощью:

%CMD%

Я был бы открыт для любых отзывов или предложений об этом методе. Возможно, это даже можно улучшить.

Решение Вопроса

1) Построение линии, объединяющей несколько for-параметров.

@echo off
SETLOCAL EnableDelayedExpansion

set "line="
for %%a in ("line1" 
"line2"
"line3"
"line4"
) do set line=!line!%%~a
echo !line!

2) Оставляя "цитата" в конце каждой строки

@echo on
SETLOCAL EnableDelayedExpansion

set "line=line1 & x#"^
 "line2 & a#"^
 "line3 & b #"^
 "line4 & c "

set "line=!line:#" "=!"
echo !line!

Первый пробел в каждой строке важен, потому что каретка работает как многострочный символ, но также экранирует первый символ, поэтому кавычка также будет экранирована.
Поэтому я заменяю неестественный # "" после построения линии.

РЕДАКТИРОВАТЬ Добавлено: 3) Исчезающие цитаты

setlocal EnableDelayedExpansion
echo "A very long line I want to !"=!^
split into two lines"

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

Вы также можете создатьбезопасный выражения, они всегда будут выходить из кавычек, независимо от того, есть ли кавычка или нет в строке.
!"^"=!

echo This multiline works !"^"=!^
as expected
echo "This multiline works !"^"=!^
too"

Если вы хотите избежать отложенного расширения, вы также можете использовать -FOR-Loop как

for %%^" in ("") do (
echo "This multiline works %%~"^
too"
)
 Wang Dingwei10 янв. 2011 г., 15:45
Ответ не прост, но это несколько классных трюков! Я хотел бы иметь несколько голосов против. Спасибо!
 G.P. Greenleaf18 янв. 2018 г., 20:19
Первый метод работал для меня, я просто удалил кавычки вокруг переменной в строке 4, потому что я получал сообщение о том, что переменная среды не существует. После этого все заработало отлично.
 djangofan14 сент. 2012 г., 02:18
Мне действительно очень нравится метод № 1. Есть ли какие-то ошибки на этот метод?
 jeb14 сент. 2012 г., 09:31
Не получается с такими персонажами, как*? и, как цикл for, попытайтесь использовать их в качестве символов подстановки. Но тогда вы можете переключиться на цикл FOR / F

Ваш ответ на вопрос