[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[系统相关] 求助,批处理bat如何实现倒计时及自动化处理?

想解决几个问题:
1,使用mode con cols=80 lines=27,会有大框变成小框的过程,如果我在后面想改变这个底颜色Color F0,从黑框到白框的变化会更明显,这个闪烁如何避免?尽量以bat实现。
2、实现等待5秒自动输入数字1并回车执行。
3、10秒后无输入自动关闭,并且在标题栏有10秒自动退出提醒。尽量以bat实现。
4、限制输入,只能输入指定字符,其它字符会提示错误。
5、实现以上操作不清屏,有输入重新计算时间倒计时退出。



以下是我的主要代码:
  1. @echo off
  2. Title 标题内容
  3. mode con cols=80 lines=27
  4. Color F0
  5. SETLOCAL EnableDelayedExpansion
  6. for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
  7.   set "DEL=%%a"
  8. )
  9. set "PROXY1=0.0.0.0:1082"
  10. set "PROXY2=192.168.1.1:1082"
  11. set "PROXY3=192.168.2.1:7897"
  12. set "PROXY4=192.168.3.1:7897"
  13. set "PROXYb=127.0.0.1:7897"
  14. :exec
  15. echo ==============================================================================
  16. echo.
  17. echo    1.启动A
  18. echo.
  19. echo    2.启动B
  20. echo.
  21. echo    3.启动C
  22. echo.
  23. echo    4.启动D
  24. echo.
  25. echo    0.关闭
  26. echo.
  27. echo    b.本地
  28. echo.
  29. echo    q.退出
  30. echo.
  31. echo ==============================================================================
  32. echo 【帮助】根据需要选择对应数字回车即可。有问题找管理员。
  33. echo.
  34. set /p n=  输入数字编号按回车确认:
  35. echo.
  36. if "%n%"=="" cls&goto :exec
  37. if "%n%"=="0" call :0
  38. if "%n%"=="1" call :1
  39. if "%n%"=="2" call :2
  40. if "%n%"=="3" call :3
  41. if "%n%"=="4" call :4
  42. if "%n%"=="b" call :b
  43. if "%n%"=="B" call :b
  44. if /i "%n%"=="q" exit
  45. if /i "%n%"=="Q" exit
  46. pause
  47. goto :eof
  48. :1
  49. CLS
  50. echo.
  51. call :ColorText 2F "                                                                              "
  52. echo.
  53. call :ColorText 2F "--------------------------------成功启动A---------------------------------"
  54. echo.
  55. call :ColorText 2F "                                                                              "
  56. echo.
  57. echo.
  58. echo.
  59. set "PROXY=%PROXY1%"
  60. reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 1 /f    > NUL 2>&1
  61. reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer /d "%PROXY%" /f    > NUL 2>&1
  62. goto :exec
  63. :2
  64. CLS
  65. echo.
  66. call :ColorText 2F "                                                                              "
  67. echo.
  68. call :ColorText 2F "--------------------------------成功启动B---------------------------------"
  69. echo.
  70. call :ColorText 2F "                                                                              "
  71. echo.
  72. echo.
  73. echo.
  74. set "PROXY=%PROXY2%"
  75. reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 1 /f    > NUL 2>&1
  76. reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer /d "%PROXY%" /f    > NUL 2>&1
  77. goto :exec
  78. :3
  79. CLS
  80. echo.
  81. call :ColorText 2F "                                                                              "
  82. echo.
  83. call :ColorText 2F "--------------------------------成功启动C---------------------------------"
  84. echo.
  85. call :ColorText 2F "                                                                              "
  86. echo.
  87. echo.
  88. echo.
  89. set "PROXY=%PROXY3%"
  90. reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 1 /f    > NUL 2>&1
  91. reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer /d "%PROXY%" /f    > NUL 2>&1
  92. goto :exec
  93. :4
  94. CLS
  95. echo.
  96. call :ColorText 2F "                                                                              "
  97. echo.
  98. call :ColorText 2F "--------------------------------成功启动D---------------------------------"
  99. echo.
  100. call :ColorText 2F "                                                                              "
  101. echo.
  102. echo.
  103. echo.
  104. set "PROXY=%PROXY4%"
  105. reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 1 /f    > NUL 2>&1
  106. reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer /d "%PROXY%" /f    > NUL 2>&1
  107. goto :exec
  108. :b
  109. CLS
  110. echo.
  111. call :ColorText 2F "                                                                              "
  112. echo.
  113. call :ColorText 2F "------------------------------成功切换回本地------------------------------"
  114. echo.
  115. call :ColorText 2F "                                                                              "
  116. echo.
  117. echo.
  118. echo.
  119. set "PROXY=%PROXYb%"
  120. reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 1 /f    > NUL 2>&1
  121. reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer /d "%PROXY%" /f    > NUL 2>&1
  122. goto :exec
  123. :0
  124. CLS
  125. echo.
  126. call :ColorText 4e "                                                                              "
  127. echo.
  128. call :ColorText 4e "---------------------------------已关闭-----------------------------------"
  129. echo.
  130. call :ColorText 4e "                                                                              "
  131. echo.
  132. echo.
  133. echo.
  134. reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 0 /f    > NUL 2>&1
  135. reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer /d "" /f    > NUL 2>&1
  136. goto :exec
  137. goto :eof
  138. :ColorText
  139. echo off
  140. <nul set /p ".=%DEL%" > "%~2"
  141. findstr /v /a:%1 /R "^$" "%~2" nul
  142. del "%~2" > nul 2>&1
  143. goto :eof
复制代码
这是我从网上找到的参考
指定字符的:
  1. @echo off
  2. :zt1
  3. echo.
  4. SET Choice=
  5. echo      #三个选择
  6. for /f "delims=" %%a in ('xcopy /w . . 2^>nul') do if not defined Choice set "Choice=%%a"
  7. echo.
  8. set "Choice=%Choice:~-1%"
  9. IF "%Choice:"=""%" EQU "1" GOTO a
  10. IF "%Choice:"=""%" EQU "2" GOTO b
  11. IF "%Choice:"=""%" EQU "3" GOTO c
  12. echo 输入有误,请重新输入
  13. goto zt1
复制代码
这是在论坛内找到的退出
  1. @echo off
  2. if not "%1"=="" goto %1
  3. del "%temp%\#" 2>nul
  4. start /b %~fs0 :aa
  5. :agn
  6. set/p=按任意键退出...<nul&pause>nul
  7. >"%temp%\#" type nul
  8. exit
  9. :aa
  10. for /l %%a in (10 -1 1) do (
  11.    title 倒计时 %%a 秒后自动退出...
  12.    if exist "%temp%\#" (
  13.       del "%temp%\#"
  14.       exit
  15.    )
  16.    ping -n 2 127.1>nul
  17. )
  18. title 自动退出...
  19. for /f "tokens=2" %%a in ('tasklist /fi "windowtitle eq 自动退出..." /nh') do (
  20.    taskkill /f /pid %%a >nul
  21. )
  22. exit
复制代码

2、3条不是矛盾的吗?
bat小白,请多指教!谢谢!

TOP

bat是同步的,2,3点难搞

TOP

回复 2# 77七


    不矛盾,一个是自动敲键盘1回车,一个是自动关闭批处理界面,难点在于怎么同步进行,做并行任务。

TOP

回复 4# 诗与远方


   假如打开批处理没有任何操作,是怎么进行的?
bat小白,请多指教!谢谢!

TOP

不用set /p
用CHOICE可能比较好搞

TOP

本帖最后由 aloha20200628 于 2024-8-17 15:54 编辑

回复 5# 77七
回复 4# 诗与远方

给一个示例代码说明两个并行进程互相协调...
主批存为 test.bat,次批 _tmp_.bat 须与 test.bat 同目录,两者用一个临时文件 "c:\temp\_tmp_.0" 握手
  1. @echo off &setlocal &del /q "c:\temp\_tmp_.0" 2>nul
  2. start "_tmp_" _tmp_.bat
  3. timeout /t 5 /nobreak>nul
  4. if not exist "c:\temp\_tmp_.0" (
  5. taskkill /f /fi "windowTitle eq _tmp_ - _tmp_.bat">nul 2>nul
  6. goto[end]
  7. )
  8. set/p v=<"c:\temp\_tmp_.0"
  9. echo,%v%
  10. :[end]
  11. endlocal&pause&exit/b
复制代码
附录 _tmp_.bat
  1. @echo off &setlocal
  2. set/p "v=输入: "
  3. set/p="%v%"<nul>"c:\temp\_tmp_.0"
  4. endlocal&exit
复制代码

TOP

回复 5# 77七


    倒计时即是一种方式,到指定时间后自动执行。

TOP

回复 7# aloha20200628


    有些复杂化了,增加了不稳定因素,那可以在一个bat里面,自动在本地生成文件,然后这几个文件按指定顺序在本地分别执行?

TOP

一个bat应该能实现,不一样非要往并行上考虑,没多大关系。
bat小白,请多指教!谢谢!

TOP

本帖最后由 aloha20200628 于 2024-8-17 15:49 编辑


如果不扯那些 powershell/python/... 等第三方外援,仅在批处能力范围内谈两个并行进程的协调,没有 start 发威是很难的...
调用 set/p 等候即时输入就会阻塞当前的批处进程,多长时间输入与否要靠另一个批处进程监控处理,7楼代码为此给一个参考方法〉主批先开启次批进程并监控其时长和结果...
至于次批的生成方案都很简单,是预备还是实时均由楼主自便...

TOP

本帖最后由 77七 于 2024-8-17 16:08 编辑
  1. @echo off
  2. set n=10
  3. :loop
  4. title %n% 秒后退出
  5. echo   1.启动A
  6. echo   2.启动B
  7. rem ...
  8. echo   q.退出
  9. choice /c 12340bqc /t 1 /d c /m 输入数字编号按回车确认:
  10. if errorlevel 8 (
  11. set /a n-=1
  12. if %n% equ 5 (
  13. if not defined k (
  14. echo 执行 1
  15. rem 因为清屏,延时 3秒以表示执行1
  16. timeout 3
  17. )
  18. )
  19. ) else (
  20. rem 仅演示 实际从7开始
  21. if errorlevel 1 (
  22. echo 执行 1
  23. rem 因为清屏,延时 3秒以表示执行1
  24. timeout 3
  25. )
  26. rem 用户操作,重设退出时间
  27. set n=10
  28. set k=1
  29. )
  30. if %n% equ 0 (
  31. exit
  32. )
  33. cls
  34. goto :loop
复制代码
楼主描述的不是很完整,包括用户操作后的退出时间等等...代码中暂时定为操作后10秒
bat小白,请多指教!谢谢!

TOP

本帖最后由 aloha20200628 于 2024-8-17 16:22 编辑

回复 1# 诗与远方

系统命令 choice 提供延时输入等功能,为何楼主采用 set/p 而不首选 choice
choice 参数列表:
   /C    choices       指定要创建的选项列表。默认列表是 "YN"。
   /N                  在提示符中隐藏选项列表。提示前面的消息得到显示,选项依旧处于启用状态。
   /CS                 允许选择分大小写的选项。在默认情况下,这个工具是不分大小写的。
   /T    timeout       做出默认选择之前,暂停的秒数。可接受的值是从 0 到 9999。如果指定了 0,就不会有暂停,默认选项会得到选择。
   /D    choice        在 nnnn 秒之后指定默认选项。字符必须在用 /C 选项指定的一组选择中; 同时,必须用 /T 指定 nnnn。
   /M    text          指定提示之前要显示的消息。如果没有指定,工具只显示提示。

TOP

没注意楼主的第5条,第2点。第1点不清屏,可以参考下 大佬的研究 ANSI的esc转义序列功能强大 ,试试是不是能删除行。另外楼主的文字及背景颜色也可以参考解决。
bat小白,请多指教!谢谢!

TOP

  1. @echo off&&mode con cols=80 lines=27
  2. :init
  3. setlocal DisableDelayedExpansion
  4. set "batchPath=%~0"
  5. for %%k in (%0) do set batchName=%%~nk
  6. set "vbsGetPrivileges=%temp%\MYSQL_INIT_getPriv_%batchName%.vbs"
  7. setlocal EnableDelayedExpansion
  8. :checkPrivileges
  9. NET FILE 1>NUL 2>NUL
  10. if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )
  11. :getPrivileges
  12. if '%1'=='ELEV' (echo ELEV & shift /1 & goto gotPrivileges)
  13. ECHO Set UAC = CreateObject^("Shell.Application"^) > "%vbsGetPrivileges%"
  14. ECHO args = "ELEV " >> "%vbsGetPrivileges%"
  15. ECHO For Each strArg in WScript.Arguments >> "%vbsGetPrivileges%"
  16. ECHO args = args ^& strArg ^& " "  >> "%vbsGetPrivileges%"
  17. ECHO Next >> "%vbsGetPrivileges%"
  18. ECHO UAC.ShellExecute "!batchPath!", args, "", "runas", 1 >> "%vbsGetPrivileges%"
  19. "%SystemRoot%\System32\WScript.exe" "%vbsGetPrivileges%" %*
  20. exit /B
  21. :gotPrivileges
  22. setlocal & pushd .
  23. cd /d %~dp0
  24. if '%1'=='ELEV' (del "%vbsGetPrivileges%" 1>nul 2>nul  &  shift /1)
  25. :input
  26. @echo off&if not "%1"=="" call%*&exit||{zb-2024-06-05}
  27. :begin
  28. call:timeout 10 :tsk1 0 :tsk2
  29. :tsk1
  30. echo\&echo 【默认计划】
  31. goto :Abat
  32. :tsk2
  33. echo\&echo 【自定义计划】
  34. goto :Bbat
  35. :: /*----------------- timeout --------------------
  36. :timeout [num] [:label1] [STR] [:LABEL2]
  37. setlocal&del/a/q %tmp%\' 2>nul||(echo 未知错误!&pause&exit)
  38. start/b/REALTIME %~s0 :timeout_1 %1 %2 %3 %4
  39. :timeout_2
  40. set "v="
  41. set/p v=
  42. if %v%.==%3. title %ComSpec%&cd.>%tmp%\'&endlocal&goto%4
  43. if exist %tmp%\' exit ::没有输入,退出timeout
  44. goto:timeout_2
  45. :timeout_1 [num] [:label1] [STR] [:LABEL2]
  46. for /l %%a in (%1 -1 0)do (
  47.    title 【 倒计时 :%%a  秒内输入"%3"重置网络 】
  48.    if exist %tmp%\' title %ComSpec%&exit
  49.    ping/n 2 127.1 >nul)
  50. title %ComSpec%&cd.>%tmp%\'&goto%2
  51. :: /*------------------ timeout -------------------*/
  52. :Abat
  53. echo.Abat
  54. pause
  55. :Bbat
  56. echo.Bbat
  57. pause
复制代码

TOP

返回列表