Тема: CMD/BAT: Возможность создания heredoc
Давно искал что-то подобное. В том смысле, что искал явно чужое и тыпался сделать что-то свое. В первом преуспел больше, а теперь пытаюсь компенсировать отсустствие второго некоторыми улучшениями первого.
Как говорит википедия:
Heredóc-синтаксис — способ определения строковых переменных в исходном коде программ
. . .
Heredoc-синтаксис позволяет определить строку, не заключая её в кавычки, в связи с чем необходимость экранирования этих символов отпадает.
Дословно, это возможность в тексте некоторой программы указать большой фрагмент произвольного текста внутри скрипта. Все более-менее продвинутые интерпретаторы имеют такие средства (за примерами предлагаю идти в гугл). А настоящем сообщении я поверду разговор о попытке внедрить heredoc в BAT/CMD файлы.
Исходные текст
Улучшение
-- перенаправление в файл в конце строки (пример закоммментирован)
-- допустимы любое количество пробельных символов-разделителей (пробел и табуляция)
-- более строгий синтаксис, но и в то же самое время более простой (при написании и чтении)
@echo off
set "hello=Hello world!"
set "lorem=Lorem ipsum dolor sit amet, consectetur adipiscing elit."
rem ( call :heredoc HTML & goto HTML ) >outerfile.txt
call :heredoc HTML & goto HTML
<html>
<title>!hello!</title>
<body>
<p>Variables in heredoc should be surrounded by the exclamation mark (^!).</p>
<p>!lorem!</p>
<p>Exclamation mark (^!) and caret (^^) MUST be escaped with a caret (^^).</p>
</body>
</html>
:HTML
goto :EOF
:: http://stackoverflow.com/a/15032476/3627676
:heredoc LABEL
setlocal enabledelayedexpansion
set go=
for /f "delims=" %%A in ( '
findstr /n "^" "%~f0"
' ) do (
set "line=%%A"
set "line=!line:*:=!"
if defined go (
if "!line!" == "!go!" goto :EOF & goto :next2
echo:!line!
)
rem Replace all TABs with SPACEs
for /f "tokens=1,2,3,4,5 delims=():>& " %%i in ( "!line: = !" ) do (
if "%%i %%j %%k %%l" == "call heredoc %1 goto" (
set "go=:%%m"
)
)
)
goto :EOF