中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 【原创】timeout函数 纯批实现等待按键响应|指定输入
作者:
标题: 【原创】timeout函数 纯批实现等待按键响应|指定输入 上一主题 | 下一主题
jvive
初级用户

替身



积分 122
发帖 17
注册 2008-3-27
状态 离线
『楼 主』:  【原创】timeout函数 纯批实现等待按键响应|指定输入

等待按键响应:
@echo off&if not "%1"=="" call%*&exit||{Jvive@cn-dos.net|08-4-26}
::纯批实现等待按键响应
:begin
call:timeout 8 :tsk1
:tsk1
echo msgbox "默认计划2">%tmp%\'.vbs
start %tmp%\'.vbs
echo 按回车键退出
exit
:: /*---------------timeout----------------------
:timeout [num] [:label]
del/a/q %tmp%\' 2>nul||(echo 未知错误!&pause&exit)
start/b/REALTIME %~s0 :timeout_1 %1 %2
pause>nul
if exist %tmp%\' exit ::没有按键,退出timeout
title %ComSpec%&cd.>%tmp%\'&goto%2
:timeout_1 [num] [:label]
for /l %%a in (%1 -1 0)do (
   title 倒计时:%%a  /任意键跳过.../
   if exist %tmp%\' title %ComSpec%&exit
   ping/n 2 127.1 >nul)
title %ComSpec%&cd.>%tmp%\'&goto%2
:: /*--------------- timeout ---------------------*/
等待指定输入:
@echo off&if not "%1"=="" call%*&exit||{Jvive@cn-dos.net|08-4-26}
::纯批实现等待指定输入
:begin
call:timeout 5 :tsk1 626 :tsk2
:tsk1
echo msgbox "默认计划">%tmp%\'.vbs
start %tmp%\'.vbs
echo\&echo 按回车键退出
exit

:tsk2
echo msgbox "自定义计划">%tmp%\'.vbs
start %tmp%\'.vbs
exit

:: /*----------------- 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 跳过默认计划 %2/
   if exist %tmp%\' title %ComSpec%&exit
   ping/n 2 127.1 >nul)
title %ComSpec%&cd.>%tmp%\'&goto%2
:: /*------------------ timeout -------------------*/
思路:

  Quote:
一个进程"pause"(实际上它还是处于执行态只是执行pause命令暂停罢了),另一个进程处于执行状态,若当这个进程变为也pause时,那么,不管这个进程的优先级有多高,按键输入只会响应第一个执行pause的进程,

[ Last edited by jvive on 2008-4-30 at 09:05 AM ]



进入网盘(各种工具)
2008-4-26 18:52
查看资料  发短消息 网志  OICQ (275928264)  编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 2 楼』:  

看到……'.vbs

对楼主的标题实在……

2008-4-26 19:02
查看资料  发短消息 网志   编辑帖子  回复  引用回复
jvive
初级用户

替身



积分 122
发帖 17
注册 2008-3-27
状态 离线
『第 3 楼』:  



  Quote:
Originally posted by slore at 2008-4-26 07:02 PM:
看到……'.vbs

对楼主的标题实在……

那个'vbs只是为了弹出对话框醒目罢了,你可能对这个timeout子过程有所不知
现在换成echo 直接显示也可以啊,下面的代码没有任何有关vbs的东西:

等待按键响应
@echo off&if not "%1"=="" call%*&exit||{jvive@cn-dos.net|08-4-26}
::纯批实现等待按键响应
:begin
call:timeout 3 :tsk1
:tsk1
echo\&echo "默认计划"
if defined + (echo\&echo 按回车键退出) else pause
exit

:: /*---------------timeout----------------------
:timeout [num] [:label]
del/a/q %tmp%\' 2>nul||(echo 未知错误!&pause&exit)
start/b/REALTIME %~s0 :timeout_1 %1 %2
pause>nul
if exist %tmp%\' exit ::没有按键,退出timeout
title %ComSpec%&cd.>%tmp%\'&goto%2
:timeout_1 [num] [:label]
for /l %%a in (%1 -1 0)do (
   title 倒计时:%%a  /任意键跳过.../
   if exist %tmp%\' title %ComSpec%&exit
   ping/n 2 127.1 >nul)
title %ComSpec%&cd.>%tmp%\'&set +=0&goto%2
:: /*--------------- timeout ---------------------*/
等待指定输入
@echo off&if not "%1"=="" call%*&exit||{jvive@cn-dos.net|08-4-26}
::纯批实现等待指定输入
:begin
call:timeout 5 :tsk1 626 :tsk2
:tsk1
echo\&echo "默认计划"
echo\&echo 按回车键退出
exit

:tsk2
echo "自定义计划"
pause
exit

:: /*----------------- 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 跳过默认计划 %2/
   if exist %tmp%\' title %ComSpec%&exit
   ping/n 2 127.1 >nul)
title %ComSpec%&cd.>%tmp%\'&goto%2
:: /*------------------ timeout -------------------*/
[ Last edited by jvive on 2008-4-26 at 07:44 PM ]



进入网盘(各种工具)
2008-4-26 19:31
查看资料  发短消息 网志  OICQ (275928264)  编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 4 楼』:  

call%*
这个干嘛用的?

2008-4-26 19:55
查看资料  发短消息 网志   编辑帖子  回复  引用回复
jvive
初级用户

替身



积分 122
发帖 17
注册 2008-3-27
状态 离线
『第 5 楼』:  



  Quote:
Originally posted by s11ss at 2008-4-26 07:55 PM:
call%*
这个干嘛用的?

你看这个代码就理解了:

隐藏"调用":
@echo off&if not %1.==. call%*&exit
::原帖请搜索借尸还魂
pause
goto:hid

:code
set set1=ping -n 2 127.1 1^>nul 2^>nul
for /l %%i in (1 1 5) do md test-%%i&%set1%
for /l %%i in (5 -1 1) do rd test-%%i&%set1%
msg %username% /v /w "~~~~~测试完毕,点确定退出cmd~~~~"
exit

:: /*-------- hideme ----------
:hid
if not %1.==. (goto:code) else mshta vbscript:createobject("wscript.shell").run("%~s0 :hid 0",0)(window.close)&exit
:: -------- hideme ----------*/




进入网盘(各种工具)
2008-4-26 20:00
查看资料  发短消息 网志  OICQ (275928264)  编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 6 楼』:  

@echo off&if not %1.==. call%*&exit
这样不行么:
@echo off&if not %1.==. exit

2008-4-26 20:08
查看资料  发短消息 网志   编辑帖子  回复  引用回复
jvive
初级用户

替身



积分 122
发帖 17
注册 2008-3-27
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by s11ss at 2008-4-26 08:08 PM:
@echo off&if not %1.==. call%*&exit
这样不行么:
@echo off&if not %1.==. exit

不可以。
这个%*,包含了%1,....若干个参数,

上面的代码%1都表示标签,程序会跳动到标签处执行相应的代码,

所以call%*万万不可以省略,根据情况exit 却可以省去。

-------------- 已更正。

[ Last edited by jvive on 2008-4-26 at 08:28 PM ]



进入网盘(各种工具)
2008-4-26 20:16
查看资料  发短消息 网志  OICQ (275928264)  编辑帖子  回复  引用回复
abcd
银牌会员





积分 1436
发帖 739
注册 2007-10-11
状态 离线
『第 8 楼』:  

%*不包括%0
%*代表参数

%0不是参数

2008-4-26 20:19
查看资料  发短消息 网志  OICQ (470237592)  编辑帖子  回复  引用回复
jvive
初级用户

替身



积分 122
发帖 17
注册 2008-3-27
状态 离线
『第 9 楼』:  

s11ss兄,
我的疏忽,%*的确不包含%0,
-------------------
abcd兄,
但我们可以把%0当作参数使用,
@echo off
call:abcd j v i v e
exit
:abcd
echo %0 %1 %2 %3 %4 %5
pause
goto:eof




进入网盘(各种工具)
2008-4-26 20:27
查看资料  发短消息 网志  OICQ (275928264)  编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 10 楼』:  



  Quote:
Originally posted by plp626 at 2008-4-26 08:40 PM:
到现在我还不是很肯定start/b启动的叫线程还是叫进程。

进程——多了一个cmd.exe。

2008-4-26 20:44
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 11 楼』:  



  Quote:
Originally posted by plp626 at 2008-4-26 20:40:
我就晕了,这个帖子主要是想与大家讨论多进程,怎么就没有感觉哪,让人有点失望啊,

我发过一个多进程的求助帖子,就是两个cmd 直接进行“对 ...

要对话需要消息……而BAT的话,是不能……

我用的是注册表嗬,不是直观的临时文件吧。
反正。。。呵呵,纯P就不要想了……

2008-4-26 21:01
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 12 楼』:  

不好意思,没有仔细看……因为对这种效果还不知道有啥具体合适的应用嗬,还是喜欢……谁方便好用谁用的原则嗬。

2008-4-26 21:16
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 13 楼』:  

timeout不就是个进程了。。。

如果纯P可以貌似那个就没有人写拉。我也没有用过。。。
我还没有发觉自己要用那个功能。。。

2008-4-26 21:31
查看资料  发短消息 网志   编辑帖子  回复  引用回复
xxymg
新手上路





积分 18
发帖 8
注册 2008-5-4
状态 离线
『第 14 楼』:  

呵呵  学习   高兴哦

2008-5-10 12:48
查看资料  发送邮件  发短消息 网志  OICQ (348987662)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: