繁体   English   中英

保留空间

[英]Preserve spaces with <Nul set /p

我正在尝试创建打字机效果,但 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

如果输出严格用于屏幕,并且从不重定向到文件,那么有一个使用退格字符的简单解决方案。 使用一些可打印字符作为每个 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 在没有换行符的输出文本中有一个非常聪明的解决方案,即使有前导空格或 =

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM