Làm cách nào tôi có thể lặp lại một dòng mới trong một tệp bó?


642

Làm thế nào bạn có thể chèn một dòng mới từ đầu ra tập tin hàng loạt của bạn?

Tôi muốn làm một cái gì đó như:

echo hello\nworld

Mà sẽ xuất:

hello
world

6
Đã đến hữu ích cho tôi. Tôi đã phải làm tiếng vang \ n \ n | my_app.exe trong một tập lệnh. Tôi đã làm (echo. && echo.) | my_app.exe
Vignesh

2
Cách tiếp cận dễ dàng "Mã bắt đầu:"> echo hello & echo world, sẽ cung cấp cho bạn những gì bạn cần
prudviraj

1
Bạn có thể chèn một ascii chr vô hình (255) trên một dòng riêng biệt sẽ buộc một dòng mới trống. Giữ phím [alt] và nhấn 255 trên bàn phím. cái này chèn chr (255) là một hình vuông trống. tức là " echo (alt + 255) " Bạn chỉ có thể sử dụng bàn phím chứ không phải các số ở đầu bàn phím querty!
jwzumwalt

Cũng giống như một nửa sửa chữa máy tính đang cắm nó vào và bật nó lên, một nửa phát triển phần mềm là cái mà tôi gọi là kỹ thuật không gian . Chúng tôi cần dòng trống của chúng tôi chỉ như vậy.
Bob Stein

Còn cái này thì sao ? echo Yes&echo No
nhà khoa

Câu trả lời:


462

echo hello & echo.world

Điều này có nghĩa là bạn có thể định nghĩa & echo.là một hằng số cho một dòng mới \n.


43
ví dụ không cần một khoảng thời gian, nhưng bạn cần một khoảng để lặp lại một dòng trống rỗng:echo. && echo hello && echo. && echo world
matt wilkie

4
Bạn có thể làm điều này với một tiếng vang duy nhất để nó có thể được chuyển hướng đến một tập tin?
Shahbaz

46
@Shahbaz -$ (echo Hello && echo World) > ./File.txt
Nathan JB

25
Điều thời gian trong "tiếng vang." không bao giờ ngừng làm tôi ngạc nhiên Nó đã quá cũ và tôi vẫn luôn quên rằng dấu chấm phải được nối chặt chẽ với tên lệnh, không có khoảng trắng giữa. Không có lỗi trong bài viết của bạn, tôi viết điều này giống như một lời nhắc nhở: "echo". ! = "tiếng vang." !
quetzalcoatl

5
@quetzalcoatl, nó thậm chí còn xa lạ. Các nhân vật khác ngoài công việc chấm quá. SS64 cho biết cú pháp tốt hơn là echo(để cải thiện hiệu suất (vẫn không có khoảng trống bạn). Thảo luận mở rộng về các nhân vật khác và giá trị / sai sót của họ tại ECHO. FAILS để cung cấp văn bản hoặc dòng trống - Thay vào đó hãy sử dụng ECHO /
matt wilkie 29/07/2015

558

Sử dụng:

echo hello
echo.
echo world

16
Có thể trong khi cung cấp một chuỗi trong một câu lệnh echo không?
Brian R. Bondy

5
Tại sao bạn cần phải làm điều đó với một câu lệnh echo; Đâu là tác hại của việc có người khác?
Cướp

3
@Rob, tôi vừa gặp vấn đề này và không có cái nào trong số này hoạt động cả. Bạn cần lặp lại trong một tuyên bố trong ví dụ của tôi. Tôi đang tạo một số tệp tex từ HTML và tạo Makefile bằng cách sử dụng echo "Makefile contents (which has \n)" > MakefileVới nhiều tiếng vang, nó sẽ không hoạt động
Shahbaz

3
Sử dụng & (hoặc &&) để thực hiện chúng trong một câu lệnh: Ví dụ: để đặt "hello \ nworld" trong tệp txt:(echo hello & echo world) >> ./test.txt
Ned Martin

4
Đối với đầu ra nhiều dòng vào một tập tin tại sao không chỉ làm như sau? echo line 1 > Makefilevà sau đó echo line 2 >> Makefile. Sử dụng các >>nguyên nhân khiến đầu ra được gắn vào tệp, đó chính xác là hành vi bạn cần cho trường hợp này.
thức

141

Ở đây bạn đi, tạo một tập tin .bat với những điều sau đây:

@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

Bạn sẽ thấy đầu ra như sau:

There should be a newline
inserted here.

Press any key to continue . . .

Rõ ràng, bạn chỉ cần mã giữa các câu lệnh REM.


51
Rất ấn tượng, bạn có thể dành thời gian để giải thích cách thiết lập dòng NL = ^^ ^ %% NLM %% NLM% ^% NLM %% NLM% hoạt động không? Tôi hoàn toàn không thể quay đầu lại được
Andy Morris

8
@andy methinks một bình luận +8 đảm bảo một câu hỏi: stackoverflow.com/questions/6379619/NH
matt wilkie

82
Đây là một ví dụ tuyệt vời để chỉ ra rằng các tệp bó cmd.exe và Windows hoàn toàn điên rồ!
mivk

12
LƯU Ý ĐỂ TỰ: Dòng "đặt NLM = ^" phải không có gì sau CARET và phải có 2 dòng trống sau nó.
mnemotronic

4
Xem câu trả lời của tôi cho một phương pháp đơn giản hơn. set nl=^&echo., sau đó chỉ echo hello %nl% worldmang lại hiệu quả tương tự.
coltonon

96

Có một tính năng tiêu chuẩn echo:trong các tệp cmd / bat để ghi dòng trống, mô phỏng một dòng mới trong đầu ra cmd của bạn:

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

Đầu ra của tệp cmd được trích dẫn ở trên:

line1

line2

37
Trong thực tế, bất kỳ char đặc biệt UNUSED nên làm việc. Tôi luôn khuyến khích việc sử dụng / vì dấu gạch chéo là char tiêu chuẩn cho các tùy chọn lệnh. Ngoài ra, tôi luôn chỉ trích việc sử dụng dấu chấm mà ai đó trong Microsoft không may chọn vì lệnh: echo.com cho kết quả khác nhau tùy thuộc vào phiên bản của bộ xử lý lệnh MS-DOS / Windows Batch.
Aacini

21
Phiên bản duy nhất luôn hoạt động là echo(. Có vẻ như nó có thể gây ra vấn đề, nhưng nó thực sự hoạt động hoàn hảo. Tất cả các hình thức khác có ít nhất một tình huống trong đó lệnh sẽ không thực hiện như mong muốn.
dbenham

5
@naxa - Không có gì chính thức, chỉ là kiến ​​thức tập thể bắt nguồn từ một vài tin tặc. Mục tiêu là có cú pháp có thể được sử dụng để ECHO bất kỳ giá trị nào, kể cả không có gì và không bao giờ phải lo lắng về việc nhận bất cứ thứ gì ngoài những gì được mong đợi. Tóm tắt tốt nhất mà tôi biết là tại dostips.com/forum/viewtopic.php?p=4554#p4554 . Đó là loại lá bạn treo, nhưng không ai từng nghĩ ra một kịch bản ECHO(thất bại.
dbenham

2
@Pacerier - có những ví dụ về sự thất bại cho mỗi đề xuất đó. Đọc kỹ dostips.com/forum/viewtopic.php?p=4554#p4554 .
dbenham 29/07/2015

2
@Pacerier có đủ tiếng vang đang diễn ra ở đây cho một câu hỏi độc lập. Có lẽ một cái gì đó dọc theo dòng chữ "những nhân vật có thể ngay lập tức làm theo echo, và hiệu ứng của họ là gì?"
matt wilkie

68

Giống như câu trả lời của Ken, nhưng với việc sử dụng việc mở rộng bị trì hoãn.

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

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

Đầu tiên, một ký tự dòng đơn được tạo và gán cho biến \ n.
Điều này hoạt động khi dấu mũ ở cuối dòng cố gắng thoát khỏi ký tự tiếp theo, nhưng nếu đây là Linefeed thì nó bị bỏ qua và ký tự tiếp theo được đọc và thoát (ngay cả khi đây cũng là một linefeed).
Sau đó, bạn cần một nguồn cấp dữ liệu thứ ba để kết thúc hướng dẫn hiện tại, nếu không, dòng thứ ba sẽ được thêm vào biến LF.
Ngay cả các tệp bó cũng có kết thúc dòng với CR / LF, chỉ có điều quan trọng là vì các CR được loại bỏ trong giai đoạn này của trình phân tích cú pháp.

Ưu điểm của việc sử dụng mở rộng bị trì hoãn là, không có xử lý ký tự đặc biệt nào cả.
echo Line1%LF%Line2sẽ thất bại, vì trình phân tích cú pháp dừng phân tích cú pháp tại các nguồn cấp đơn.

Có nhiều lời giải thích hơn tại
SO: Các lệnh dài được phân chia thành nhiều dòng trong tệp Vista / DOS (.bat)
SO: Làm thế nào để các lệnh của Trình thông dịch lệnh Windows (CMD.EXE) phân tích cú pháp?

Chỉnh sửa: Tránh echo.

Điều này không trả lời câu hỏi, vì câu hỏi là về một đơn echocó thể xuất ra nhiều dòng.

Nhưng mặc dù các câu trả lời khác đề nghị sử dụng echo.để tạo một dòng mới, cần lưu ý rằng đó echo.là điều tồi tệ nhất, vì nó rất chậm và hoàn toàn có thể thất bại, vì cmd.exe tìm kiếm một tệp có tên ECHOvà cố gắng khởi động nó.

Để in chỉ một dòng trống, bạn có thể sử dụng một trong

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

Nhưng việc sử dụng echo., echo\hoặc echo:nên tránh, vì chúng có thể rất chậm, tùy thuộc vào vị trí mà tập lệnh sẽ được thực thi, giống như một ổ đĩa mạng.


1
Nếu bạn sẽ chuyển chuỗi có dòng mới dưới dạng tham số cho chương trình con theo đợt, ví dụ: call :pause line1!\n!line2bắt đầu chương trình con với setlocal EnableDelayedExpansionvà kết thúc chuỗi đó setlocal DisableDelayedExpansionđể giữ cho dòng mới không bị giải thích sớm.
stevek_mcc

2
+1 cho dàn nhân vật echo, echo; echo( echo/ echo+ echo=và bộ sưu tập rogues echo. echo\ echo:. Bây giờ nếu bạn muốn giải thích tại sao trong những công việc linh thiêng này, tôi nợ bạn một ly bia miễn phí.
Bob Stein

40

echo. Đủ nói.

Nếu bạn cần nó trong một dòng duy nhất, sử dụng &. Ví dụ,

echo Line 1 & echo. & echo line 3

sẽ xuất ra như:

Line 1

line 3

Bây giờ, giả sử bạn muốn một cái gì đó lạ hơn một chút, ...

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

Đầu ra

hello
world

Sau đó, chỉ cần ném vào %n%bất cứ khi nào bạn muốn một dòng mới trong một câu lệnh echo. Điều này gần hơn với việc bạn \nsử dụng trong các ngôn ngữ khác nhau.

Phá vỡ

set n=đặt biến nbằng:

^ Nulls ra biểu tượng tiếp theo để làm theo:

&Có nghĩa là để thực hiện một lệnh khác trên cùng một dòng. Chúng tôi không quan tâm đến errorlevel (đó là một tuyên bố tiếng vang cho tiếng khóc lớn), vì vậy không &&cần thiết.

echo. Tiếp tục tuyên bố tiếng vang.

Tất cả điều này hoạt động bởi vì bạn thực sự có thể tạo các biến là mã và sử dụng chúng bên trong các lệnh khác. Nó giống như một hàm ghetto, vì lô không chính xác là ngôn ngữ kịch bản shell tiên tiến nhất. Điều này chỉ hoạt động vì sử dụng biến số kém, không chỉ định giữa ints, chars, float, chuỗi, v.v.

Nếu bạn xảo quyệt, bạn có thể làm điều này để làm việc với những thứ khác. Ví dụ: sử dụng nó để lặp lại một tab

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

7
Không sử dụng echo.vì lần đầu tiên cố gắng tìm một tệp theo tên đó. Sử dụng các dấu câu khác, chẳng hạn nhưecho,
Phục hồi Monica

20

Khi lặp lại một cái gì đó để chuyển hướng đến một tập tin, nhiều lệnh echo sẽ không hoạt động. Tôi nghĩ có lẽ bộ chuyển hướng ">>" là một lựa chọn tốt:

tiếng vang xin chào> tạm thời
tiếng vang thế giới >> temp

8
Ví dụ đầu tiên, sử dụng ">", sẽ tạo một tệp mới, tệp thứ hai, sử dụng ">>", sẽ nối thêm vào tệp hiện có (hoặc tạo tệp nếu nó chưa tồn tại).
Yann Duran

1
(echo hello && echo world) > tempđược đề cập bởi Nathan J. Brauer trong một bình luận cho các tác phẩm trả lời được chấp nhận (hiện tại).
GeroldBroser phục hồi Monica

15

Giống như Grimtron gợi ý - đây là một ví dụ nhanh để định nghĩa nó:

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

Đầu ra

C:\>test.bat
hello
world

Nó thực sự sẽ lặp lại một dòng mới bổ sung sau "thế giới"
BlueRaja - Danny Pflughoeft

1
@blue dòng mới có vẻ là chức năng của chính tệp bó. Nếu bạn lặp lại echo hello %newline%worlddòng không có khoảng cách giữa.
matt wilkie

2
echo "Hello %newline% world"thất bại vì nó là bên trong dấu ngoặc kép. Bởi vì nó không phải là một dòng mới thực sự .
Jeb

14

Nếu bạn cần đặt kết quả vào một tệp, bạn có thể sử dụng

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

9

Bạn cũng có thể làm như thế này,

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

Đầu ra sẽ là,

a
b
c d

Lưu ý rằng khi điều này được đặt trong một tệp bó, '%' sẽ được nhân đôi.

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

Giải pháp này cũng hoạt động nếu bạn muốn lặp lại một dấu và thay vì một dòng mới.
parvus

tôi nghĩ rằng tôi đã tìm thấy một lỗi: *char

7

Nếu bất cứ ai đến đây bởi vì họ đang tìm cách lặp lại một dòng trống từ MINGW makefile, tôi đã sử dụng

@cmd /c echo.

chỉ đơn giản là sử dụng echo.gây ra sự sợ hãiprocess_begin: CreateProcess(NULL, echo., ...) failed. thông báo lỗi .

Tôi hy vọng điều này sẽ giúp ít nhất một người khác ngoài đó :)


Nhưng đó không phải là câu hỏi. Downvote!
Mã số

Không chắc có mỉa mai hay không: P
Wayne Uroda

Tìm hiểu bằng cách tìm trong hộp thư đến của bạn: D
Mesalcode

3

Nếu một người cần sử dụng \ n nổi tiếng trong chuỗi ký tự có thể được truyền cho một biến, có thể viết mã như trong tập lệnh Hello.bat bên dưới:

@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!%

Bằng cách này, đầu ra multiline có thể được chuẩn bị ở một nơi, ngay cả trong tập tin scritpt hoặc bên ngoài khác, và được in ở nơi khác.

Việc ngắt dòng được tổ chức trong biến dòng mới . Giá trị của nó phải được thay thế sau những tiếng vang dòng được mở rộng vì vậy tôi sử dụng enableDelayedExpansion setlocal để cho phép có dấu hiệu chấm than mà mở rộng biến trên thực hiện. Và thực thi thay thế \ n với nội dung dòng mới (tìm cú pháp tại bộ trợ giúp ). Tất nhiên chúng tôi có thể sử dụng ! Newline! trong khi đặt câu trả lời nhưng \ n thuận tiện hơn. Nó có thể được truyền từ bên ngoài (thử Hello R2 \ nD2 ), trong đó không ai biết tên của biến giữ ngắt dòng (Có, xin chào C3! Newline! P0hoạt động theo cùng một cách).

Ví dụ trên có thể được tinh chỉnh thành một chương trình con hoặc độc lập, được sử dụng như call:mlecho Hi\nI'm your comuter:

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


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

Xin lưu ý rằng dấu gạch chéo ngược bổ sung sẽ không ngăn tập lệnh phân tích cú pháp chuỗi con.


1
Về cơ bản, bạn đang làm điều tương tự như câu trả lời của Jeb ở trên.
Squashman

Câu trả lời tôi đọc ở trên rất hữu ích nhưng tôi cần gọi một chương trình con od script sẽ phân tích cú pháp để tôi tránh thực hiện thủ thuật ở mọi nơi. Điều này cần thiết để tinh chỉnh một giải pháp và tôi đã chia sẻ sự tinh tế này. Hy vọng nó không gây hại cho bất kỳ động vật nào.
Tomator

2

Điều này làm việc cho tôi, không cần mở rộng chậm trễ:

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

Nó viết đầu ra như thế này:

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

4
-1 echo asdf >myfile.txtsẽ tạo ra kết quả chính xác tương tự. echonối một dòng mới vào cuối chuỗi.
BlueRaja - Daniel Pflughoeft

2
Câu trả lời tuyệt vời, là người duy nhất nhận ra giá trị của việc sử dụng dấu ngoặc đơn cho các dòng mới. Tôi tin rằng đây là cách các nhà sản xuất DOS dự định bạn làm điều đó.
djangofan

2

Để bắt đầu một dòng mới theo đợt, tất cả những gì bạn phải làm là thêm "echo [", như vậy:

echo Hi!
echo[
echo Hello!

5
Nó chậm và thất bại khi một tệp tồn tại với tênecho[.bat
jeb

Gì? Nó sẽ hoạt động ngay lập tức và cũng chỉ cần xóa tệp echo [.bat.
PryroTech

2
Nó khá giống với tiếng vang. cú pháp.
PryroTech

5
Có và echo.là một giải pháp xấu, quá.
Jeb

1
Như có thể thấy trong các câu trả lời trước, điều này sẽ cố gắng xác định vị trí một tệp trên đường dẫn trước, điều này khiến nó bị chậm. Điều này cũng đúng với echo.. Yêu cầu người dùng tập lệnh của bạn xóa các tệp trên hệ thống của họ chỉ vì tập lệnh của bạn cần một dòng mới có vẻ không phải là thiết kế tốt đối với tôi.
Abel

2

Giải pháp Ken và Jeb hoạt động tốt.

Nhưng các dòng mới được tạo ra chỉ với một ký tự LF và tôi cần các ký tự CRLF (phiên bản Windows).

Về vấn đề này, ở phần cuối của kịch bản, tôi đã chuyển đổi LF thành CRLF.

Thí dụ:

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

0

Bạn có thể sử dụng @echo(@echo + [dấu cách] + [không gian không thể bảo mật])

Lưu ý: Có thể lấy không gian không an toàn bằng Alt + 0160

Hy vọng nó giúp :)

[sửa] Hmm bạn nói đúng, tôi cần nó trong Makefile, nó hoạt động hoàn hảo ở đó. Tôi đoán câu trả lời của tôi không phù hợp với các tệp bó ... Thật tệ.


Tôi ECHO ist eingeschaltet (ON).không nhận được một dòng trống nào, đã thử tại dấu nhắc cmd
jeb

1
Đó là một không gian không phá vỡ, không phải là một dòng mới.
Ry-

0

Giải pháp này hoạt động (Đã thử nghiệm):

type nul | more /e /p

Điều này chuyển đổi nguồn cấp dữ liệu dòng bị cô lập thành sự kết hợp nguồn cấp dữ liệu dòng vận chuyển.


Nhưng làm thế nào điều này thêm một dòng mới giữa một văn bản? Câu hỏi đặt ra là vềecho hello \n world
Jeb

Downvote từ tôi. Đây không phải là một câu trả lời cho câu hỏi
Mesalcode

-2

Tôi không thể làm cho nó đơn giản hơn:

echo echo hello^&echo world^&pause>silly.bat                       
call silly.bat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.