คุณจะแทรกบรรทัดใหม่จากเอาต์พุตไฟล์แบตช์ได้อย่างไร
ฉันต้องการทำสิ่งที่ชอบ:
echo hello\nworld
ซึ่งจะส่งออก:
hello
world
echo Yes&echo No
คุณจะแทรกบรรทัดใหม่จากเอาต์พุตไฟล์แบตช์ได้อย่างไร
ฉันต้องการทำสิ่งที่ชอบ:
echo hello\nworld
ซึ่งจะส่งออก:
hello
world
echo Yes&echo No
คำตอบ:
echo hello & echo.world
ซึ่งหมายความว่าคุณสามารถกำหนดเป็นค่าคงที่สำหรับการขึ้นบรรทัดใหม่ได้& echo.
\n
echo. && echo hello && echo. && echo world
$ (echo Hello && echo World) > ./File.txt
echo(
สำหรับการปรับปรุงประสิทธิภาพ (ยังไม่มีพื้นที่ใจคุณ) อภิปรายเพิ่มเติมเกี่ยวกับตัวละครอื่น ๆ และข้อดี / ข้อบกพร่องของพวกเขาที่ECHO ล้มเหลวในการให้ข้อความหรือบรรทัดว่าง - แทนที่จะใช้ ECHO /
ใช้:
echo hello
echo.
echo world
echo "Makefile contents (which has \n)" > Makefile
กับ echos หลายรายการมันจะใช้งานไม่ได้
(echo hello & echo world) >> ./test.txt
echo line 1 > Makefile
echo line 2 >> Makefile
การใช้>>
สาเหตุทำให้เอาต์พุตถูกผนวกเข้ากับไฟล์ซึ่งเป็นลักษณะการทำงานที่คุณต้องการสำหรับกรณีนี้อย่างแม่นยำ
ที่นี่คุณไปสร้างไฟล์. 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 เท่านั้น
set nl=^&echo.
จากนั้นเพียงแค่echo hello %nl% world
ให้ผลเช่นเดียวกัน
มีคุณสมบัติมาตรฐานecho:
ในไฟล์ cmd / bat-to เพื่อเขียนบรรทัดว่างซึ่งจำลองบรรทัดใหม่ในเอาต์พุต cmd ของคุณ:
@echo off
@echo line1
@echo:
@echo line2
เอาต์พุตของการอ้างถึงไฟล์ cmd ด้านบน:
line1
line2
echo(
รุ่นเดียวที่เคยทำงานเป็น ดูเหมือนว่าอาจทำให้เกิดปัญหา แต่ใช้งานได้จริงอย่างสมบูรณ์ รูปแบบอื่น ๆ ทั้งหมดมีอย่างน้อยหนึ่งสถานการณ์ที่คำสั่งจะไม่ทำงานตามที่ต้องการ
ECHO(
ล้มเหลว
echo
และเอฟเฟกต์ของพวกเขาคืออะไร"
เหมือนคำตอบของเคน แต่ด้วยการใช้การขยายเวลาล่าช้า
setlocal EnableDelayedExpansion
(set \n=^
%=Do not remove this line=%
)
echo Line1!\n!Line2
echo Works also with quotes "!\n!line2"
ครั้งแรกที่อักขระบรรทัดเดียวถูกสร้างและกำหนดให้กับตัวแปร \ n
สิ่งนี้ทำงานเป็นคาเร็ตที่ปลายบรรทัดพยายามหลบหนีอักขระตัวถัดไป แต่หากนี่คือ Linefeed มันจะถูกละเว้นและอักขระถัดไปจะถูกอ่านและหลบหนี (แม้ว่าจะเป็นตัวป้อนบรรทัดด้วยก็ตาม)
จากนั้นคุณต้องป้อนบรรทัดที่สามเพื่อสิ้นสุดคำสั่งปัจจุบันมิฉะนั้นบรรทัดที่สามจะต่อท้ายตัวแปร LF
แม้แต่ไฟล์แบตช์มีการสิ้นสุดบรรทัดด้วย CR / LF เฉพาะ LF เท่านั้นที่มีความสำคัญเนื่องจาก CR จะถูกลบออกในขั้นตอนนี้ของตัวแยกวิเคราะห์
ข้อดีของการใช้การขยายที่ล่าช้าคือไม่มีการจัดการอักขระพิเศษเลย
echo Line1%LF%Line2
จะล้มเหลวเนื่องจาก parser หยุดการแยกวิเคราะห์ที่บรรทัดเดียว
คำอธิบายเพิ่มเติมอยู่ที่
SO: คำสั่งแบบยาวแยกหลายบรรทัดในไฟล์ Vista / DOS batch (.bat)
SO: สคริปต์แยกวิเคราะห์คำสั่ง Windows (CMD.EXE) เป็นอย่างไร
แก้ไข: หลีกเลี่ยง echo.
สิ่งนี้ไม่ตอบคำถามเนื่องจากคำถามเกี่ยวกับซิงเกิ้ลecho
ที่สามารถส่งออกได้หลายบรรทัด
แต่แม้จะมีคำตอบอื่น ๆ ที่แนะนำให้ใช้ในecho.
การสร้างบรรทัดใหม่ก็ควรสังเกตว่าecho.
มันเป็นที่เลวร้ายที่สุดเพราะมันช้ามากและสามารถล้มเหลวได้อย่างสมบูรณ์ในขณะที่ cmd.exe ค้นหาไฟล์ชื่อECHO
และพยายามที่จะเริ่มมัน
สำหรับการพิมพ์เพียงบรรทัดว่างคุณสามารถใช้หนึ่งใน
echo,
echo;
echo(
echo/
echo+
echo=
แต่การใช้echo.
, echo\
หรือecho:
ควรหลีกเลี่ยงเช่นที่พวกเขาสามารถจริงๆช้าขึ้นอยู่กับตำแหน่งที่สคริปต์ที่จะดำเนินการเช่นไดรฟ์เครือข่าย
call :pause line1!\n!line2
เริ่มต้นรูทีนย่อยด้วยsetlocal EnableDelayedExpansion
และจบด้วยsetlocal DisableDelayedExpansion
เพื่อป้องกันการขึ้นบรรทัดใหม่จากการตีความก่อนกำหนด
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
เท่ากับ:
^
ลบล้างสัญลักษณ์ถัดไปเพื่อทำตาม:
&
หมายถึงการทำคำสั่งอื่นในบรรทัดเดียวกัน เราไม่สนใจข้อผิดพลาดระดับ (มันเป็นคำสั่ง echo สำหรับการร้องไห้ออกมาดัง ๆ ) ดังนั้นจึงไม่&&
จำเป็น
echo.
ดำเนินการคำสั่ง echo ต่อ
ทั้งหมดนี้ใช้งานได้เพราะคุณสามารถสร้างตัวแปรที่เป็นรหัสและใช้ในคำสั่งอื่น มันเป็นเหมือนฟังก์ชั่นสลัมเนื่องจากแบทช์ไม่ได้เป็นภาษาสคริปต์เชลล์ขั้นสูงสุด สิ่งนี้ใช้งานได้เนื่องจากการใช้งานชุดตัวแปรไม่ดีไม่ได้กำหนดระหว่าง ints, chars, floats, strings ฯลฯ อย่างเป็นธรรมชาติ
หากคุณมีฝีมือคุณสามารถเอามันไปทำงานกับสิ่งอื่นได้ ตัวอย่างเช่นใช้เพื่อสะท้อนแท็บ
set t=^&echo. ::there are spaces up to the double colon
echo.
เนื่องจากเป็นครั้งแรกที่พยายามค้นหาไฟล์ด้วยชื่อนั้น ใช้เครื่องหมายวรรคตอนอื่น ๆ เช่นecho,
เมื่อสะท้อนบางสิ่งบางอย่างเพื่อเปลี่ยนเส้นทางไปยังไฟล์คำสั่ง echo หลายคำสั่งจะไม่ทำงาน ฉันคิดว่าตัวเปลี่ยนเส้นทาง ">>" อาจเป็นตัวเลือกที่ดี:
echo hello> temp echo world >> อุณหภูมิ
(echo hello && echo world) > temp
กล่าวถึงโดยนาธานเจ Brauer ในความคิดเห็นที่ได้รับการตอบรับงานปัจจุบัน
เช่นเดียวกับที่ Grimtron แนะนำ - นี่คือตัวอย่างด่วนในการกำหนด:
@echo off
set newline=^& echo.
echo hello %newline%world
C:\>test.bat
hello
world
echo hello %newline%world
บรรทัดไม่มีช่องว่างระหว่าง
echo "Hello %newline% 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)
ถ้าใครมาที่นี่เพราะพวกเขากำลังมองหา echo บรรทัดว่างจาก makeing MINGW ฉันใช้
@cmd /c echo.
เพียงแค่ใช้echo.
ทำให้เกิดprocess_begin: CreateProcess(NULL, echo., ...) failed.
ข้อความแสดงข้อผิดพลาดที่หวั่น
ฉันหวังว่านี่จะช่วยคนอย่างน้อยหนึ่งคนที่นั่น :)
หากต้องการใช้ \ 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!%
วิธีนี้เอาต์พุตหลายบรรทัดอาจเตรียมไว้ในที่เดียวแม้ในไฟล์ scritpt หรือไฟล์ภายนอกอื่นและพิมพ์ในที่อื่น
การขึ้นบรรทัดใหม่จัดขึ้นในตัวแปรnewline ค่าของมันจะต้องถูกแทนที่หลังจากที่ขยายบรรทัดechoดังนั้นฉันจึงใช้setlocal enableDelayedExpansionเพื่อเปิดใช้งานเครื่องหมายอัศเจรีย์ที่ขยายตัวแปรในการดำเนินการ และการประมวลผลจะแทนที่\ nด้วยเนื้อหาขึ้นบรรทัดใหม่ (มองหาไวยากรณ์ที่ชุดวิธีใช้ ) แน่นอนว่าเราสามารถใช้! newline! ขณะตั้งคำตอบแต่\ nสะดวกกว่า มันอาจถูกส่งจากภายนอก (ลองHello R2 \ nD2 ) ซึ่งไม่มีใครรู้ชื่อของตัวแปรที่ถือตัวแบ่งบรรทัด (ใช่สวัสดี 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 off
(
echo ^<html^>
echo ^<body^>
echo Hello
echo ^</body^>
echo ^</html^>
)
pause
มันเขียนผลลัพธ์เช่นนี้
<html>
<body>
Hello
</body>
</html>
Press any key to continue . . .
echo asdf >myfile.txt
จะให้ผลลัพธ์ที่เหมือนกันทุกประการ echo
เพิ่มบรรทัดใหม่ต่อท้ายส่วนท้ายของสตริง
ในการเริ่มบรรทัดใหม่ในแบทช์สิ่งที่คุณต้องทำคือเพิ่ม "echo [" เช่น:
echo Hi!
echo[
echo Hello!
echo[.bat
echo.
เป็นทางออกที่ไม่ดีเช่นกัน
echo.
เดียวกันเป็นจริงสำหรับ การคาดหวังให้ผู้ใช้สคริปต์ของคุณลบไฟล์ในระบบของพวกเขาเพียงเพราะสคริปต์ของคุณต้องการการขึ้นบรรทัดใหม่ดูเหมือนจะไม่ดีสำหรับฉัน
โซลูชันของ Ken และ Jeb ทำงานได้ดี
แต่บรรทัดใหม่นั้นถูกสร้างขึ้นด้วยตัวอักษร LF เท่านั้นและฉันต้องการตัวอักษร CRLF (เวอร์ชั่น Windows)
ในตอนท้ายของสคริปต์ฉันได้แปลง LF เป็น CRLF
ตัวอย่าง:
TYPE file.txt | FIND "" /V > file_win.txt
del file.txt
rename file_win.txt file.txt
คุณสามารถใช้@echo
(@echo + [space] + [space ที่ไม่ปลอดภัย])
หมายเหตุ: สามารถรับพื้นที่ที่ไม่ปลอดภัยได้ด้วย Alt + 0160
หวังว่าจะช่วย :)
[แก้ไข] อืมคุณพูดถูกฉันต้องการมันใน Makefile มันทำงานได้อย่างสมบูรณ์ในนั้น ฉันเดาคำตอบของฉันไม่เหมาะกับไฟล์แบตช์ ...
ECHO ist eingeschaltet (ON).
ไม่ได้เป็นบรรทัดว่างลองที่ cmd-prompt
ฉันไม่สามารถทำได้ง่ายกว่า:
echo echo hello^&echo world^&pause>silly.bat
call silly.bat