标题: [系统相关] 求助,批处理bat如何实现倒计时及自动化处理? [打印本页]
作者: 诗与远方 时间: 2024-8-17 11:53 标题: 求助,批处理bat如何实现倒计时及自动化处理?
想解决几个问题:
1,使用mode con cols=80 lines=27,会有大框变成小框的过程,如果我在后面想改变这个底颜色Color F0,从黑框到白框的变化会更明显,这个闪烁如何避免?尽量以bat实现。
2、实现等待5秒自动输入数字1并回车执行。
3、10秒后无输入自动关闭,并且在标题栏有10秒自动退出提醒。尽量以bat实现。
4、限制输入,只能输入指定字符,其它字符会提示错误。
5、实现以上操作不清屏,有输入重新计算时间倒计时退出。
以下是我的主要代码:复制代码
这是我从网上找到的参考
指定字符的:- @echo off
- :zt1
- echo.
- SET Choice=
- echo #三个选择
- for /f "delims=" %%a in ('xcopy /w . . 2^>nul') do if not defined Choice set "Choice=%%a"
- echo.
- set "Choice=%Choice:~-1%"
- IF "%Choice:"=""%" EQU "1" GOTO a
- IF "%Choice:"=""%" EQU "2" GOTO b
- IF "%Choice:"=""%" EQU "3" GOTO c
- echo 输入有误,请重新输入
- goto zt1
复制代码
这是在论坛内找到的退出- @echo off
- if not "%1"=="" goto %1
- del "%temp%\#" 2>nul
- start /b %~fs0 :aa
- :agn
- set/p=按任意键退出...<nul&pause>nul
- >"%temp%\#" type nul
- exit
- :aa
- for /l %%a in (10 -1 1) do (
- title 倒计时 %%a 秒后自动退出...
- if exist "%temp%\#" (
- del "%temp%\#"
- exit
- )
- ping -n 2 127.1>nul
- )
- title 自动退出...
- for /f "tokens=2" %%a in ('tasklist /fi "windowtitle eq 自动退出..." /nh') do (
- taskkill /f /pid %%a >nul
- )
- exit
复制代码
作者: 77七 时间: 2024-8-17 12:30
2、3条不是矛盾的吗?
作者: Five66 时间: 2024-8-17 14:18
bat是同步的,2,3点难搞
作者: 诗与远方 时间: 2024-8-17 14:21
回复 2# 77七
不矛盾,一个是自动敲键盘1回车,一个是自动关闭批处理界面,难点在于怎么同步进行,做并行任务。
作者: 77七 时间: 2024-8-17 14:37
回复 4# 诗与远方
假如打开批处理没有任何操作,是怎么进行的?
作者: Five66 时间: 2024-8-17 14:45
不用set /p
用CHOICE可能比较好搞
作者: aloha20200628 时间: 2024-8-17 14:48
本帖最后由 aloha20200628 于 2024-8-17 15:54 编辑
回复 5# 77七
回复 4# 诗与远方
给一个示例代码说明两个并行进程互相协调...
主批存为 test.bat,次批 _tmp_.bat 须与 test.bat 同目录,两者用一个临时文件 "c:\temp\_tmp_.0" 握手- @echo off &setlocal &del /q "c:\temp\_tmp_.0" 2>nul
- start "_tmp_" _tmp_.bat
- timeout /t 5 /nobreak>nul
- if not exist "c:\temp\_tmp_.0" (
- taskkill /f /fi "windowTitle eq _tmp_ - _tmp_.bat">nul 2>nul
- goto[end]
- )
- set/p v=<"c:\temp\_tmp_.0"
- echo,%v%
- :[end]
- endlocal&pause&exit/b
复制代码
附录 _tmp_.bat- @echo off &setlocal
- set/p "v=输入: "
- set/p="%v%"<nul>"c:\temp\_tmp_.0"
- endlocal&exit
复制代码
作者: 诗与远方 时间: 2024-8-17 14:51
回复 5# 77七
倒计时即是一种方式,到指定时间后自动执行。
作者: 诗与远方 时间: 2024-8-17 14:53
回复 7# aloha20200628
有些复杂化了,增加了不稳定因素,那可以在一个bat里面,自动在本地生成文件,然后这几个文件按指定顺序在本地分别执行?
作者: 77七 时间: 2024-8-17 15:34
一个bat应该能实现,不一样非要往并行上考虑,没多大关系。
作者: aloha20200628 时间: 2024-8-17 15:46
本帖最后由 aloha20200628 于 2024-8-17 15:49 编辑
如果不扯那些 powershell/python/... 等第三方外援,仅在批处能力范围内谈两个并行进程的协调,没有 start 发威是很难的...
调用 set/p 等候即时输入就会阻塞当前的批处进程,多长时间输入与否要靠另一个批处进程监控处理,7楼代码为此给一个参考方法〉主批先开启次批进程并监控其时长和结果...
至于次批的生成方案都很简单,是预备还是实时均由楼主自便...
作者: 77七 时间: 2024-8-17 15:57
本帖最后由 77七 于 2024-8-17 16:08 编辑
- @echo off
- set n=10
- :loop
- title %n% 秒后退出
- echo 1.启动A
- echo 2.启动B
- rem ...
- echo q.退出
- choice /c 12340bqc /t 1 /d c /m 输入数字编号按回车确认:
- if errorlevel 8 (
- set /a n-=1
- if %n% equ 5 (
- if not defined k (
- echo 执行 1
- rem 因为清屏,延时 3秒以表示执行1
- timeout 3
- )
- )
- ) else (
- rem 仅演示 实际从7开始
- if errorlevel 1 (
- echo 执行 1
- rem 因为清屏,延时 3秒以表示执行1
- timeout 3
- )
- rem 用户操作,重设退出时间
- set n=10
- set k=1
-
- )
- if %n% equ 0 (
- exit
- )
- cls
- goto :loop
复制代码
楼主描述的不是很完整,包括用户操作后的退出时间等等...代码中暂时定为操作后10秒
作者: aloha20200628 时间: 2024-8-17 16:20
本帖最后由 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 指定提示之前要显示的消息。如果没有指定,工具只显示提示。
作者: 77七 时间: 2024-8-17 16:20
没注意楼主的第5条,第2点。第1点不清屏,可以参考下 大佬的研究 ANSI的esc转义序列功能强大 ,试试是不是能删除行。另外楼主的文字及背景颜色也可以参考解决。
作者: mnokoko 时间: 2024-8-18 00:55
- @echo off&&mode con cols=80 lines=27
- :init
- setlocal DisableDelayedExpansion
- set "batchPath=%~0"
- for %%k in (%0) do set batchName=%%~nk
- set "vbsGetPrivileges=%temp%\MYSQL_INIT_getPriv_%batchName%.vbs"
- setlocal EnableDelayedExpansion
- :checkPrivileges
- NET FILE 1>NUL 2>NUL
- if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )
- :getPrivileges
- if '%1'=='ELEV' (echo ELEV & shift /1 & goto gotPrivileges)
- ECHO Set UAC = CreateObject^("Shell.Application"^) > "%vbsGetPrivileges%"
- ECHO args = "ELEV " >> "%vbsGetPrivileges%"
- ECHO For Each strArg in WScript.Arguments >> "%vbsGetPrivileges%"
- ECHO args = args ^& strArg ^& " " >> "%vbsGetPrivileges%"
- ECHO Next >> "%vbsGetPrivileges%"
- ECHO UAC.ShellExecute "!batchPath!", args, "", "runas", 1 >> "%vbsGetPrivileges%"
- "%SystemRoot%\System32\WScript.exe" "%vbsGetPrivileges%" %*
- exit /B
- :gotPrivileges
- setlocal & pushd .
- cd /d %~dp0
- if '%1'=='ELEV' (del "%vbsGetPrivileges%" 1>nul 2>nul & shift /1)
-
- :input
- @echo off&if not "%1"=="" call%*&exit||{zb-2024-06-05}
- :begin
- call:timeout 10 :tsk1 0 :tsk2
- :tsk1
- echo\&echo 【默认计划】
- goto :Abat
- :tsk2
- echo\&echo 【自定义计划】
- goto :Bbat
-
-
- :: /*----------------- timeout --------------------
- :timeout [num] [:label1] [STR] [:LABEL2]
- setlocal&del/a/q %tmp%\' 2>nul||(echo 未知错误!&pause&exit)
- start/b/REALTIME %~s0 :timeout_1 %1 %2 %3 %4
- :timeout_2
- set "v="
- set/p v=
- if %v%.==%3. title %ComSpec%&cd.>%tmp%\'&endlocal&goto%4
- if exist %tmp%\' exit ::没有输入,退出timeout
- goto:timeout_2
- :timeout_1 [num] [:label1] [STR] [:LABEL2]
- for /l %%a in (%1 -1 0)do (
- title 【 倒计时 :%%a 秒内输入"%3"重置网络 】
- if exist %tmp%\' title %ComSpec%&exit
- ping/n 2 127.1 >nul)
- title %ComSpec%&cd.>%tmp%\'&goto%2
- :: /*------------------ timeout -------------------*/
-
- :Abat
- echo.Abat
- pause
-
- :Bbat
- echo.Bbat
- pause
复制代码
作者: mnokoko 时间: 2024-8-18 00:58
回复 15# mnokoko批处理同步处理,这个问题我遇到过,10s内无操作执行a命令,按”0“执行b命令,希望能有所帮助
作者: 77七 时间: 2024-8-18 20:06
参考14楼中帖子链接- @echo off
- for /f "delims=#" %%i in ('prompt #$E#^&echo on^&for %%a in ^(1^) do rem') do set EscK=%%i
- echo 11
- :loop
- choice /c 12340bqi /t 1 /d I /N /m 输入数字编号按回车确认:
- echo %EscK%[2A
- echo %EscK%[2K
- echo %EscK%[2A
- goto :loop
复制代码
作者: aloha20200628 时间: 2024-8-18 21:10
本帖最后由 aloha20200628 于 2024-8-18 21:15 编辑
CHOICE 命令内置防错输入功能,即拒绝所有非选项输入,但其延时输入须先设置默认输入选项,因此,仅用 choice 可以实现一楼的第 2,4 需求,但不能实现第 3 需求,更不能同时满足第 2,3 需求...
作者: 诗与远方 时间: 2024-8-19 08:12
回复 15# mnokoko
这个有点儿意思了,但是从大框变mode con cols=80 lines=27的时候还是会闪烁一下,有什么办法去掉这个闪烁嘛?
我尝试过很多纯单一bat方式都不行。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |