ชุด Windows: echo ไม่มีบรรทัดใหม่


231

อะไรคือสิ่งที่เทียบเท่ากับแบตช์ Windows ของคำสั่ง Linux shell echo -nซึ่งจะหยุดการขึ้นบรรทัดใหม่ในตอนท้ายของเอาต์พุต?

ความคิดคือการเขียนในบรรทัดเดียวกันภายในวง



2
นี่ทำให้ฉันเกือบจะบ้าไปแล้ว .. ฉันรู้ว่าechoสามารถใช้งานได้-nแต่cmd.exeมันก็ไม่ทำงาน ^^
panny

11
@panny - แม้จะมีชื่อสามัญ แต่ echo ก็ไม่ใช่คำสั่งเดียวกันระหว่าง Windows และ Posix เช่นเดียวกับ nslookup มีตัวเลือกต่างกัน ดังนั้นความคิดเห็น "ฉันรู้ว่าechoสามารถทำได้-n" ในบริบทของคำถามที่ต้องทำกับ Windows จึงไม่ถูกต้อง
user66001

คำตอบ:


236

การใช้setและ/pพารามิเตอร์ที่คุณสามารถสะท้อนได้โดยไม่ต้องขึ้นบรรทัดใหม่:

C:\> echo Hello World
Hello World

C:\> echo|set /p="Hello World"
Hello World
C:\>

แหล่ง


86
ท่อช้ามากที่จะสร้างสอง <nul set /p =HelloCMD-งานพิเศษได้เร็วขึ้น set /pไม่สามารถ echo เครื่องหมายเท่ากับเป็นอักขระตัวแรกหรือช่องว่าง / แท็บ
Jeb

11
มันเกือบ 15 ครั้งได้เร็วขึ้นในระบบของฉัน
Jeb

28
เพิ่มเครื่องหมายคำพูดรอบ "Hello World" เพื่อป้องกันช่องว่างภายนอกหลังจากวันที่
Brian

13
คำเตือน: สิ่งนี้จะเปลี่ยนข้อผิดพลาดเป็น 1. ดูคำตอบโดย @xmechanix
CoperNick

6
@ user246694 < nulเป็นการเปลี่ยนเส้นทางจากNULอุปกรณ์ มันไม่มีอะไรเลย แต่นั่นก็เพียงพอแล้วที่set /pจะหยุดรอการป้อนข้อมูลของผู้ใช้
jeb

100

การใช้: echo | set /p=หรือ<NUL set /p=ทั้งสองอย่างทำงานเพื่อระงับการขึ้นบรรทัดใหม่

อย่างไรก็ตามสิ่งนี้อาจเป็นอันตรายอย่างยิ่งเมื่อเขียนสคริปต์ขั้นสูงเพิ่มเติมเมื่อตรวจสอบข้อผิดพลาดมีความสำคัญเนื่องจากการตั้งค่าset /p=โดยไม่ระบุชื่อตัวแปรจะตั้งค่า ERRORLEVEL เป็น 1

วิธีที่ดีกว่าคือเพียงใช้ชื่อตัวแปรจำลองดังนี้:
echo | set /p dummyName=Hello World

สิ่งนี้จะสร้างสิ่งที่คุณต้องการโดยไม่ต้องมีอะไรลับๆล่อๆที่เกิดขึ้นในพื้นหลังในขณะที่ฉันต้องหาวิธีที่ยากลำบาก <NUL set /p dummyName=Helloจะยังคงเพิ่มข้อผิดพลาดเป็น 1


20
คำเตือน: คำสั่งนี้จะตั้งค่า ERRORLEVEL เป็น 0 หาก ERRORLEVEL มากกว่า 0 คำสั่งนี้จะเปลี่ยน ERRORLEVEL เป็น 0 ซึ่งอาจเป็นอันตรายเมื่อเขียนสคริปต์ขั้นสูงเพิ่มเติม (แต่ +1 สำหรับคำตอบ)
CoperNick

ดังนั้นโดยทั่วไปคุณต้องการ IF ERRORLEVEL == 0 (... ) ELSE (... ) เพียงเพื่อไม่ให้เป็นอันตรายต่อสภาพแวดล้อมของคุณในสถานการณ์เหล่านั้น Sheesh
SilverbackNet

28

วิธี SET / P แบบง่ายมีข้อ จำกัด ที่แตกต่างกันเล็กน้อยระหว่างรุ่น Windows

  • คำพูดนำอาจถูกปล้น

  • พื้นที่สีขาวนำอาจถูกปล้น

  • การนำหน้า=ทำให้เกิดข้อผิดพลาดทางไวยากรณ์

ดูhttp://www.dostips.com/forum/viewtopic.php?f=3&t=4209สำหรับข้อมูลเพิ่มเติม

jeb โพสต์วิธีแก้ปัญหาที่ชาญฉลาดที่แก้ปัญหาส่วนใหญ่ที่ข้อความเอาท์พุทโดยไม่ต้องป้อนบรรทัดหรือแม้กระทั่งกับพื้นที่ว่างชั้นนำหรือ =ฉันได้ปรับปรุงวิธีการเพื่อให้สามารถพิมพ์ชุดแบตช์ที่ถูกต้องโดยไม่มีบรรทัดใหม่บน Windows รุ่นใด ๆ จาก XP เป็นต้นไป โปรดทราบว่า:writeInitializeวิธีนี้มีตัวอักษรสตริงที่อาจไม่สามารถโพสต์ลงในไซต์ได้ดี มีการรวมคำพูดที่อธิบายถึงลำดับของอักขระที่ควรจะเป็น

:writeและ:writeVarวิธีการที่มีประสิทธิภาพสูงสุดเช่นว่าสตริงเท่านั้นที่มีตัวอักษรลำบากชั้นนำที่เขียนโดยใช้รุ่นที่แก้ไขของฉันของวิธีการคัดลอก Jeb ของ สตริงที่ไม่มีปัญหาถูกเขียนโดยใช้วิธี SET / P ที่ง่ายและเร็วขึ้น

@echo off
setlocal disableDelayedExpansion
call :writeInitialize
call :write "=hello"
call :write " world!%$write.sub%OK!"
echo(
setlocal enableDelayedExpansion
set lf=^


set "str= hello!lf!world^!!!$write.sub!hello!lf!world"
echo(
echo str=!str!
echo(
call :write "str="
call :writeVar str
echo(
exit /b

:write  Str
::
:: Write the literal string Str to stdout without a terminating
:: carriage return or line feed. Enclosing quotes are stripped.
::
:: This routine works by calling :writeVar
::
setlocal disableDelayedExpansion
set "str=%~1"
call :writeVar str
exit /b


:writeVar  StrVar
::
:: Writes the value of variable StrVar to stdout without a terminating
:: carriage return or line feed.
::
:: The routine relies on variables defined by :writeInitialize. If the
:: variables are not yet defined, then it calls :writeInitialize to
:: temporarily define them. Performance can be improved by explicitly
:: calling :writeInitialize once before the first call to :writeVar
::
if not defined %~1 exit /b
setlocal enableDelayedExpansion
if not defined $write.sub call :writeInitialize
set $write.special=1
if "!%~1:~0,1!" equ "^!" set "$write.special="
for /f delims^=^ eol^= %%A in ("!%~1:~0,1!") do (
  if "%%A" neq "=" if "!$write.problemChars:%%A=!" equ "!$write.problemChars!" set "$write.special="
)
if not defined $write.special (
  <nul set /p "=!%~1!"
  exit /b
)
>"%$write.temp%_1.txt" (echo !str!!$write.sub!)
copy "%$write.temp%_1.txt" /a "%$write.temp%_2.txt" /b >nul
type "%$write.temp%_2.txt"
del "%$write.temp%_1.txt" "%$write.temp%_2.txt"
set "str2=!str:*%$write.sub%=%$write.sub%!"
if "!str2!" neq "!str!" <nul set /p "=!str2!"
exit /b


:writeInitialize
::
:: Defines 3 variables needed by the :write and :writeVar routines
::
::   $write.temp - specifies a base path for temporary files
::
::   $write.sub  - contains the SUB character, also known as <CTRL-Z> or 0x1A
::
::   $write.problemChars - list of characters that cause problems for SET /P
::      <carriageReturn> <formFeed> <space> <tab> <0xFF> <equal> <quote>
::      Note that <lineFeed> and <equal> also causes problems, but are handled elsewhere
::
set "$write.temp=%temp%\writeTemp%random%"
copy nul "%$write.temp%.txt" /a >nul
for /f "usebackq" %%A in ("%$write.temp%.txt") do set "$write.sub=%%A"
del "%$write.temp%.txt"
for /f %%A in ('copy /z "%~f0" nul') do for /f %%B in ('cls') do (
  set "$write.problemChars=%%A%%B    ""
  REM the characters after %%B above should be <space> <tab> <0xFF>
)
exit /b

1
ดีที่จะเห็นวิธีการแก้ปัญหาที่มีประสิทธิภาพมากที่สามารถจัดการกับทุกตัวอักษร
Jeb

2
ฉันต้องการจะชี้ให้เห็นว่าหากคอมพิวเตอร์มีการเชื่อมต่อเครือข่ายกับอินเทอร์เน็ตซึ่งรหัสชุดนี้สามารถใช้ในการดาวน์โหลดและติดตั้งไพ ธ อนหรือสิ่งอื่นใดในคอมพิวเตอร์ที่สามารถกำจัดแบทช์ออกได้ ชุดเป็นเรื่องสนุก แต่มันเป็นความสามารถของสตริงที่ดีที่สุดสำหรับวันหยุดสุดสัปดาห์ challange
n611x007

@ dbenham ในบรรทัด 6 "echo (" นั้นใช้งานได้เหมือนกับ "echo." - ไม่เคยเห็นมาก่อน
ข้าม R

2
@SkipR - ใช่มันเป็นหน้าที่เช่นเดียวกับECHO., ยกเว้นECHO.สามารถล้มเหลวภายใต้สถานการณ์ที่คลุมเครือ มีอีกหลายรูปแบบที่อาจล้มเหลวในสถานการณ์ที่คลุมเครือ ECHO(เพียงคนเดียวที่ทำงานเสมอ
dbenham

10

ในฐานะที่เป็นภาคผนวกของคำตอบของ @ xmechanix ฉันสังเกตเห็นผ่านการเขียนเนื้อหาลงในไฟล์:

echo | set /p dummyName=Hello World > somefile.txt

ว่าสิ่งนี้จะเพิ่มช่องว่างเพิ่มเติมในตอนท้ายของสตริงที่พิมพ์ซึ่งอาจไม่สะดวกโดยเฉพาะเนื่องจากเรากำลังพยายามหลีกเลี่ยงการเพิ่มบรรทัดใหม่ (อักขระช่องว่างอื่น) ไปยังจุดสิ้นสุดของสตริง

โชคดีที่อ้างถึงสตริงที่จะพิมพ์เช่นการใช้:

echo | set /p dummyName="Hello World" > somefile.txt

จะพิมพ์สตริงโดยไม่ต้องขึ้นบรรทัดใหม่หรืออักขระเว้นวรรคในตอนท้าย


5
พื้นที่พิเศษควรจะหายไปถ้าคุณไม่ใส่ช่องว่างระหว่างWorldและ>...
aschipfl

@aschipfl พยายามมันไม่ได้
Joan Bruguera

วิธีการตัวแปรแบบ Quoted ซึ่งเป็นคุณลักษณะที่ไม่มีเอกสารของคำสั่ง set นั้นโดยทั่วไปแล้วฉันควรจะเข้าหามันอย่างไรเพราะมันทำงานใน WIndows NT ทุกรุ่น (และ 9x ถ้าฉันจำได้) นั่นคือคุณตัดชื่อตัวแปรไปยังจุดสิ้นสุดของค่าในเครื่องหมายคำพูด สิ่งนี้เป็นจริงสำหรับชุด / P เช่นกัน
Ben Personick

1
IE: echo | set / p "dummyName = Hello World"> somefile.txt
Ben Personick

2
@aschipfl ช่องว่างเพิ่มเติมจะปรากฏขึ้นหากคุณไม่ได้ใส่เครื่องหมายอัญประกาศ xxd เป็นอรรถประโยชน์การถ่ายโอนข้อมูลฐานสิบหกดังนั้นเราจะเห็นเช่นการ set /p="abc"<nul|xxd -pแสดงผล616263 ในขณะที่ set /p=abc<nul|xxd -pให้61626320
barlop

9

ทางออกสำหรับพื้นที่สีขาวที่ถูกปล้นใน SET / P:

เคล็ดลับคือ char backspace ที่คุณสามารถเรียกตัวแก้ไขข้อความในEDITสำหรับ DOS ในการสร้างมันในแก้ไขกดctrlP + ctrlH ฉันจะวางที่นี่ แต่หน้านี้ไม่สามารถแสดงได้ มันสามารถมองเห็นได้บน Notepad แต่ (มันไม่ฉลาดเหมือนสี่เหลี่ยมผืนผ้าสีดำขนาดเล็กที่มีวงกลมสีขาวอยู่ตรงกลาง)

ดังนั้นคุณเขียนสิ่งนี้:

<nul set /p=.9    Hello everyone

จุดสามารถเป็นตัวอักษรใด ๆ เพียงเพื่อบอก SET / P ว่าข้อความเริ่มต้นที่นั่นก่อนที่ช่องว่างและไม่ได้อยู่ที่ " สวัสดี " " 9 " เป็นตัวแทนของอักขระแบ็คสเปซที่ฉันไม่สามารถแสดงได้ที่นี่ คุณต้องใส่มันแทน 9 และมันจะลบ " . " หลังจากนั้นคุณจะได้:

    Hello Everyone

แทน:

Hello Everyone

ฉันหวังว่ามันจะช่วย


2
ฉันลืมที่จะบอกว่ามันทำงานได้ใน Windows 7 มันจะไม่ทำงานในบรรทัดคำสั่งเฉพาะในชุด สำหรับทุกคนที่ไม่ได้รับถ่านดาวน์โหลดตัวอย่างนี้: pecm.com.sapo.pt/SET_with_backspace_char.txt
Pedro

เป็นจริงสำหรับ Echo
Ben Personick

... ดังนั้นหลังจากทำการค้นหาอย่างถี่ถ้วนแล้วฉันไม่พบสิ่งนี้บนอินเทอร์เน็ต อาจเป็นครั้งเดียวที่ฉันได้ค้นพบบางสิ่งและโชคดี สำหรับผู้ที่ไม่ทราบว่าคุณสามารถป้อนอักขระควบคุมได้หากคุณตั้งค่าพรอมต์คำสั่งในโหมดเดิมและใช้แบบอักษรที่ถูกต้อง ... แต่ถ้าคุณเพียงแค่เปลี่ยนเส้นทางสิ่งใดก็ตามไปยังไฟล์หรือ> มันทำงานได้เช่นกัน อย่างจริงจัง. วางสิ่งนี้ลงในพรอมต์คำสั่งของคุณ: "echo ←c◙◙○○ Harharhar !! ◙○○ ------------- ◙◙○○ฉันเลวร้ายที่สุด!?: '(○♪ OP NOPE! •♪○ฉันรู้สึกดีมาก Hazzah-le-oop! ◙◙○ฉันเป็นนักเขียนโปรแกรมฟังฉัน ... มีอะไรบางอย่าง.>> con ".
Brent Rittenhouse

โอเคฉันหวังว่าฉันจะรู้เรื่องนี้ก่อนใคร แต่ ... ดูเหมือนว่ามันจะขึ้นอยู่กับว่าไม่ได้อยู่ในหน้ารหัสยูนิโค้ด คุณสามารถเก็บเริ่มต้นไว้ในตัวแปรทำ chcp 437, ตั้งค่าชุดในตัวแปร, หรือเอาท์พุทมัน, จากนั้นสลับกลับ (และมันควรจะเอาท์พุท) ฉันกำลังเล่นกับมันยัง
Brent Rittenhouse

นอกจากนี้ทุกคนมีความคิดว่าทำไม← c ล้างหน้าจอหรือไม่! ฉันไม่พบอินสแตนซ์ของที่ใดก็ได้ในเน็ต มันเป็นชุดค่าผสมที่พิเศษแม้ว่าคุณจะดูเหมือนจะมีช่องว่างระหว่างตัวละครทั้งสองได้เช่นกัน สำหรับตัวละครอื่น ๆ ดูเหมือนว่า .. เพิ่งลบตัวแรกออกไป ฉันไม่เข้าใจเลย ...
Brent Rittenhouse

7

คุณสามารถลบบรรทัดใหม่โดยใช้ "tr" จาก gnuwin32 ( แพ็คเกจcoreutils )

@echo off
set L=First line
echo %L% | tr -d "\r\n"
echo Second line
pause

โดยวิธีการถ้าคุณทำสคริปต์มากมาย gnuwin32 เป็นทองคำ


ฉันยังแนะนำให้ติดตั้งทุบตีคอมไพล์ แน่ใจว่ามันไม่เหมือนกับ gnuwin32 (และเป็น goldmine ดังนั้น +1) มันเป็นเพียงการติดตั้งที่ดีและคุณมี git-bash บนปุ่มเมาส์ขวาเกือบทุกที่รวมถึงปุ่มเมนูเริ่ม
hakre

คุณสามารถใช้ tr เพื่อลบอักขระช่องว่างสุดท้ายได้trimไหม?
panny

ใช้ sed สำหรับการตกแต่ง: sed -e "s / * $ //"
BearCode

@panny - ฉันไม่สามารถหา posix / linux util เรียกว่า trim นอกจากนี้\r, \nหรือ\r\n(สายใหม่ใน OSX, Posix และ Windows ตามลำดับ) ไม่ได้ "พื้นที่" ตัวละคร
66001

5

นี่คือวิธีอื่นใช้ Powershell Write-Host ซึ่งมีพารามิเตอร์ -NoNewLine รวมเข้าด้วยกันstart /bและนำเสนอฟังก์ชันการทำงานเดียวกันจากชุดงาน

NoNewLines.cmd

@ECHO OFF
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 1 - ';Write-Host -NoNewLine 'Result 2 - ';Write-Host -NoNewLine 'Result 3 - '"
PAUSE

เอาท์พุต

Result 1 - Result 2 - Result 3 - Press any key to continue . . .

ด้านล่างนี้แตกต่างกันเล็กน้อยไม่ทำงานอย่างที่ OP ต้องการ แต่น่าสนใจเพราะผลลัพธ์แต่ละรายการจะเขียนทับผลลัพธ์ก่อนหน้านี้เลียนแบบตัวนับ

@ECHO OFF
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 1 - '"
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 2 - '"
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 3 - '"
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 4 - '"
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 5 - '"
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 6 - '"
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 7 - '"
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 8 - '"
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 9 - '"
PAUSE


2

บางทีนี่อาจเป็นสิ่งที่คุณมองหา แต่เป็นสคริปต์ของโรงเรียนเก่า ... : P

set nl=^& echo. 
echo %nl%The%nl%new%nl%line%nl%is%nl%not%nl%apparent%nl%throughout%nl%text%nl%
echo only in prompt.
pause

หรือบางทีคุณพยายามแทนที่บรรทัดปัจจุบันแทนที่จะเขียนเป็นบรรทัดใหม่? คุณสามารถทดลองสิ่งนี้ได้โดยลบ "% bs%" หลัง "" ลงชื่อเข้าใช้และเว้นวรรค "% bs%" อื่น ๆ หลังจาก "ตัวอย่างข้อความ"

for /f %%a in ('"prompt $H&for %%b in (1) do rem"') do set "bs=%%a"
<nul set /p=.%bs%         Example message         %bs%
pause

ฉันพบว่าสิ่งนี้น่าสนใจจริงๆเพราะใช้ตัวแปรเพื่อจุดประสงค์อื่นนอกเหนือจากที่ตั้งใจจะทำ ตามที่คุณเห็น "% bs%" แสดงถึง backspace "% bs%" ตัวที่สองใช้ Backspace เพื่อเพิ่มช่องว่างหลัง "ข้อความตัวอย่าง" เพื่อแยก "เอาต์พุตคำสั่งหยุดชั่วคราว" โดยไม่ต้องเพิ่มอักขระที่มองเห็นได้จริงหลังจาก "ตัวอย่างข้อความ" อย่างไรก็ตามอาจเป็นไปได้ด้วยเครื่องหมายเปอร์เซ็นต์ปกติ


2
ฉันเห็นset nl=^& echo.เคล็ดลับนี้ทุกที่และชื่อของตัวแปรนั้นทำให้เข้าใจผิด % NL% มีที่ไม่ได้ขึ้นบรรทัดใหม่ตัวอักษร : มันขยายไป&echo.ดังนั้นในที่สุดคุณกำลังทำงานใหม่echoคำสั่งทุกครั้งเพราะฉะนั้นการขึ้นบรรทัดใหม่ echo "%nl%The%nl%new%nl%line%nl%is%nl%not%nl%apparent%nl%throughout%nl%text%nl%"คุณสามารถตรวจสอบออกเขียน คุณจะได้รับ"& echo. The& echo. new& echo. line& echo. is& echo. not& echo. apparent& echo. throughout& echo. text& echo. "เปิดเผยเคล็ดลับ เอาต์พุตเหมือนกัน แต่ไม่ใช่สำหรับเหตุผลที่คุณแนะนำ
cdlvcdlv

2

cw.exeยูทิลิตี้DIY (คอนโซลเขียน)

หากคุณไม่พบมันนอกกรอบคุณสามารถทำ DIY ได้ ด้วยcwยูทิลิตี้นี้คุณสามารถใช้อักขระทุกชนิด อย่างน้อยฉันก็คิดอย่างนั้น กรุณาทดสอบความเครียดและแจ้งให้เราทราบ

เครื่องมือ

สิ่งที่คุณต้องมีคือติดตั้ง. NETซึ่งเป็นเรื่องธรรมดาในปัจจุบัน

วัสดุ

อักขระบางตัวพิมพ์ / คัดลอกวาง

ขั้นตอน

  1. สร้าง.batไฟล์ที่มีเนื้อหาดังต่อไปนี้
/* >nul 2>&1

@echo off
setlocal

set exe=cw
for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d  /o:-n "%SystemRoot%\Microsoft.NET\Framework\*csc.exe"') do set "csc=%%v"

"%csc%" -nologo -out:"%exe%.exe" "%~f0"

endlocal
exit /b %errorlevel%

*/

using System;

namespace cw {
    class Program {
        static void Main() {
            var exe = Environment.GetCommandLineArgs()[0];
            var rawCmd = Environment.CommandLine;
            var line = rawCmd.Remove(rawCmd.IndexOf(exe),exe.Length).TrimStart('"');
            line = line.Length < 2 ? "\r" : line.Substring(2) ;
            Console.Write(line);
        }
    }
}
  1. เรียกใช้

  2. ตอนนี้คุณมีสาธารณูปโภคที่ดี 4KB .batเพื่อให้คุณสามารถลบ

หรือคุณสามารถแทรกรหัสนี้เป็นรูทีนย่อยในชุดใด ๆ ส่งผลลัพธ์.exeไปให้%temp%ใช้มันในชุดของคุณและลบออกเมื่อคุณทำเสร็จแล้ว

วิธีใช้

หากคุณต้องการเขียนบางสิ่งโดยไม่มีบรรทัดใหม่:
cw Whatever you want, even with "", but remember to escape ^|, ^^, ^&, etc. unless double-quoted, like in "| ^ &".

หากคุณต้องการให้ carriage return (ไปที่จุดเริ่มต้นของบรรทัด) ให้รันเพียง
cw

ดังนั้นลองจากบรรทัดคำสั่ง:

for /l %a in (1,1,1000) do @(cw ^|&cw&cw /&cw&cw -&cw&cw \&cw)

ผมได้รับแรงบันดาลใจจากคำตอบของคุณและสร้างขึ้นนี้เครื่องมือเล็ก ๆ น้อย ๆ กับไปและนี้งานประกอบท่อสำหรับ Azure เพียงแค่คว้า stdout ที่ถูกไพพ์และส่งออกว่าในรูปแบบเฉพาะที่จะรับโดยบิลด์ ขอบคุณ!
riezebosch

2

ฉันสร้างฟังก์ชันจากแนวคิดของ @arnep:

echo | set / p = "Hello World"

นี่มันคือ:

:SL (sameline)
echo|set /p=%1
exit /b

ใช้กับcall :SL "Hello There"
ฉันรู้ว่านี่ไม่มีอะไรพิเศษ แต่ฉันใช้เวลานานมากที่จะคิดว่าฉันคิดว่าฉันจะโพสต์ที่นี่


1

ตัวอย่างที่ 1: ใช้งานได้และสร้างรหัสออก = 0 นั่นคือดี หมายเหตุ "." โดยตรงหลังจากเสียงสะท้อน

C: \ Users \ phife.dog \ gitrepos \ 1 \ repo_abc \ สคริปต์ #
@echo. | set / p JUNK_VAR = นี่คือข้อความที่แสดงเช่น Linux echo -n จะแสดง ... & echo% ERRORLEVEL%

นี่เป็นข้อความที่แสดงเช่น Linux echo -n จะแสดง ... 0

ตัวอย่างที่ 2: ใช้งานได้แต่สร้างรหัสออก = 1 นั่นคือไม่ดี โปรดสังเกตการขาด "." หลังจากเสียงสะท้อน ที่ดูเหมือนจะเป็นความแตกต่าง

C: \ Users \ phife.dog \ gitrepos \ 1 \ repo_abc \ สคริปต์ #
@echo | set / p JUNK_VAR = นี่คือข้อความที่แสดงเช่น Linux echo -n จะแสดง ... & echo% ERRORLEVEL%

นี่คือข้อความที่แสดงเช่น Linux echo -n จะแสดง ... 1


1

ได้รับแรงบันดาลใจจากคำตอบสำหรับคำถามนี้ฉันได้สร้างสคริปต์ชุดตัวนับง่ายๆที่ให้พิมพ์ค่าความคืบหน้า (0-100%) ในบรรทัดเดียวกัน (เขียนทับหน้าที่ก่อนหน้านี้) บางทีนี่อาจจะมีค่าสำหรับผู้อื่นที่กำลังมองหาวิธีแก้ไขปัญหาที่คล้ายคลึง

หมายเหตุ : *เป็นอักขระที่ไม่สามารถพิมพ์ได้ซึ่งควรป้อนโดยใช้คีย์ผสม[ Alt+ Numpad 0+ Numpad 8] ซึ่งเป็นbackspaceอักขระ

@ECHO OFF

FOR /L %%A in (0, 10, 100) DO (     
    ECHO|SET /P="****%%A%%"    
    CALL:Wait 1
)

GOTO:EOF

:Wait
SET /A "delay=%~1+1"
CALL PING 127.0.0.1 -n %delay% > NUL
GOTO:EOF

0

ฉันเชื่อว่าไม่มีตัวเลือกดังกล่าว หรือคุณสามารถลองสิ่งนี้

set text=Hello
set text=%text% world
echo %text%

3
สิ่งนี้จะยังพิมพ์บรรทัดใหม่
René Nyffenegger

3
คุณสามารถเชื่อมต่อตัวแปรเดียวกันให้มากที่สุดเท่าที่คุณต้องการและสะท้อนออกมาที่ส่วนท้ายสุดเท่านั้น
m0skit0

2
การพิมพ์เมื่อทำลูปหรือตอนท้ายไม่สำคัญว่าข้อมูลจะถูกเก็บรักษาไว้หรือไม่ สำหรับแต่ละลูปคุณเพียงแค่เชื่อมข้อมูลและจากนั้นเมื่อคุณพิมพ์ลูปเสร็จแล้ว ผลลัพธ์จะเหมือนกัน
m0skit0

9
มันไม่สำคัญว่าจะเป็นตัวบ่งชี้ความก้าวหน้าของลูป
gregseth

3
คุณไม่เคยระบุไว้ในคำถามของคุณหรือร้องขอพฤติกรรมนี้ได้ทุกที่ในคำถามของคุณ
m0skit0

0

คุณสามารถระงับบรรทัดใหม่โดยใช้คำสั่ง set / p คำสั่ง set / p ไม่รู้จักช่องว่างเพื่อให้คุณสามารถใช้จุดและอักขระ backspace เพื่อให้จดจำได้ คุณยังสามารถใช้ตัวแปรเป็นหน่วยความจำและเก็บสิ่งที่คุณต้องการพิมพ์ไว้ในนั้นเพื่อให้คุณสามารถพิมพ์ตัวแปรแทนประโยค ตัวอย่างเช่น:

@echo off
setlocal enabledelayedexpansion
for /f %%a in ('"prompt $H & for %%b in (1) do rem"') do (set "bs=%%a")
cls
set "var=Hello World! :)"
set "x=0"

:loop
set "display=!var:~%x%,1!"
<nul set /p "print=.%bs%%display%"
ping -n 1 localhost >nul
set /a "x=%x% + 1"
if "!var:~%x%,1!" == "" goto end
goto loop

:end
echo.
pause
exit

ด้วยวิธีนี้คุณสามารถพิมพ์อะไรก็ได้โดยไม่ต้องขึ้นบรรทัดใหม่ ฉันได้ทำโปรแกรมให้พิมพ์ตัวอักษรทีละตัว แต่คุณสามารถใช้คำแทนตัวอักษรได้โดยเปลี่ยนลูป

ในตัวอย่างข้างต้นฉันใช้ "เปิดใช้งานล่าช้าขยาย" เพื่อให้คำสั่ง set / p ไม่รู้จัก "!" ตัวอักษรและพิมพ์จุดแทน ฉันหวังว่าคุณจะไม่ได้ใช้เครื่องหมายอัศเจรีย์ "!" ;)


-1

ช่วงปลายตอบที่นี่ แต่สำหรับผู้ที่ต้องการที่จะเขียนตัวอักษรพิเศษกับสายเดียวที่พบdbenham 's คำตอบจะเป็นประมาณ 80 เส้นยาวเกินไปและมีสคริปต์อาจแบ่ง (อาจจะเป็นเพราะใช้การป้อนข้อมูล) ภายใต้ข้อ จำกัด ของเพียงแค่ใช้set /p, มันอาจจะง่ายที่สุดในการจับคู่. bat หรือ. cmd กับ C ++ หรือ C-language ที่คอมไพล์แล้วที่คอมไพล์แล้วcoutหรือเพียงแค่printfตัวอักษร สิ่งนี้จะช่วยให้คุณสามารถเขียนหลาย ๆ ครั้งในหนึ่งบรรทัดได้อย่างง่ายดายหากคุณแสดงแถบความคืบหน้าหรือสิ่งที่ใช้อักขระเช่น OP คือ


@jiggunjer คุณแน่ใจเหรอ? printfไอเอ็นจีจากcmdบานหน้าต่างWin-7 ให้ฉัน"'printf' is not recognized as an internal or external command, operable program or batch file."
SeldomNeedy

printfไม่ใช่ของ windows นี่เป็นคำถามของ windows
kayleeFrye_onDeck

1
@kayleeFrye_onDeck ฉันถือว่าความคิดเห็นของคุณกำกับที่jiggunjerไม่ใช่ฉัน; ฉันแนะนำในคำถามของฉันว่าอาจใช้ C และ C ++ เป็นทางเลือกที่ไม่ขึ้นกับแพลตฟอร์มอย่างเป็นธรรมกับคำสั่งเชลล์ในกรณีที่การจัดรูปแบบมีความสำคัญ
SeldomNeedy

1
ยกโทษให้ฉันพ่อด้วย
kayleeFrye_onDeck

แต่จากนั้นอินพุตไปยังเชลล์ต้องถูกวิเคราะห์อย่างถูกต้อง ตัวอย่างเช่นโปรแกรมดังกล่าวจะพิมพ์เครื่องหมายคำพูดได้อย่างไร
Alex
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.