Lô Windows: echo không có dòng mới


231

Lô Windows tương đương với lệnh shell Linux echo -nngăn chặn dòng mới ở cuối đầu ra là gì?

Ý tưởng là viết trên cùng một dòng trong một vòng lặp.



2
điều này làm tôi gần như phát điên..Tôi biết echocó thể mất -nnhưng trên cmd.exeđó nó sẽ không hoạt động ^^
panny

11
@panny - Mặc dù tên chung, echo không phải là lệnh tương tự giữa Windows và Posix. Giống như nslookup, nó có các tùy chọn khác nhau. Vì vậy, nhận xét "Tôi biết echocó thể mất -n" trong bối cảnh câu hỏi phải làm với Windows, là không chính xác.
dùng66001

Câu trả lời:


236

Sử dụng set/ptham số bạn có thể lặp lại mà không cần dòng mới:

C:\> echo Hello World
Hello World

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

Nguồn


86
Các đường ống rất chậm vì nó tạo ra hai nhiệm vụ cmd thêm, nhanh hơn là <nul set /p =Hello. set /pkhông thể lặp lại một dấu bằng như ký tự đầu tiên cũng như khoảng trắng / tab.
Jeb

11
Nó nhanh hơn gần 15 lần trên hệ thống của tôi
jeb

28
Thêm dấu ngoặc kép quanh "Hello World" để ngăn không gian bên ngoài sau d.
Brian

13
Cảnh báo: Điều này sẽ thay đổi ERRORLEVEL thành 1. Xem câu trả lời của @xmechanix.
CoperNick

6
@ user246694 < nullà một chuyển hướng từ NULthiết bị. Nó không chứa gì, nhưng điều đó là đủ set /pđể ngừng chờ đợi đầu vào của người dùng
jeb

100

Sử dụng: echo | set /p=hoặc <NUL set /p=cả hai sẽ hoạt động để ngăn chặn dòng mới.

Tuy nhiên, điều này có thể rất nguy hiểm khi viết các tập lệnh nâng cao hơn khi kiểm tra ERRORLEVEL trở nên quan trọng vì cài đặt set /p=mà không chỉ định tên biến sẽ đặt ERRORLEVEL thành 1.

Một cách tiếp cận tốt hơn là chỉ sử dụng một tên biến giả như vậy:
echo | set /p dummyName=Hello World

Điều này sẽ tạo ra chính xác những gì bạn muốn mà không có bất kỳ thứ lén lút nào đang diễn ra trong nền vì tôi phải tìm ra cách khó khăn, nhưng điều này chỉ hoạt động với phiên bản đường ống; <NUL set /p dummyName=Hellovẫn sẽ nâng ERRORLEVEL lên 1.


20
Cảnh báo: Lệnh này sẽ đặt ERRORLEVEL thành 0. Nếu ERRORLEVEL lớn hơn 0 thì nó sẽ thay đổi ERRORLEVEL thành 0. Điều này cũng có thể nguy hiểm khi viết các tập lệnh nâng cao hơn. (nhưng +1 để trả lời)
CoperNick

Vì vậy, về cơ bản bạn cần có IF ERRORLEVEL == 0 (...) ELSE (...) chỉ để không gây hại cho môi trường của bạn trong những trường hợp đó. Sheesh.
SilverbackNet

28

Phương thức SET / P đơn giản có các hạn chế thay đổi đôi chút giữa các phiên bản Windows.

  • Báo giá hàng đầu có thể bị tước

  • Không gian trắng hàng đầu có thể bị tước

  • Dẫn =đến một lỗi cú pháp.

Xem http://www.dostips.com/forum/viewtopic.php?f=3&t=4209 để biết thêm thông tin.

jeb đã đăng một giải pháp thông minh giúp giải quyết hầu hết các vấn đề tại văn bản đầu ra mà không có nguồn cấp dữ liệu, ngay cả với không gian hàng đầu hoặc = Tôi đã tinh chỉnh phương pháp để nó có thể in hoàn toàn bất kỳ chuỗi lô hợp lệ nào mà không cần dòng mới, trên bất kỳ phiên bản Windows nào từ XP trở đi. Lưu ý rằng :writeInitializephương thức chứa một chuỗi ký tự có thể không đăng tốt lên trang web. Một nhận xét được bao gồm mô tả chuỗi ký tự nên là gì.

Các phương thức :write:writeVarđược tối ưu hóa sao cho chỉ các chuỗi chứa các ký tự hàng đầu rắc rối được viết bằng phiên bản sửa đổi của phương thức COPY của jeb. Các chuỗi không rắc rối được viết bằng phương pháp SET / P đơn giản và nhanh hơn.

@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
Rất vui khi thấy một giải pháp rất mạnh mẽ có thể xử lý tất cả các nhân vật
jeb

2
Tôi muốn chỉ ra rằng nếu máy tính tình cờ có kết nối mạng với internet thì phần lớn mã lô này có thể được sử dụng để tải xuống và cài đặt python hoặc bất cứ thứ gì khác trên máy tính có thể giúp bạn thoát khỏi lô. Batch rất thú vị tuy nhiên khả năng chuỗi của nó là tốt nhất cho cuộc trò chuyện cuối tuần.
n611x007

@dbenham trên dòng 6 "echo (" có chức năng tương tự như "echo." - không thấy điều đó trước đây
Bỏ qua R

2
@SkipR - Có, nó có chức năng giống như ECHO., ngoại trừ ECHO.có thể thất bại trong các trường hợp tối nghĩa . Có một loạt các hình thức khác cũng có thể thất bại trong các tình huống tối nghĩa. Người duy nhất luôn làm việc là ECHO(.
dbenham

10

Là một phụ lục cho câu trả lời của @ xmechanix, tôi nhận thấy thông qua việc viết nội dung vào một tệp:

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

Rằng điều này sẽ thêm một khoảng trắng ở cuối chuỗi in , điều này có thể gây bất tiện, đặc biệt vì chúng tôi đang cố gắng tránh thêm một dòng mới (một ký tự khoảng trắng khác) vào cuối chuỗi.

May mắn thay, trích dẫn chuỗi được in, tức là sử dụng:

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

Sẽ in chuỗi mà không có bất kỳ ký tự dòng hoặc dấu cách ở cuối.


5
Không gian thừa sẽ biến mất nếu bạn không đặt khoảng World>
trắng

@aschipfl Đã thử nó, nó không.
Joan Bruguera

Phương thức biến được trích dẫn, một tính năng không có giấy tờ của lệnh set, nói chung là cách tôi thấy nó nên được tiếp cận, vì nó hoạt động trong tất cả các phiên bản của WIndows NT (và 9x nếu tôi nhớ lại). Đó là bạn bọc tên Biến đến cuối giá trị trong dấu ngoặc kép. Điều này cũng đúng với Set / P.
Ben Personick

1
IE: tiếng vang | set / p "dummyName = Hello World"> somefile.txt
Ben Personick

2
@aschipfl Một khoảng trắng thừa sẽ xuất hiện nếu bạn không trích dẫn và bạn thực hiện một đường ống. xxd là một tiện ích kết xuất hex, vì vậy chúng tôi thấy ví dụ set /p="abc"<nul|xxd -phiển thị 616263 trong khi set /p=abc<nul|xxd -pcung cấp61626320
barlop

9

Một giải pháp cho khoảng trắng bị tước trong SET / P:

mẹo nhỏ là backspace char mà bạn có thể triệu tập trong trình soạn thảo văn bản EDIT cho DOS. Để tạo nó trong EDIT, nhấn ctrlP + ctrlH . Tôi sẽ dán nó ở đây nhưng trang web này không thể hiển thị nó. Mặc dù vậy, nó vẫn hiển thị trên Notepad (nó giống như một hình chữ nhật nhỏ màu đen với một vòng tròn màu trắng ở giữa)

Vì vậy, bạn viết này:

<nul set /p=.9    Hello everyone

Dấu chấm có thể là bất kỳ ký tự nào, chỉ có ở đó để nói với SET / P rằng văn bản bắt đầu từ đó, trước dấu cách và không phải ở " Xin chào ". " 9 " là một đại diện của char backspace mà tôi không thể hiển thị ở đây. Bạn phải đặt nó thay vì 9 và nó sẽ xóa " . ", Sau đó bạn sẽ nhận được điều này:

    Hello Everyone

thay vì:

Hello Everyone

Tôi hy vọng nó sẽ giúp


2
Tôi quên nói, nó hoạt động trong Windows 7 Nó không hoạt động trong một dòng lệnh, chỉ trong một đợt. Đối với bất kỳ ai không nhận được char, hãy tải xuống ví dụ này: pecm.com.sapo.pt/SET_with_backspace_char.txt
Pedro

Cũng đúng với Echo
Ben Personick

... Vì vậy, sau khi thực hiện một tìm kiếm kỹ lưỡng chết tiệt, tôi đã không tìm thấy BẤT CỨ NƠI NÀO nào trên mạng. Đó có thể là lần duy nhất tôi thực sự phát hiện ra điều gì đó, và bởi sự may mắn ngu ngốc. Đối với những người không biết bạn CÓ THỂ nhập các ký tự điều khiển nếu bạn đặt dấu nhắc cmd của mình ở chế độ cũ và sử dụng đúng phông chữ. ... Nhưng nếu bạn chỉ cần chuyển hướng bất cứ thứ gì vào một tệp hoặc> con thì nó cũng hoạt động. Nghiêm túc. Dán CHÍNH XÁC này vào dấu nhắc lệnh của bạn: "echo ← c◙◙ Harharhar !! ◙ ○○ ------------- ◙◙ Tôi là người tồi tệ nhất!?: '( NOPE! • Tôi cảm thấy tuyệt vời! Hazzah-le-oop! ◙◙ Tôi là người lập trình nghe tôi ... một cái gì đó.◙> con ".
Brent Rittenhouse

Được rồi, tôi hy vọng tôi đã tìm thấy điều này trước bất kỳ ai khác nhưng ... điều này dường như phụ thuộc vào việc không ở trong một trang mã unicode. Bạn có thể lưu trữ bắt đầu trong một biến làm chcp 437, đặt tập hợp trong một biến hoặc xuất nó, sau đó chuyển trở lại (và nó vẫn nên xuất). Tôi vẫn đang chơi với nó.
Brent Rittenhouse

Ngoài ra, có ai có ý tưởng nào tại sao ← c xóa màn hình không?! Tôi không thể tìm thấy một ví dụ về bất cứ nơi nào trên mạng. Đó là sự kết hợp đặc biệt, mặc dù bạn dường như cũng có thể có khoảng trắng giữa hai nhân vật. Đối với bất kỳ nhân vật nào khác, dường như chỉ cần .. loại bỏ ký tự đầu tiên. Tôi không hiểu điều đó ...
Brent Rittenhouse

7

Bạn có thể xóa dòng mới bằng cách sử dụng "tr" từ gnuwin32 ( gói coreutils )

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

Nhân tiện, nếu bạn đang thực hiện nhiều kịch bản, gnuwin32 là một mỏ vàng.


Tôi cũng đề nghị cài đặt git bash . chắc chắn rằng nó không giống với gnuwin32 (và nó là goldmine do đó +1), nó chỉ là một thiết lập đẹp và bạn có git-bash trên nút chuột phải gần như ở mọi nơi bao gồm cả nút menu bắt đầu.
hakre

bạn có thể sử dụng tr để loại bỏ ký tự khoảng trắng cuối cùng không, như trong trim?
panny

sử dụng sed để cắt: sed -e "s / * $ //"
BearCode

@panny - Tôi không thể tìm thấy một posix / linux sử dụng được gọi là trim. Ngoài ra, \r, \nhoặc \r\n(dòng mới trong OSX, Posix và Windows tương ứng) không phải là "không gian" ký tự.
user66001

5

Đây là một phương pháp khác, nó sử dụng Powershell Write-Host có tham số -NoNewLine, kết hợp với start /bvà nó cung cấp cùng chức năng từ lô.

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

Đầu ra

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

Cái này bên dưới hơi khác một chút, không hoạt động chính xác như OP muốn, nhưng thật thú vị vì mỗi kết quả ghi đè lên kết quả trước đó mô phỏng một bộ đếm.

@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

Có lẽ đây là thứ bạn đang tìm kiếm, đó là một kịch bản trường học cũ ...: 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

hoặc có thể bạn đang cố gắng thay thế một dòng hiện tại thay vì viết lên một dòng mới? bạn có thể thử nghiệm điều này bằng cách xóa "% bs%" sau dấu "." ký và cũng bằng cách tách ra "% bs%" khác sau "Thông báo mẫu".

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

Tôi thấy điều này thực sự thú vị bởi vì nó sử dụng một biến cho một mục đích khác với những gì nó dự định làm. như bạn có thể thấy "% bs%" đại diện cho một khoảng lùi. "% Bs%" thứ hai sử dụng khoảng trắng phía sau để thêm khoảng trắng sau "Thông báo ví dụ" để tách "đầu ra của lệnh tạm dừng" mà không thực sự thêm một ký tự hiển thị sau "Thông báo ví dụ". Tuy nhiên, điều này cũng có thể với một tỷ lệ phần trăm thông thường.


2
Tôi thấy set nl=^& echo.thủ thuật này ở khắp mọi nơi và tên của biến là sai lệch. % nl% không phải là một ký tự dòng mới : nó mở rộng đến &echo.mức cuối cùng bạn đang chạy một echolệnh mới mỗi lần, do đó là dòng mới. Bạn có thể kiểm tra nó bằng văn bản echo "%nl%The%nl%new%nl%line%nl%is%nl%not%nl%apparent%nl%throughout%nl%text%nl%". Bạn nhận được "& echo. The& echo. new& echo. line& echo. is& echo. not& echo. apparent& echo. throughout& echo. text& echo. ", tiết lộ các mẹo. Đầu ra là như nhau nhưng không phải vì lý do bạn đề xuất.
cdlvcdlv

2

cw.exeTiện ích DIY (bảng điều khiển viết)

Nếu bạn không tìm thấy nó ngoài hộp, ngoài giá, bạn có thể DIY. Với cwtiện ích này, bạn có thể sử dụng mọi loại ký tự. Ít nhất, tôi muốn nghĩ như vậy. Hãy căng thẳng kiểm tra nó và cho tôi biết.

Công cụ

Tất cả bạn cần là .NET cài đặt , điều này rất phổ biến hiện nay.

Nguyên vật liệu

Một số ký tự gõ / sao chép-dán.

Các bước

  1. Tạo .battập tin với nội dung sau.
/* >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. Chạy nó

  2. Bây giờ bạn có một tiện ích 4KB đẹp để bạn có thể xóa .bat.

Ngoài ra, bạn có thể chèn mã này dưới dạng chương trình con trong bất kỳ lô nào, gửi kết quả .exeđến %temp%, sử dụng mã đó trong lô của bạn và xóa mã đó khi bạn hoàn tất.

Cách sử dụng

Nếu bạn muốn viết một cái gì đó mà không có dòng mới:
cw Whatever you want, even with "", but remember to escape ^|, ^^, ^&, etc. unless double-quoted, like in "| ^ &".

Nếu bạn muốn trở về xe ngựa (đi đến đầu dòng), hãy chạy ngay
cw

Vì vậy, hãy thử điều này từ dòng lệnh:

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

Tôi đã được truyền cảm hứng từ câu trả lời của bạn và đã tạo ra công cụ nhỏ này với Go và tác vụ đi kèm này cho Azure Pipelines. Nó chỉ lấy các thiết bị xuất chuẩn được dẫn vào và xuất ra một định dạng cụ thể được chọn bởi bản dựng. Cảm ơn bạn!
riezebosch

2

Tôi đã thực hiện một chức năng từ ý tưởng của @arnep:

echo | set / p = "Xin chào thế giới"

đây là:

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

Sử dụng nó với call :SL "Hello There"
tôi biết điều này không có gì đặc biệt nhưng tôi đã mất rất lâu để nghĩ về nó. Tôi nghĩ rằng tôi đã đăng nó ở đây.


1

Mẫu 1: Điều này hoạt động và tạo mã Thoát = 0. Đó là Tốt. Lưu ý "." , trực tiếp sau tiếng vang.

C: \ Users \ phife.dog \ gitrepose \ 1 \ repo_abc \ scripts #
@echo. | set / p JUNK_VAR = Đây là một thông báo được hiển thị giống như Linux echo -n sẽ hiển thị nó ... & echo% ERRORLEVEL%

Đây là một thông báo được hiển thị như Linux echo -n sẽ hiển thị nó ... 0

Mẫu 2: Điều này hoạt động nhưng tạo mã Thoát = 1. Điều đó là xấu. Xin lưu ý thiếu ".", Sau tiếng vang. Đó dường như là sự khác biệt.

C: \ Users \ phife.dog \ gitrepose \ 1 \ repo_abc \ scripts #
@echo | set / p JUNK_VAR = Đây là một thông báo được hiển thị giống như Linux echo -n sẽ hiển thị nó ... & echo% ERRORLEVEL%

Đây là một thông báo được hiển thị như Linux echo -n sẽ hiển thị nó ... 1


1

Lấy cảm hứng từ các câu trả lời cho câu hỏi này, tôi đã tạo một tập lệnh truy cập đơn giản, tiếp tục in giá trị tiến trình (0-100%) trên cùng một dòng (ghi đè lên tập lệnh trước đó). Có lẽ điều này cũng sẽ có giá trị cho những người khác đang tìm kiếm một giải pháp tương tự.

Ghi chú : Các *ký tự không in được, chúng phải được nhập bằng tổ hợp phím [ Alt+ Numpad 0+ Numpad 8], là backspaceký tự.

@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

Tôi tin rằng không có lựa chọn như vậy. Ngoài ra, bạn có thể thử điều này

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

3
Điều này vẫn sẽ in một dòng mới.
René Nyffalanger

3
Bạn có thể nối vào cùng một biến số như bạn muốn và chỉ lặp lại ở cuối.
m0skit0

2
In nó khi thực hiện vòng lặp hoặc ở cuối không quan trọng nếu dữ liệu được bảo tồn. Đối với mỗi vòng lặp, bạn chỉ cần nối dữ liệu và sau đó khi vòng lặp kết thúc, bạn in nó. Kết quả là như nhau.
m0skit0

9
không quan trọng nếu nó là một chỉ báo về sự tiến triển của vòng lặp.
gregseth

3
Bạn không bao giờ nói rằng trong câu hỏi của bạn hoặc yêu cầu hành vi này bất cứ nơi nào trong câu hỏi của bạn.
m0skit0

0

Bạn có thể chặn dòng mới bằng cách sử dụng lệnh set / p. Lệnh set / p không nhận ra một khoảng trắng, để bạn có thể sử dụng dấu chấm và ký tự backspace để làm cho nó nhận ra nó. Bạn cũng có thể sử dụng một biến làm bộ nhớ và lưu trữ những gì bạn muốn in trong đó, để bạn có thể in biến thay vì câu. Ví dụ:

@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

Bằng cách này, bạn có thể in bất cứ thứ gì mà không cần một dòng mới. Tôi đã tạo chương trình để in từng ký tự một, nhưng bạn cũng có thể sử dụng các từ thay vì các ký tự bằng cách thay đổi vòng lặp.

Trong ví dụ trên tôi đã sử dụng "enableelayedExansion" để lệnh set / p không nhận ra "!" ký tự và in một dấu chấm thay vì đó. Tôi hy vọng rằng bạn không sử dụng dấu chấm than "!" ;)


-1

Câu trả lời muộn ở đây, nhưng đối với bất kỳ ai cần viết các ký tự đặc biệt cho một dòng duy nhất tìm thấy câu trả lời của dbenham dài khoảng 80 dòng và các tập lệnh có thể bị hỏng (có lẽ do đầu vào của người dùng) trong các giới hạn của việc sử dụng đơn giản set /p, Có lẽ dễ dàng nhất để ghép .bat hoặc .cmd của bạn với một ngôn ngữ C ++ hoặc C được biên dịch và sau đó chỉ couthoặc printfcác ký tự. Điều này cũng sẽ cho phép bạn dễ dàng viết nhiều lần vào một dòng nếu bạn đang hiển thị một loại thanh tiến trình hoặc thứ gì đó sử dụng các ký tự, như OP rõ ràng là.


@jiggunjer Bạn có chắc không? printfing từ khung Win-7 cmdmang lại cho tôi"'printf' is not recognized as an internal or external command, operable program or batch file."
SeldomNeedy

printfkhông có nguồn gốc từ windows. Đây là một câu hỏi về cửa sổ.
kayleeFrye_onDeck

1
@kayleeFrye_onDeck Tôi cho rằng bình luận của bạn hướng vào jiggunjer , không phải tôi; Tôi đề nghị trong câu hỏi của tôi rằng C và C ++ có thể được sử dụng như là một thay thế khá độc lập với nền tảng cho các lệnh shell trong trường hợp định dạng là quan trọng.
SeldomNeedy

1
Tha lỗi cho bố, vì con đã lướt qua.
kayleeFrye_onDeck

Nhưng sau đó, đầu vào vỏ cần phải được phân tích cú pháp chính xác. Ví dụ, làm thế nào một chương trình như vậy sẽ in một dấu ngoặc kép?
Alex
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.