Board logo

标题: [原创]抽奖————————模拟线程 [打印本页]

作者: s11ss     时间: 2008-4-28 13:33    标题: [原创]抽奖————————模拟线程

操作注册表好像比产生临时文件更麻烦。
另外,对于此bat,由于临时文件的“生存时间”很短,因此在Windows Shell下,你看不到它的产生与消失。


::抽奖        {s11ss@www.cn-dos.net/forum 2008-4-28}
@echo off
if exist t del t
:m
if "%1" equ "-t" goto t
start /b %~s0 -t
echo 请按任意键停止. . .&pause>nul
cd.>t
start /b del t^&exit
echo 请按任意键开始. . .&pause>nul
goto m
:t
if exist t exit
title 获奖观众的号码是:%random%
goto t


[ Last edited by s11ss on 2008-4-28 at 04:59 PM ]
作者: zhitingkey     时间: 2008-4-28 13:52
不错哦,能不能说说原理啊`详细解释一下你这个代码!好么`
作者: s11ss     时间: 2008-4-28 14:11


  Quote:
Originally posted by zhitingkey at 2008-4-28 01:52 PM:
不错哦,能不能说说原理啊`详细解释一下你这个代码!好么`

if "%1" equ "-t" goto t
::-t是启动“线程”的参数

start /b %~s0 -t
::再打开一个cmd.exe来启动不断变换标题的“线程”;但这个新开的cmd.exe还是使用当前cmd窗口,而不是再打开一个cmd窗口——由参数/b控制

echo 请按任意键停止. . .&pause>nul
cd.>t

start /b del t^&exit
::再打开一个cmd.exe来删除t并退出新的cmd.exe。在t的“生存期间”,“线程”检测到t而退出(“线程”退出)。

echo 请按任意键开始. . .&pause>nul
作者: plp626     时间: 2008-4-28 14:25
你这次怎么有说start/b 启动的是线程了,”多了个cmd.exe----是进程“

兄能否发个多进程的专帖大家一起讨论----进程之间的通信,多进程还是很具有潜力,像这个帖子,和那个等待输入的帖子,cmd的单进程是无法实现。
作者: s11ss     时间: 2008-4-28 14:30


  Quote:
Originally posted by plp626 at 2008-4-28 02:25 PM:
你这次怎么有说start/b 启动的是线程了,”多了个cmd.exe----是进程“

兄能否发个多进程的专帖大家一起讨论----进程之间的通信,多进程还是很具有潜 ...

我加了引号啊~~~~~

讨论???你不是发帖讨论过了么?结果也有了啊:
注册表、临时文件和start /b
没有其他的方法了吧?
作者: plp626     时间: 2008-4-28 14:38
我不敢说没有,
一个修改系统环境变量date,另一个再改回来,只是这个方法要改系统日期,怕有点危险。
echo 2008-04-29 星期二|date

echo 2008-04-28 星期一|date
有没有其他的不是很重要的系统环境变量供修改?我没找到...

这多进程貌视还可以轻松实现密码不回显呢,真的有必要发个帖子讨论

[ Last edited by plp626 on 2008-4-28 at 02:42 PM ]
作者: s11ss     时间: 2008-4-28 14:42
系统环境变量修改后不会立马生效,要重启后才会生效
作者: plp626     时间: 2008-4-28 14:53

@echo off
::如果你的系统日期现在不是2008-04-29 星期二
echo 修改前:%date%
echo 2008-04-29 星期二|date >nul
echo 修改后:%date%
pause
你也可以再打开一个cmd
echo %date%
试试看有没变化
作者: zh159     时间: 2008-4-28 15:16
系统日期属于比较特别的环境变量,它是根据系统的实际日期实时变化的

BUG:有时候会提示“找不到 ...文件”也就是批处理本身

[ Last edited by zh159 on 2008-4-28 at 03:20 PM ]
作者: plp626     时间: 2008-4-28 15:17
我把你的代码稍改下,用该date的方法,不生成临时文件。
你的系统日期现在若是:2008-04-28 星期一,会感觉不到日期被修改:
@echo off
if "%date:~-1%"==二 echo 2008-04-28 星期一|date >nul
:m
if "%1" equ "-t" goto t
start /b %~s0 -t
echo 请按任意键停止. . .&pause>nul
echo 2008-04-29 星期二|date >nul
start /b echo 2008-04-28 星期一^|date ^>nul^&exit
echo 请按任意键开始. . .&pause>nul
goto m

:t
if "%date:~-1%"=="二" exit
title 获奖观众的号码是:%random%
goto t
----------------------------------------
楼下:
echo %date%后面没星期几试试这个代码
@echo off
if "%date:~0,1%"=="3" echo 2008-04-28|date>nul
:m
if "%1" equ "-t" goto t
start/b %~s0 -t
echo 请按任意键停止. . .&pause>nul
echo 3008-04-28|date>nul
start/b echo 2008-04-28^|date^>nul^&exit
echo 请按任意键开始. . .&pause>nul
goto m

:t
if "%date:~0,1%"=="3" exit
title 获奖观众的号码是:%random%
goto t
[ Last edited by plp626 on 2008-4-28 at 03:38 PM ]
作者: s11ss     时间: 2008-4-28 15:20
我说的那种系统环境变量,是静态的吧?就是set列出来的。
我说的生效,是说彻底改变这个变量,而不仅仅是在当前cmd窗口下有效。

如date、time是动态环境变量,可以随时改变并生效吧?不过random却又是个例外~~~~~~~~~~~

这些动态环境变量的应用貌似还得讨论下。

另外我这边echo %date%的结果是2008-04-28。(没有星期几)
作者: s11ss     时间: 2008-4-28 15:39
如此反复修改日期,实在不是上策
作者: plp626     时间: 2008-4-28 15:41
是呀,哪赶快发帖讨论吧
-------------------------
你不发我发,高人多着呢,我就不信没人响应。。。

[ Last edited by plp626 on 2008-4-28 at 04:02 PM ]
作者: zh159     时间: 2008-4-28 17:37
看看是否可以利用%ERRORLEVEL%
作者: s11ss     时间: 2008-4-28 17:43


  Quote:
Originally posted by zh159 at 2008-4-28 05:37 PM:
看看是否可以利用%ERRORLEVEL%

试过了,貌似不行。
作者: wxcute     时间: 2008-4-28 21:26


  Quote:
Originally posted by s11ss at 2008-4-28 14:11:

start /b del t^&exit
::再打开一个cmd.exe来删除t并退出新的cmd.exe。在t的“生存期间”,“线程”检测到t而退出(“线程”退出)。

这里的"exit"退出的到底是哪个Cmd.exe,第一个、第二个、还是第三个?
不是很明白。
作者: s11ss     时间: 2008-4-28 22:28
这里的"exit"退出的是专门用来删除临时文件t的cmd.exe,即第三个。
作者: PPdos     时间: 2008-4-29 07:23


  Quote:
Originally posted by zh159 at 2008-4-28 05:37 PM:
看看是否可以利用%ERRORLEVEL%

建议高手 不要生成临时文件试试
作者: wxcute     时间: 2008-4-29 19:05
还有个问题,(我很菜,不要怪我罗嗦)加转意字符(^)与不加区别很大,为什么?
为什么加了^后exit关闭的是新开的cmd.exe进程?
作者: mkd     时间: 2008-4-30 01:57

@echo off
:m
if "%1" equ "-t" goto t
subst z: "%cd%"
start /b %~s0 -t
echo 请按任意键停止. . .&pause>nul
subst /d z:
echo 请按任意键开始. . .&pause>nul
goto m
:t
if not exist z:\ exit
title 获奖观众的号码是:%random%
goto t
[ Last edited by mkd on 2008-4-30 at 02:41 AM ]
作者: plp626     时间: 2008-4-30 07:21
虚拟盘,我没想到,不知速度如何?能有什么好的方法继续想。。。

现在还没有可靠的系统环境变量的方法。。。
作者: 26933062     时间: 2008-4-30 13:10
有点无赖,不要砸我哦。。。。
但是可以不用临时文件。
:
@echo off&color 1f
:m
if "%1"=="t" goto t
start /b %~s0 t %p%
for /f "skip=2 tokens=2" %%a in ('Tasklist /FI "IMAGENAME eq cmd.exe"') do (
   call set p1=%%p2%%
   set p2=%%a
)
echo 请按任意键停止. . .&pause>nul
taskkill  /f /pid %p1% >nul
echo 请按任意键开始. . .&pause>nul
goto m
:t
title 获奖观众的号码是:%random%
goto t

作者: plp626     时间: 2008-4-30 13:34
这不算”无赖“,正常思维,谁给咱来个颠覆性思维的??
作者: scarecrow0929     时间: 2008-5-12 00:23
请问:
start /b %~s0 -t
-t 是用来干什么的?

cd.>t 这一句是不是把当前目录写到临时文件t?

谢谢解答!