Windows 复制CMD“timeout”倒计时以在自定义回显中打印

Windows 复制CMD“timeout”倒计时以在自定义回显中打印,windows,batch-file,for-loop,cmd,Windows,Batch File,For Loop,Cmd,我编写了一个批处理脚本,供最终用户使用。除了让用户认为发生了什么事情之外,没有什么特殊的功能目的,我想让脚本在继续执行之前等待几秒钟。在Vista和更高版本上,这可以通过TIMEOUT/3轻松完成 但是,我想用自己的自定义输出替换TIMEOUT命令的默认输出,同时保留其倒计时功能。据我所知,TIMEOUT或等效的PING或SLEEP方法都不支持这一点,因此这必须手动完成,我想知道实现这一点最简单的方法是什么。TIMEOUT所做的一切都是从您给它的时间t开始计数,直到0为止。因此,您实际上可以通过

我编写了一个批处理脚本,供最终用户使用。除了让用户认为发生了什么事情之外,没有什么特殊的功能目的,我想让脚本在继续执行之前等待几秒钟。在Vista和更高版本上,这可以通过TIMEOUT/3轻松完成

但是,我想用自己的自定义输出替换TIMEOUT命令的默认输出,同时保留其倒计时功能。据我所知,TIMEOUT或等效的PING或SLEEP方法都不支持这一点,因此这必须手动完成,我想知道实现这一点最简单的方法是什么。

TIMEOUT所做的一切都是从您给它的时间t开始计数,直到0为止。因此,您实际上可以通过执行以下操作来执行相同的操作:

如果你想的话,用t打印一些东西 等一秒钟 用t-1打印一些东西 等一秒钟 ... 您可能希望在一行上打印所有内容。您可以通过在行尾打印回车来实现这一点:其效果是您可以覆盖该行内容,而不是完全删除内容,只是覆盖内容。下面是一个技巧,可以在启用延迟扩展的情况下获取回车符:

这将把回车符放入carret变量中


现在打印…您将无法使用echo进行打印,它仍将使用回车符和换行符结束您的每个输入,您将在每次回显后在新行结束,回车符将不再有用。因此,您必须使用set/p。它允许您在不使用回车符和换行符的情况下打印:set/p=打印某些内容我看不出问题,您也可以使用

Echo My own hint to press any key
Pause >NUL
你可以做超时

值得J.Baoby称赞的是卡雷特,倒计时循环比手动循环要简单一些。 循环中的第一个set/P似乎与数字不符,所以我在前面放了一个

@Echo off&SetLocal EnableExtensions EnableDelayedExpansion

REM countdown of 5 seconds
set /A count=15

REM prepare carriage return
FOR /F %%a IN ('copy /Z "%~dpf0" nul') DO set "carret=%%a"

set /p =%count% seconds to go...!carret!  <nul
For /L %%S in (%Count%,-1,1) Do (
  set /p =%%S seconds to go...!carret!  <nul
  Timeout /T 1 >NUL
)
echo Done waiting...

为了有更长的倒计时时间,不在提示符后面留下字符,应该在提示符的末尾添加一些空格。为了能够中断倒计时,您可以通过选择和检查循环中的errorlevel来交换超时。

请从中尝试sleepx.exe。请阅读问题。该脚本不适用于我的个人计算机,因此它必须独立于任何依赖项工作。更详细地说,使用的任何东西至少必须是Vista及以上版本的本机命令。您没有说您不能包含外部可执行文件,而是要求一些简单的命令。因此我的评论。我可能应该说得更清楚,对不起。@Hashim,不管您的外部依赖性如何,都有办法将独立的可执行文件嵌入批处理文件中,这样它们就可以与批处理文件本身一起移植。这是genius,它的行为几乎完全符合我的预期,因此非常感谢。有一些小问题会阻止它像超时计数器一样工作。我设法解决了除了一个以外的所有问题。第一个也是最简单的是超时计数器向下计数为0,而此解决方案在停止前计数为1。将IF语句设置为检查计数为-1而不是0可以解决此问题,尽管可能是一种粗糙的方式。第二个问题是,如果在“要转到的秒数”提示中的最后一个字符和!卡雷特!,最后一个字符打印两次——在上面的例子中,是一个句点。奇怪的是,这只发生在第一个数字被回显后——所以在5上一切看起来都正常,但在4和后续的数字上,有一个重复字符。第三,在第一个数字上,但在其后的数字中没有一个,该数字后面跟一个分号。可能与第二个问题有关,因为这一个出现在数字上,而那一个没有,而那一个出现在这一个没有的地方。希望这两个问题能够得到解决,使这个解决方案成为一个完美的替代方案。不过,再次感谢你,我从来都不知道你做了什么。你解释的第一个问题对我来说有点违反直觉。如果我看到还有0秒。。。我真的希望它停止,我不必再等待了。如果它能在0.5秒后打印出来。。。这是可以的,但我不知道如何增加精度。无论如何,请不要忘记,在为0添加打印的情况下,当0出现在屏幕上时,等待的时间比等待的时间长一秒。您也可以通过使用GEQ更大或Equala无法真正理解您所描述的第二个问题来替换中的全球技术法规,使其接受0。这可能不是因为每个数字都添加了一个字符,而是因为最后一句话是在等待。。。不会完全覆盖其余部分。我已经编辑了我的答案,并提供了更多的解释。我希望它能解决这个问题。
Done waiting...   
X seconds to go...
   from here ->   <- untill here: characters that won't be overwritten
Done waiting......
echo Done waiting...<SPACE><SPACE><SPACE>
FOR /L %%S IN (%count%, -1, 1) DO (
    set /p =%%S seconds to go...!carret!<nul
    ping -n 2 127.0.0.1 > nul 2>&1
)
Echo My own hint to press any key
Pause >NUL
@Echo off&SetLocal EnableExtensions EnableDelayedExpansion

REM countdown of 5 seconds
set /A count=15

REM prepare carriage return
FOR /F %%a IN ('copy /Z "%~dpf0" nul') DO set "carret=%%a"

set /p =%count% seconds to go...!carret!  <nul
For /L %%S in (%Count%,-1,1) Do (
  set /p =%%S seconds to go...!carret!  <nul
  Timeout /T 1 >NUL
)
echo Done waiting...