在同一条线上回响

时间:2010-11-04 13:17:47

标签: windows batch-file windows-server-2003 echo

我看过你的数据库之前的问题而我没有尝试答案,但我试试了。

我想写下面的代码:

echo Executing backup....
backup procedure
echo Ok

但输出应为:

Executing backup... Ok

那可能吗?!

5 个答案:

答案 0 :(得分:9)

我想你正在使用dos / nt-batch。

可以使用set / p命令,因为set / 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

编辑:解释,如何创建变量cr(使用技巧完成)

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

重复变为8188个字符

然后将变量,两个空格以及CR和LF回显到echo !X! > %temp%\cr.tmp的文件中(注意!X!>之间的两个空格以及自然行结尾在内部回应修正)

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

在下一行echo\>> %temp%\cr.tmp中,另一个CR/LF集合附加到文件中(命令中的\只是输出回车符和换行符的任何内容,因为{ {1}}由它自己输出echo),这很重要,因为单行ECHO is ON/OFF无法在一行的末尾读取(以后更多)。

因此该文件现在包含CR

<8188 .'s><SPACE><SPACE><CR><CR><LF>读取第二个标记,分隔符是标准空格和制表符,因此第二个标记只有一个for /f "tokens=2 usebackq" %%a in ("%temp%\cr.tmp") do,因为以下CR作为标准行结尾被删除。

最后,CR/LF用于返回不存在临时变量endlocalXc的环境(与括号中的a一样,它允许在endlocal在括号末尾实际生效之前设置cr(也可以写为endlocal

<强>另外

这是我创建CR角色的第一种方法,但它需要一些时间和一个临时文件 后来我看到了一种从for /f "tokens=2 usebackq" %%a in ("%temp%\cr.tmp") do endlocal&set cr=%%a&goto :eof命令中检索CR的简单方法。

copy /z

答案 1 :(得分:3)

在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

答案 2 :(得分:1)

这有点像黑客攻击,但这里有一个article describing how to do it用于Windows。

从文章中,最终结果(为您的设置编辑)如下所示:

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

Backup_process %Result% >NUL 2>&1

IF ERRORLEVEL 1 
  ECHO FAIL 
ELSE
  ECHO OK

答案 3 :(得分: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"

答案 4 :(得分:-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的重定向也将停止等待用户输入。