IT

배치 파일에서 줄 바꿈을 어떻게 에코 할 수 있습니까?

lottoking 2020. 10. 3. 09:37
반응형

배치 파일에서 줄 바꿈을 어떻게 에코 할 수 있습니까?


배치 출력에서 ​​개행을 어떻게 삽입 할 수 있습니까?

다음과 같이하고 싶습니다.

echo hello\nworld

다음과 같이 출력됩니다.

hello
world

echo hello & echo.world

이 개행 & echo.에 대한 상수로 정의 할 수 있음을 의미합니다 \n.


사용하다 :

echo hello
echo.
echo world

여기에 다음이 포함 된 .bat 파일을 만듭니다.

@echo off
REM Creating a Newline variable (the two blank lines are required!)
set NLM=^


set NL=^^^%NLM%%NLM%^%NLM%%NLM%
REM Example Usage:
echo There should be a newline%NL%inserted here.

echo.
pause

다음과 같은 출력이 표시되어야합니다.

There should be a newline
inserted here.

Press any key to continue . . .

분명히 REM 문 사이에 코드가 필요합니다.


echo:cmd / bat-files에는 빈 줄을 작성 하는 표준 기능이 있으며, cmd 출력에서 ​​새 줄을 에뮬레이트합니다.

@echo off
@echo line1
@echo:
@echo line2

cmd-file 위에 인용 된 출력 :

line1

line2

Ken의 대답과 인터뷰 지연된 확장을 사용합니다.

setlocal EnableDelayedExpansion
(set \n=^
%=Do not remove this line=%
)

echo Line1!\n!Line2
echo Works also with quotes "!\n!line2"

먼저 단일 줄 바꿈 문자가 만들어져 \ n- 변수에 할당됩니다.
이것은 라인 끝의 캐럿이 다음 문자를 이스케이프하려고 시도하는 것처럼 작동하지만 이것이 라인 피드 인 경우 무시되고 다음 문자를 읽고 이스케이프합니다 (이것도 라인 피드 인 경우에도).
그런 다음 현재 명령어를 끝내려면 세 번째 줄 바꿈이 필요합니다. 그렇지 않으면 세 번째 줄이 LF 변수에 추가됩니다.
배치 파일에도 CR / LF로 끝나는 줄이 있습니다. 파서의이 단계에서 CR이 제거되므로 LF 만 중요합니다.

지연 확장 사용의 장점은 특수 문자 처리가 전혀 없다는 것입니다.
echo Line1%LF%Line2파서가 단일 줄 바꿈에서 구문 분석을 중지하므로 실패합니다.

자세한 설명은
Vista / DOS 배치 (.bat) 파일 에서 SO : Long 명령이 여러 줄로 분할되어 있습니다.
SO : Windows Command Interpreter (CMD.EXE)는 스크립트를 어떻게 구문 분석합니까?

편집 : 피하십시오 echo.

질문은 echo여러 줄을 출력 할 수있는 단일에 관한 것이기 때문에 질문에 대한 답이 아닙니다 .

그러나 echo.새 줄을 만드는 데 사용을 제안하는 다른 답변에도 불구하고 echo.cmd.exe가 이름이 지정된 파일을 검색 ECHO하고 시작하려고 할 때 매우 느리고 완전히 실패 할 수 있으므로 최악의 것입니다.

빈 줄만 인쇄하려면 다음 중 하나를 사용할 수 있습니다.

echo,
echo;
echo(
echo/
echo+
echo=

그러나 네트워크 드라이브와 같이 스크립트가 실행될 위치에 따라 매우 느릴 수 있으므로 echo., echo\또는 사용을 echo:피해야합니다.


echo. 충분했다.

한 줄에 필요하면 &. 예를 들면

echo Line 1 & echo. & echo line 3

다음과 같이 출력됩니다.

Line 1

line 3

이제 조금 더 멋진 것을 원한다고 말하십시오 ...

set n=^&echo.
echo hello %n% world

출력

hello
world

그런 다음 %n%echo 문에서 새 줄을 원할 때마다 던지십시오 . 이것은 \n다양한 언어로 사용되는 것에 더 가깝습니다 .

고장

set n=변수 n를 다음과 같이 설정합니다 .

^ 따를 다음 기호를 Null합니다.

&같은 줄에서 다른 명령을 수행하는 것을 의미합니다. 우리는 errorlevel (큰 소리로 울기위한 echo 문)에 대해 신경 쓰지 않으므로 필요하지 않습니다 &&.

echo. echo 문을 계속합니다.

이 모든 것은 실제로 코드 인 변수를 생성하고 다른 명령 내에서 사용할 수 있기 때문에 작동합니다. 배치는 정확히 가장 발전된 쉘 스크립팅 언어가 아니기 때문에 일종의 게토 함수와 같습니다. 이것은 일괄 처리의 변수 사용이 좋지 않기 때문에 작동하며 정수, 문자, 부동 소수점, 문자열 등을 자연스럽게 지정하지 않습니다.

당신이 교활하다면 다른 것들과 함께 작동하도록 할 수 있습니다. 예를 들어, 탭을 에코하는 데 사용

set t=^&echo.     ::there are spaces up to the double colon

파일로 리디렉션 할 항목을 에코 할 때 여러 에코 명령이 작동하지 않습니다. ">>"리디렉터가 좋은 선택이라고 생각합니다.

echo hello> 임시
에코 세계 >> 온도

Grimtron이 제안한 것처럼-다음은이를 정의하는 간단한 예입니다.

@echo off
set newline=^& echo.
echo hello %newline%world

산출

C:\>test.bat
hello
world

결과를 파일에 넣어야하는 경우 다음을 사용할 수 있습니다.

(echo a & echo. & echo b) > file_containing_multiple_lines.txt

이렇게 할 수도 있습니다.

(for %i in (a b "c d") do @echo %~i)

출력은 다음과 같습니다.

a
b
c d

배치 파일에 넣으면 '%'가 두 배가됩니다.

(for %%i in (a b "c d") do @echo %%~i)

MINGW make makefile에서 빈 줄을 에코하기 위해 여기에 온 사람이 있으면

@cmd /c echo.

단순히 사용 echo.하면 두려운 process_begin: CreateProcess(NULL, echo., ...) failed.오류 메시지가 발생합니다.

나는 이것이 적어도 한 명의 다른 사람에게 도움이되기를 바랍니다. :)


새 줄을 일괄 적으로 시작하려면 다음과 같이 "echo ["를 추가하기 만하면됩니다.

echo Hi!
echo[
echo Hello!

이것은 나를 위해 일했으며 지연된 확장이 필요하지 않았습니다.

@echo off
(
echo ^<html^> 
echo ^<body^>
echo Hello
echo ^</body^>
echo ^</html^>
)
pause

다음과 같이 출력을 씁니다.

<html>
<body>
Hello
</body>
</html>
Press any key to continue . . .

Ken과 Jeb 솔루션이 잘 작동합니다.

그러나 새 줄은 LF 문자로만 생성되며 CRLF 문자가 필요합니다 (Windows 버전).

이를 위해 스크립트 끝에서 LF를 CRLF로 변환했습니다.

예:

TYPE file.txt | FIND "" /V > file_win.txt
del file.txt
rename file_win.txt file.txt

변수에 전달할 수있는 문자열 리터럴에서 유명한 \ n을 사용해야하는 경우 아래 Hello.bat 스크립트 와 같은 코드를 작성할 수 있습니다.

@echo off
set input=%1
if defined input (
    set answer=Hi!\nWhy did you call me a %input%?
) else (
    set answer=Hi!\nHow are you?\nWe are friends, you know?\nYou can call me by name.
)

setlocal enableDelayedExpansion
set newline=^


rem Two empty lines above are essential
echo %answer:\n=!newline!%

이런 식으로 여러 줄 출력은 다른 스크립트 또는 외부 파일에서도 한곳에서 준비하고 다른 곳에서 인쇄 할 수 있습니다.

줄 바꿈은 개행 변수에 유지됩니다 . 이 값은 교체해야 에코 라인은 내가 사용 있도록 확장 SETLOCAL enableDelayedExpansion을 실행에 변수를 확장 느낌표 표시를 가능하게 할 수 있습니다. 그리고 실행은 \ n개행 내용으로 대체 합니다 ( help set 에서 구문을 찾으십시오 ). 물론 우리는 ! newline을 사용할 수 있습니다 ! , 설정하면서 대답을 하지만 \ n 더 편리합니다. 줄 바꿈을 잡고있는 변수의 이름을 아무도 모르는 외부 ( Hello R2 \ nD2 시도)에서 전달할 수 있습니다 (예, Hello C3! newline! P0 같은 방식으로 작동).

위의 예는 다음과 같이 사용되는 서브 루틴 또는 독립형 배치로 구체화 될 수 있습니다 call:mlecho Hi\nI'm your comuter.

:mlecho
setlocal enableDelayedExpansion
set text=%*
set nl=^


echo %text:\n=!nl!%
goto:eof

추가 백 슬래시가 스크립트가 하위 문자열을 \ n 구문 분석하는 것을 막지는 않습니다.


@echo(@echo + [space] + [insecable space])를 사용할 수 있습니다.

참고 : 안전하지 않은 공간은 Alt + 0160으로 얻을 수 있습니다.

도움이되기를 바랍니다 :)

흠 당신 말이 맞습니다. Makefile에 필요했습니다. 완벽하게 작동합니다. 내 대답은 배치 파일에 적합하지 않은 것 같습니다.


다음보다 더 간단하게 만들 수는 없습니다.

echo echo hello^&echo world^&pause>silly.bat                       
call silly.bat

Linux 시스템에서이를 수행하는 가장 문자 보수적 인 방법 -e은 백 슬래시 된 이스케이프 된 문자를 해석 하는 별칭을 사용하는 것입니다.

echo -e "hello\nworld"

다음은 다른 예입니다.

참고 URL : https://stackoverflow.com/questions/132799/how-can-i-echo-a-newline-in-a-batch-file

반응형