Пакетные файлы поддерживают многострочные переменные - PullRequest
19 голосов
/ 21 июля 2010

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

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

редактировать

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

set var="this is a 
multi 
line 
string "

Ответы [ 9 ]

21 голосов
/ 12 августа 2011

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

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. (который полезен для простых задач) .

14 голосов
/ 21 июля 2010

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

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

edit
это то, что вы имеете в виду?

@echo off
set nl=^& echo.
echo this%nl%is%nl%multiline%nl%string
3 голосов
/ 25 августа 2014
SET myFlags= ^
    a ^
    b ^
    c
1 голос
/ 17 июля 2015

Это довольно старый вопрос, но я собрал гибрид решений @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!
1 голос
/ 20 ноября 2012

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

echo this is a & echo multi & echo line & echo string
0 голосов
/ 08 июля 2019

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

set NL=^& echo

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

echo %str%
text on line 1
text on line 2
0 голосов
/ 22 декабря 2018

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

@ECHO OFF
SETLOCAL EnableDelayedExpansion

REM (define NewLine character)
(SET _NL=^
%=this line is empty=%
)
0 голосов
/ 04 мая 2018

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


Во-первых, вы должны сделать файл. Такие как .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 почему) . Поэтому я подумал и сделал эти коды, которые дают одинаковый эффект.

0 голосов
/ 04 мая 2018

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


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

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

set this=echo hi ^& echo bye

%this%

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

hi
bye

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


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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...