2010-11-04 20 views
7

我看了一下之前关于你的db的问题,我没有尝试一个答案,但我试了一下。回声在同一行

我想编写以下行代码:

echo Executing backup.... 
backup procedure 
echo Ok 

但输出应该是:

Executing backup... Ok 

这是可能的?

+1

你在哪个操作系统上? – 2010-11-04 13:21:37

+0

是的,Windows Server 2003中,我忘了... – aemme 2010-11-04 13:31:10

回答

9

我想你使用的是DOS/NT-批次。

这是可能与该组/ p命令,因为集/ P不打印一个CRLF

set /p "=Executing backup...." <nul 
echo OK 

此外有可能以擦除带有CR字符的行。 重要的是要知道set/p前面的空白字符被忽略(在Vista中,而不是在XP中),所以!cr!必须晚些时候或结束。 CR只能用delayedExpansion显示,因为%cr%起作用,但在扩展百分比阶段(或直接在此阶段之后)删除CR字符,但不在延迟扩展阶段。

其中仅使用一个线用于显示

@echo off 
setlocal EnableDelayedExpansion EnableExtensions 


call :CreateCR 
for /l %%n in (1,1,10000) do (
    set /P "=Count %%n!CR!" <nul 
) 
echo(
goto :eof 

:CreateCR 
rem setlocal EnableDelayedExpansion EnableExtensions 
set "X=." 
for /L %%c in (1,1,13) DO set X=!X:~0,4094!!X:~0,4094! 

echo !X! > %temp%\cr.tmp 
echo\>> %temp%\cr.tmp 
for /f "tokens=2 usebackq" %%a in ("%temp%\cr.tmp") do (
    endlocal 
    set cr=%%a 
    goto :eof 
) 
goto :eof 

EDIT的计数器的实施例:说明,如何可变cr被创建(完成一招)

可变X设定为后单点(字符本身不重要),重复成为8188个字符通过for /L %%c in (1,1,13) DO set X=!X:~0,4094!!X:~0,4094!

然后va可变结构,两个空间并兼具CR和LF的呼应与echo !X! > %temp%\cr.tmp文件(注意!X!>与自然行结尾呼应赔偿内部之间的两个空格)

我们现在有8192个字符,但数据缓冲区只能容纳8191个字符,所以最后一个字符(换行符)将被删除!

下一行echo\>> %temp%\cr.tmp,另一CR/LF组附加到文件(在命令中\仅仅是输出没有什么吧回车和换行,因为echo由它的自我会输出ECHO is ON/OFF),这一点很重要,作为一个单一的CR不能在行的末尾读取(更多后面的内容)。

所以文件现在包含<8188 .'s><SPACE><SPACE><CR><CR><LF>

for /f "tokens=2 usebackq" %%a in ("%temp%\cr.tmp") do读取第二道理,delimters是标准的空间和标签,所以第二个令牌是只有一个CR,如下面的CR/LF作为标准行结束删除。

最后endlocal用于返回到环境,而临时变量Xca现有的(如括号中是endlocal,它允许crendlocal前的设置,其实需要在括号结束影响(也可以写成for /f "tokens=2 usebackq" %%a in ("%temp%\cr.tmp") do endlocal&set cr=%%a&goto :eof

此外

这是创建一个CR字符我的第一种方式,但它需要一定的时间和临时文件。
后来我看到一个更简单的从copy /z命令中检索CR的方法。

for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a" 
+0

你写的第一个例子perfetly作品。什么是 aemme 2010-11-04 14:49:43

+0

jeb 2010-11-04 15:05:56

+0

user66001 2012-12-02 00:47:55

2

试试这个Posix的系统(Linux)的

echo -n "Executing backup.... " 
echo -n "backup procedure " 
echo "Ok" 

这是更难在Windows上。您将需要使用像这样:

@echo off 
echo|set /p ="Executing backup...." 
echo|set /p =" backup procedure" 

检查这个帖子:http://www.pcreview.co.uk/forums/showpost.php?s=1a20b16775d915998b30bd76a0ec5d35&p=4432915&postcount=7

+0

我使用Windows Server 2003 .... – aemme 2010-11-04 13:31:58

+0

@Piotr Czapla - 我不相信/每个集合(Windows示例)是必需的,或者至少它似乎没有工作一样。但是,试图删除它们时,有人阻止了编辑,所以也许这是错误的http://stackoverflow.com/questions/13665411/what-does-a-forward-slash-before-a-pipe-in​​-cmd-做去除的最行结束期的一#comment18755645_13665411。你能告诉我们需要吗? – user66001 2012-12-02 02:25:24

+0

管道创建新的cmd.exe实例被提及在其他相关的thead(请参阅我的回复) – 2016-06-23 01:35:43

1

这有点破解,但这是Windows的article describing how to do it

从文章,最后的结果(编辑您的设置)是这样的:

SET /P var=Backing up 
%Result%....<NUL 

Backup_process %Result% >NUL 2>&1 

IF ERRORLEVEL 1 
    ECHO FAIL 
ELSE 
    ECHO OK 
+0

非常感谢,我只能接受1回答....我会看看它 – aemme 2010-11-04 15:40:47

0

我用VBScript做了类似的事情。

将这个代码EchoNoNewline.vbs

If WScript.Arguments.Named.Exists("TEXT") Then 
    WScript.StdOut.Write WScript.Arguments.Named.Item("TEXT") 
End If 

从您的批处理文件,使用这样的脚本:

CSCRIPT EchoNoNewLine.vbs //NOLOGO /TEXT:"Executing backup...." 
backup procedure 
CSCRIPT EchoNoNewLine.vbs //NOLOGO /TEXT:"Ok" 
-1

What does a forward slash before a pipe in cmd do to remove the line ending of an echo? 最好的建议是:

回显没有换行的文本是非常我因为管道会创建两个新的cmd.exe实例。 这是更简单,更快地使用

 <nul set /p "=My Text" 

从NUL重定向也将停止对用户输入的等待。

+0

想知道为什么有人通过这个答案没有用 – 2014-08-19 15:07:16

+0

因为你这是我认为的答案 – SomethingDark 2016-06-21 14:16:24

+0

你是认真的吗?我在这里发送的答案来自另一个线程。这里接受的答案是一些非常长的文本 – 2016-06-22 16:11:18