Я вижу три возможных обходных пути.
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"
По моему это best , он работает так, как синтаксический анализатор сначала видит кавычки, и, следовательно, последняя каретка будет работать, как кажется, за пределами кавычек.
Но это выражение !"=!
расширит переменнуюс именем "=
, но такое имя переменной не может существовать (знак равенства может встречаться только в качестве первого символа), поэтому оно расширяется до нуля.
Вы также можете создавать безопасные выражения, они всегда будут выходить из кавычек, независимо от того, есть ли кавычка или нет в строке.
!"^"=!
echo This multiline works !"^"=!^
as expected
echo "This multiline works !"^"=!^
too"
Если вы хотите избежать отложенного расширения, вы также можете использовать -FOR-Loop, например
for %%^" in ("") do (
echo "This multiline works %%~"^
too"
)