找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 1224|回复: 24

[系统相关] 怎样实现倒计时判断逻辑?

[复制链接]
发表于 2026-2-21 07:09:18 | 显示全部楼层 |阅读模式
本帖最后由 小白龙 于 2026-2-21 07:10 编辑

我想实现倒计时6秒, 若按下了任意键,则回显A, 若没有按下任意键, 倒计时6秒后则回显B
试了N个ai, 十几个回合都没有实现, 太弱智了
需要用批处理, 不用powershell
发表于 2026-2-21 11:43:30 | 显示全部楼层
确实AI不行,好多都是没用的,我在豆包只能问到在倒计时按下Y键显A,不按键时间到显B。不能任意键
发表于 2026-2-21 18:42:39 | 显示全部楼层
给ai一个思路就行了。开始问的是计算6秒后的时间,后来我觉得应该考虑代码执行消耗时间,及时间精度,改了下需求。
问:我需要实时获取时间,a=%time%,中间加一个timeout 6,然后获取下一个时间B=%time%,然后计算时间差 单位为厘秒
答:这是一个非常实用的需求。在批处理(Batch)中,由于 %TIME% 变量在凌晨 10 点前会包含一个前导空格(例如  9:30:05.10),如果不处理空格,字符串截取就会位移导致计算报错。

下面的脚本专门处理了空格替换、进制转换以及跨分钟/小时的逻辑。

批处理脚本代码
  1. @echo off
  2. setlocal enabledelayedexpansion

  3. :: 1. 获取第一个时间 A
  4. set "timeA=%time%"
  5. echo 开始时间 (A): %timeA%

  6. :: 2. 等待 6 秒 (实际上 timeout 6 会由于系统调度产生微小偏差)
  7. timeout /t 6 >nul

  8. :: 3. 获取第二个时间 B
  9. set "timeB=%time%"
  10. echo 结束时间 (B): %timeB%

  11. :: --- 开始计算时间 A 的总厘秒数 ---
  12. :: 将空格替换为 0,防止 10 点前截取位置错误
  13. set "t1=%timeA: =0%"
  14. set /a "h1=11%t1:~0,2% %% 100"
  15. set /a "m1=11%t1:~3,2% %% 100"
  16. set /a "s1=11%t1:~6,2% %% 100"
  17. set /a "c1=11%t1:~9,2% %% 100"
  18. set /a "total_A=(h1*360000) + (m1*6000) + (s1*100) + c1"

  19. :: --- 开始计算时间 B 的总厘秒数 ---
  20. set "t2=%timeB: =0%"
  21. set /a "h2=11%t2:~0,2% %% 100"
  22. set /a "m2=11%t2:~3,2% %% 100"
  23. set /a "s2=11%t2:~6,2% %% 100"
  24. set /a "c2=11%t2:~9,2% %% 100"
  25. set /a "total_B=(h2*360000) + (m2*6000) + (s2*100) + c2"

  26. :: --- 计算差值 ---
  27. set /a "diff=total_B - total_A"

  28. :: 如果跨天(比如从 23:59 运行到 00:01),修正差值
  29. if %diff% lss 0 set /a "diff+=8640000"

  30. echo.
  31. echo ----------------------------------
  32. echo 时间差为: %diff% 厘秒
  33. echo ----------------------------------

  34. pause
复制代码



关键点拨:
空格补位 (: =0):
%timeA: =0% 的意思是:如果时间的第一位是空格(凌晨 0-9 点),它会被替换为 0。这样 ~0,2 永远能准确定位到小时,~9,2 永远能定位到厘秒。

timeout 6 的精度:
需要注意,timeout 命令的精度并不是绝对完美的,它会有几十毫秒的系统启动开销。如果你运行结果是 605 厘秒或 598 厘秒,这是正常的系统延迟。

进制陷阱防范:
通过 11%t1:~0,2% %% 100 这种写法,彻底规避了 08 和 09 在批处理中被当做无效八进制数的问题。

跨天逻辑:
if %diff% lss 0 保证了即使你在午夜 12 点跨过的那一刻运行脚本,结果依然是正数。
发表于 2026-2-21 21:37:37 | 显示全部楼层
本帖最后由 aloha20200628 于 2026-2-22 10:35 编辑

回复 1# 小白龙

给一个 bat+mshta 版本,存为 test.bat 运行。先弹出 mshta 窗口,在设定延时期内输入任意键,会立即返回 cmd 窗口屏显 A,超时后则屏显 B

  1. <!-- :
  2. @echo off &for /f "delims=" %%s in ('mshta "%~f0" ') do echo,%%s
  3. pause&exit/b
  4. -->
  5. <meta http-equiv='x-ua-compatible' content='ie=9'>
  6. <script>
  7.     resizeTo(480, 100); //设置mshta窗口尺寸
  8.     s=6; //设置延时秒数
  9.     function a(k) {
  10.         new ActiveXObject('scripting.fileSystemObject').getStandardStream(1).write(k);
  11.         window.close(); }
  12.     function b() { if (s>0) document.title='【'+s+'秒内任意键输入】', s--, setTimeout(b, 1000); else a('B'); }
  13.     document.onkeydown=function(e) { a('A'); } //监测键入事件
  14.     window.onload=function() { window.focus(), b(); } //启动倒计时函数 b()
  15. </script>
复制代码
 楼主| 发表于 2026-2-22 06:01:27 | 显示全部楼层
回复 2# 宁处理


    怎样实现? 我试了也不行.
 楼主| 发表于 2026-2-22 06:01:48 | 显示全部楼层
回复  小白龙

给一个 bat+mshta 版本,存为 test.bat 运行。先弹出 mshta 窗口,在设定延时期内输入任意 ...
aloha20200628 发表于 2026-2-21 21:37



    我要在Pe下执行的, 所以上面的代码用不了
 楼主| 发表于 2026-2-22 06:02:46 | 显示全部楼层
回复 3# 77七


    我试了, 也不行
发表于 2026-2-22 10:25:38 | 显示全部楼层
回复 3# 77七


    把脚本里用来注释的::改成rem可能会更好些。
发表于 2026-2-22 11:19:15 | 显示全部楼层
回复 6# 小白龙

如果任意键仅限于数字和字母范围,用 choice 即可一步到位了...

  1. @echo off &setlocal &set "t=6"
  2. choice /t %t% /c "b0123456789qwertyuiopasdfghjklzxcvnm" /n /d b /m "键入单个数字或字母:"
  3. if %errorlevel% equ 1 (echo,B) else echo,A
  4. pause&exit/b
复制代码
 楼主| 发表于 2026-2-22 17:29:00 | 显示全部楼层
回复 9# aloha20200628


    又是ai直接拷贝过来的? 不行啊.
发表于 2026-2-22 19:15:07 | 显示全部楼层
介意用第三方命令吗
  1. @echo off
  2. echo;4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C010200000000000000000000000000E0000F030B010600000400000002000000000000BC110000001000000020000000004000001000000002000004000000000000000400000000000000003000000002000071480000030000000000100000100000000010000010000000000000100000000000000000000000102000003C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004C200000480000000000000000000000000000000000000000000000000000002E74657874000000D8030000001000000004000000020000000000000000000000000000200000602E64617461000000CC010000002000000002000000060000000000000000000000000000400000C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005589E581EC0400000090B8000000008945FC8B45080FBE0883F9300F8C330000008B45080FBE0883F9390F8F240000008B45FCB90A0000000FAFC18B4D080FBE1183EA3001D08945FC8B450889C140894508EBBE8B45FCC9C35589E581EC2800000090B8F6FFFFFF50E8020300008945FC8B45FC83F8FF0F850A000000B801000000E933010000E8EC0200008945F88B450C83C0048B0851E863FFFFFF83C404B9E80300000FAFC18945DCE8C80200008B4DF829C881C0F4010000B9E803000031D2F7F150B80020400050E8B002000083C4088D45E050B801000000508D45E4508B45FC50E89E02000083F8000F846C0000008B45E083F8000F86600000008D45E050B801000000508D45E4508B45FC50E87A0200000FB745E483F8010F853C0000008B45E883F8000F84300000000FBE45F28845DB0FBE45DB83F8000F84170000008B450C83C0088B0851B80420400050E82902000083C408E920000000B80A00000050E82E020000E8090200008B4DF829C88B4DDC39C80F822CFFFFFFE8F40100008B4DF829C88B4DDC39C80F82210000008B450C83C00C8B0851B80820400050E8D801000083C408B801000000E905000000B800000000C9C35589E581EC24000000908D45E850E86201000083C404B8000000008945E4B80100000050E8BB01000083C404B80000030050B80000010050E8AF01000083C4088B05702040008B0D742040008B15782040008945E08D45E4508B05C82140005052518B45E050E88901000083C4148B05702040008B0D742040008B15782040008945DC8B02508B01508B45DC8B0050E809FEFFFF83C40C50E85F01000083C404C9C35589E581EC04000000908B05702040008B4D0889088B05742040008B4D0C8908B80000030050B80000010050E81901000083C4088B05702040008B0D742040008B15782040008945FC8B02508B01508B45FC8B0050E8A1FDFFFF83C40CC9C3000000872C24558D6C24045189E981E90010000085012D001000003D001000007DEC29C1850189E089CC8B08FF60048B45ECC3E8F7FFFFFF8B008B00C3E8EDFFFFFF50E8EBFFFFFF50E8B500000083C408C38B65E8E8D9FFFFFF50E8AB000000000000FFFFFFFFFA1240000F134000E99F000000558B6C24088D44240C89450031C089450464A100000000894508B82C13400089450CB82013400089451031C08945148D450864A3000000005DC30000000000FF254C2040000000FF25502040000000FF25642040000000FF25542040000000FF25582040000000FF255C2040000000FF25682040000000FF256C2040000000FF257C2040000000FF25802040000000FF25842040000000FF25882040000000FF258C2040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D2575000A2573000A25730000000000942000000000000000000000DC2000004C200000AC200000000000000000000037210000642000000000000000000000000000000000000000000000E9200000F8200000072100001B2100002F21000000000000422100004B2100005C21000069210000722100007B21000086210000962100009D210000AB210000B321000000000000E9200000F8200000072100001B2100002F21000000000000422100004B2100005C21000069210000722100007B21000086210000962100009D210000AB210000B3210000000000006B65726E656C33322E646C6C00000047657453746448616E646C650000004765745469636B436F756E740000005065656B436F6E736F6C65496E7075744100000052656164436F6E736F6C65496E70757441000000536C656570006D73766372742E646C6C0000007072696E74660000005F5F7365745F6170705F747970650000005F636F6E74726F6C66700000005F5F617267630000005F5F617267760000005F656E7669726F6E0000005F5F6765746D61696E61726773000000657869740000005F5863707446696C7465720000005F657869740000005F6578636570745F68616E646C6572330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000>"%~f0.exe"
  3. certutil -f -decodehex "%~f0.exe" "%~f0.exe" >nul
  4. "%~f0.exe" 6 A B
  5. echo;
  6. del "%~f0.exe"
  7. pause
复制代码
发表于 2026-2-22 20:23:14 | 显示全部楼层
3楼ai答案已经非常全面了,就看会不会用了。参考关键点拨第2条,不打断timeout 6,多次测试,找出diff最小值。小于最小值,则为打断。
发表于 2026-2-23 10:21:17 | 显示全部楼层
  1. @echo off
  2. for /f "delims=" %%t in ('timeout 6') do set "err=%%t"
  3. if "%err:0=%"=="%err%" (echo 按了键)else echo 倒计时完成
  4. pause
复制代码

评分

参与人数 2技术 +2 收起 理由
yyz219 + 1 我的 PE 可以
77七 + 1 感谢分享

查看全部评分

 楼主| 发表于 2026-2-23 11:18:10 | 显示全部楼层
回复 13# cutebe


    不行, 报错:
'delims' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
请按任意键继续. . .
发表于 2026-2-23 13:57:59 | 显示全部楼层
回复 10# 小白龙

以前开工遇生路时要扫描中外老帖做点功课,如今有ai拿来拷问和调教确实省事多了,但仍须下一番 '去伪存真,去粗取精' 的功夫... 是不是这个道理?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:09 , Processed in 0.019509 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表