【发布时间】:2019-06-07 12:35:47
【问题描述】:
我在Windows Batch Scripting做了一个简单的倒计时:
@ECHO OFF
MODE con: cols=13 lines=2
COLOR 4f
TITLE Countdown Timer
SET /p m=? Minutes:
SET /a s = 60 * m
FOR /l %%a in (%s%,-1,1) do (
ECHO %%a/%s%
PING -n 2 127.0.0.1 >NUL 2>&1
CLS
)
IF ERRORLEVEL 1 EXIT
CSCRIPT alert.vbs
EXIT
我注意到以下几点:
- 我可以使用的最大秒正是eighth Mersenne prime:
2147483647(2147483647 seconds to years at DuckDuckGo),但是 - 如果我使用乘数
60以分钟 开始倒计时,则可接受的最大整数为1037950429.99999999。-
1037950429.99999999 minutes to years 等于
1973.43904479,指的是 June 10, 1973 上午 9:00 的那一天,但根据我的研究,那一天并没有发生什么特别的事情。
-
1037950429.99999999 minutes to years 等于
通过研究了解为什么(?),我提出了这个问题。
【问题讨论】:
-
它与时间测量的限制无关。它与整数的精度有关,在命令或批处理文件 IIRC 中以 32 位签名。
-
不要在
=周围批量使用空格,如SET /a s = 60 * m。 Don't use ping to sleep。而 2147483647 只是 2³¹-1,它是最大的 32 位整数(cmd 使用)。此外set /a不支持浮点运算,因此set /a 1037950429,99999999*60与set /a 99999999*60完全相同。如果要使用 64 位 int 或 double,则必须使用其他脚本语言,如 powershell 或 VBS -
另外,任意决定从任何基点开始一定的分钟数是错误的。您已将其(错误地)与 1973 年 6 月 10 日 9:00 相关联,但这并不准确。这只是一定的分钟数——除了你决定分配的时间之外,这些分钟没有开始参考点。 IOW,如果我现在启动一个计时器并让它运行 10 分钟,那么该计时器的起始参考点不是 1970 年,而是我启动计时器的时间。您的
1973表示 1973 年期间,而不是从特定起点算起的 1973 年。 2019+1973有效。 -
要获得 32 位精度的最大正数,请在命令提示符处输入
set /A 0x7FFFFFFF。对于最小负数,输入set /A 0x80000000 -
感谢你们出色的 cmets,现在我有我所有的答案了!按日期付款很有趣;)
标签: windows batch-file cmd