Пакетные файлы поддерживают многострочные переменные

Если так, как?

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

изменить

То, что я хочу, это что-то вроде строк

set var="this is a 
multi 
line 
string "

Ответ 1

Или вы можете создать "настоящий" символ новой строки.

setlocal enableDelayedExpansion
set NL=^


rem two empty line required
echo first line !NL! second line
set multi=Line1!NL!Line2
set multi=!multi!!NL!Line3
echo !Multi!

В этом варианте новая строка является "нормальным" символом в строке, поэтому переменные действуют нормально, и вы можете назначить их другой переменной, это невозможно с трюком &echo. (что полезно для простых задач).

Ответ 2

Это нормально?

@echo off
set var=kur
set var2=kur2
echo var is = "%var%" and var2 is = %var2%

изменить
это то, что вы имеете в виду?

@echo off
set nl=^& echo.
echo this%nl%is%nl%multiline%nl%string

Ответ 3

SET myFlags= ^
    a ^
    b ^
    c

Ответ 4

И теперь - без вспомогательных команд SET:

echo this is a & echo multi & echo line & echo string

Ответ 5

Это довольно старый вопрос, но я собрал гибрид решений от @Fabricio и @jeb, которые работали корректно и добавили некоторую читаемость:

setlocal enableDelayedExpansion
set NL=^


rem two empty line required
set var=this is a !NL! ^
multi !NL! ^
line !NL! ^
string !NL!

echo !var!

Ответ 6

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


Вдохновленный чем-то, я нашел это работающим.

Для кодов в обычной командной строке:

set this=echo hi ^& echo bye

%this%

Он выдает две следующие две строки:

hi
bye

в окне командной строки.


Причина использования символа ^:

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

Ответ 7

Если вы хотите что-то создать, а не просто выводить данные, надеюсь, это будет полезно и вам.


Во-первых, вы должны сделать файл. Такие как .txt. Я собираюсь использовать var.txt в качестве примера.

Во-вторых, введите несколько строк переменных.

В-третьих, вот коды, но работает только для партии:

@echo off
set num=0
set /p this%num%=<"var.txt"
goto there

:there
set /a num=num+1
for /f "skip=%num%" %%a in (var.txt) do (set this%num% =%%a
goto there)
set num=0
goto build

:build
rem Example of using multi-lines of variable.
call echo %%this%num% %%
set /a num=num+1
for /f "skip=%num% delims=" %%a in (var.txt) do (call echo %%this%num% %%
goto build)
rem Just replace the commands with 'echo' part into something else which suits your situation.
pause >nul
exit

Я признаю, что, строго говоря, это не многострочная переменная, но, на мой взгляд, это лучше, чем ничего.

Вы можете спросить, почему бы просто не использовать команду setlocal EnableDelayedExpansion. Причина в том, что эта команда действительно работает для меня (IDK почему). Поэтому я подумал и сделал эти коды, которые дают одинаковый эффект.

Ответ 8

Я предпочитаю этот метод

@ECHO OFF
SETLOCAL EnableDelayedExpansion

REM (define NewLine character)
(SET _NL=^
%=this line is empty=%
)

Ответ 9

Я думаю, что я понял это. Мне пришлось добавить ^ к %NL% при помещении его в строку, в противном случае он скрывает текст после первого %NL% потому что он выполняется при установке, а не когда он выводится позже

set NL=^& echo

set str=text on line 1 ^%NL% text on line 2