我试图创建一个打字机效果,但SET / P正在剥离空间,因为我在win7上。我还缺少另一种方法或伎俩吗?
以下是我目前提出的代码:
@echo off
setlocal enabledelayedexpansion
set text=This is a test
call :strlen len text
for /l %%b in (0,1,%len%) do (
set /a T=!random! %% 3
ping -n !T! 127.0.0.1>nul
<nul set /p=!text:~%%b,1!
)
exit /b
:strlen <resultVar> <stringVar>
setlocal EnableDelayedExpansion
set "s=!%~2!#" & set "len=0"
for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
if "!s:~%%P,1!" NEQ "" ( set /a "len+=%%P" & set "s=!s:~%%P!" ))
endlocal &set "%~1=%len%"
exit /b
答案 0 :(得分:2)
如果输出严格用于屏幕,并且从不重定向到文件,则有一个使用退格符的简单解决方案。为每个SET / P输出添加一些可打印字符,然后是退格键,后跟所需的字符串。
@echo off
setlocal enabledelayedexpansion
:: Define BS to contain backspace character
for /f %%A in ('"prompt $H&for %%B in (1) do rem"') do set "BS=%%A"
set text=This is a test
call :strlen len text
for /l %%b in (0,1,%len%) do (
set /a T=!random! %% 3
ping -n !T! 127.0.0.1>nul
<nul set /p=.!BS!!text:~%%b,1!
)
exit /b
:strlen <resultVar> <stringVar>
setlocal EnableDelayedExpansion
set "s=!%~2!#" & set "len=0"
for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
if "!s:~%%P,1!" NEQ "" ( set /a "len+=%%P" & set "s=!s:~%%P!" ))
endlocal &set "%~1=%len%"
exit /b
上述问题是点和退格符将出现在重定向到文件的任何输出中。另一个可能的问题是,如果光标位于线上的最后一个字符位置,则该技术会失败,因为在点之后将自动发出换行符,然后退格区无法备份到前一行。
如果您必须将输出重定向到文件,或者您想要一个适用于所有情况的强大解决方案,那么jeb在Output text without linefeed, even with leading space or =处有一个非常聪明的解决方案。