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
echo Yes&echo No
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
echo Yes&echo No
Câu trả lời:
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
.
echo. && echo hello && echo. && echo world
$ (echo Hello && echo World) > ./File.txt
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 /
Sử dụng:
echo hello
echo.
echo world
echo "Makefile contents (which has \n)" > Makefile
Với nhiều tiếng vang, nó sẽ không hoạt động
(echo hello & echo world) >> ./test.txt
echo line 1 > Makefile
và 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.
Ở đâ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.
set nl=^&echo.
, sau đó chỉ echo hello %nl% world
mang lại hiệu quả tương tự.
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
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.
ECHO(
thất bại.
echo
, và hiệu ứng của họ là gì?"
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%Line2
sẽ 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 echo
có 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 ECHO
và 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.
call :pause line1!\n!line2
bắt đầu chương trình con với setlocal EnableDelayedExpansion
và kết thúc chuỗi đó setlocal DisableDelayedExpansion
để giữ cho dòng mới không bị giải thích sớm.
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í.
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 \n
sử dụng trong các ngôn ngữ khác nhau.
Phá vỡ
set n=
đặt biến n
bằ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
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,
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
(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).
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
C:\>test.bat
hello
world
echo hello %newline%world
dòng không có khoảng cách giữa.
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ự .
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
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)
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 đó :)
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.
Đ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 . . .
echo asdf >myfile.txt
sẽ tạo ra kết quả chính xác tương tự. echo
nối một dòng mới vào cuối chuỗi.
Để 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!
echo[.bat
echo.
là một giải pháp xấu, quá.
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.
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
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ệ.
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
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.
echo hello \n world
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