Присвоение символа новой строки переменной в пакетном скрипте - PullRequest
8 голосов
/ 26 августа 2010

Ниже приведен пакетный скрипт, который я написал

@echo off
setlocal enabledelayedexpansion
set finalcontent=
For /F "tokens=1-2* delims=  " %%I in (abc.txt) do (
IF %%J EQU MAJORVER (
set currentline=%%I %%J %1
set finalcontent=!finalcontent!!currentline!
) ELSE IF %%J EQU MINORVER (
set currentline=%%I %%J %2
set finalcontent=!finalcontent!!currentline!
) ELSE IF %%J EQU BUILDNUM (
set currentline=%%I %%J %3
set finalcontent=!finalcontent!!currentline!
) ELSE (
set currentline=%%I %%J %%K%NL%
set finalcontent=!finalcontent!!currentline!
)
)
echo %finalcontent%>>xyz.txt

Я хочу, чтобы символ новой строки добавлялся в конце каждого вхождения переменной currentline. Кто-нибудь может наставить меня в этом?

Ответы [ 2 ]

20 голосов
/ 13 апреля 2011

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

setlocal EnableDelayedExpansion
set LF=^


rem TWO empty lines are required
echo This text!LF!uses two lines

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

set LF=^


rem TWO empty lines are required
echo This text^%LF%%LF%uses two lines
echo This also^

uses two lines

Как это работает?
Символ каретки является escape-символом, он экранирует следующий символ и сам удаляется.
Но если следующий символ является переводом строки, перевод строки также удаляется, и только следующий символ эффективно экранируется (даже если это также перевод строки).

Следовательно, требуются две пустые строки, LF1 игнорируется, LF2 экранируется и LF3 необходим для завершения «строки».

set myLinefeed=^<LF1>
<LF2>
<LF3>

Подсказка:
Часто лучше использовать совершенно другой формат определения переменной newline, чтобы избежать случайного удаления необходимых пустых строк.

(SET LF=^
%=this line is empty=%
)

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

И параноидальная версия проверяет также переменную newline на наличие пробелов или другого мусора.

if "!LF!" NEQ "!LF:~0,1!" echo Error "Linefeed definition is defect, probably multiple invisble whitespaces at the line end in the definition of LF"

FOR /F "delims=" %%n in ("!LF!") do (
  echo Error "Linefeed definition is defect, probably invisble whitespaces at the line end in the definition of LF"
)
7 голосов
/ 05 апреля 2011

Вы можете определить новую строку следующим образом:

set newline=^& echo.

Затем вы можете использовать новую строку в выражении echo, например так: (однако, неприменимо в описанной ситуации)

echo %finalcontent%%newline%

или вы можете использовать символ новой строки в каждом выражении-наборе, например: (обратите внимание на дополнительную строку)

set finalcontent=!finalcontent!!currentline!^!newline!

или аналогично:

set currentline=%%I %%J %1^%newline%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...