我看了一下你数据库之前的问题,没有尝试回答,但是我会尝试。
我想写以下代码:
echo Executing backup....
backup procedure
echo Ok
但是输出应该是:
Executing backup... Ok
"那真的可能吗?!"
我看了一下你数据库之前的问题,没有尝试回答,但是我会尝试。
我想写以下代码:
echo Executing backup....
backup procedure
echo Ok
Executing backup... Ok
我猜你正在使用dos/nt-batch。
通过使用set /p命令,这是可能的,因为set /p不会输出回车和换行符。
set /p "=Executing backup...." <nul
echo OK
另外,可以使用CR字符删除该行。但需要注意,在set /p开头的空白字符会被忽略(在Vista中是这样,在XP中不是),因此!cr!必须放在后面或最后。 只有在delayedExpansion下才能显示CR,因为%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!
和 >
之间有两个空格,并且 echo 命令会自动添加自然换行符)。
此时我们得到了8192个字符,但是数据缓冲区只能容纳8191个字符,因此最后一个字符(换行符)将被丢弃!
接下来,使用命令 echo\>> %temp%\cr.tmp
再向文件中追加一个 CR 和 LF(命令中的 \
只为输出除回车和换行符外的内容,因为 echo
命令默认会输出“ECHO is ON/OFF”)。这很重要,因为单独的 CR 字符无法读取末尾行(稍后解释)。
因此,文件现在包含 <8188个点><空格><空格><CR><CR><LF>
这些字符。
接下来,for /f "tokens=2 usebackq" %%a in ("%temp%\cr.tmp") do
命令读取第二个 token,分隔符为标准空格和制表符,因此第二个 token 只是单个的 CR,因为后面的 CR/LF 已经作为标准行结束而被删除了。
最后使用 endlocal
返回到没有临时变量 X
、c
和 a
的环境中(由于括号内的 endlocal
允许在实际结束之前设置 cr
,因此它也可以写成 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"
set /p "=执行备份中...." <nul
)似乎能够起到同样的作用,如果我在这个位置看到它,也不会(至少)让我困惑,因此建议对此帖子进行编辑。 - user66001<8188 .'s><SPACE><CR><CR><LF>
吗?因为将其替换为代码会将<CR><CR><LF>
放入第二个标记。5)set cr=
、set /p
或其他内容是否会删除最后的CR/LF
作为标准行尾? - user66001echo -n "Executing backup.... "
echo -n "backup procedure "
echo "Ok"
@echo off
echo|set /p ="Executing backup...."
echo|set /p =" backup procedure"
这是一个有点hack的方法,但是在Windows上可以使用文章描述如何实现。
从文章中,最终结果(根据您的设置进行编辑)如下:
SET /P var=Backing up
%Result%....<NUL
Backup_process %Result% >NUL 2>&1
IF ERRORLEVEL 1
ECHO FAIL
ELSE
ECHO OK
在cmd中,管道符前面的斜杠是用来去除echo命令输出的换行符吗?最好的建议是:
如果要输出没有换行符的文本,使用管道符会创建两个新的cmd.exe实例,非常低效。更简单、更快速的方法是使用
<nul set /p "=My Text"
我曾经使用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"