中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已解决]检测U盘(重复运行)
作者:
标题: [已解决]检测U盘(重复运行) 上一主题 | 下一主题
Wingl83
初级用户





积分 109
发帖 65
注册 2008-7-28
状态 离线
『楼 主』:  [已解决]检测U盘(重复运行)

借鉴以前的帖子:
for /f "skip=1" %%a in ('wmic logicaldisk where "drivetype='2'" get DeviceID 2^>nul') do   set p=%%a
if "%p%"=="" echo.&echo             未找到可移动磁盘 &goto :down&goto :eof
at /delete /yes
:wait
for /f "skip=1" %%a in ('wmic logicaldisk where "drivetype='2'" get DeviceID 2^>nul') do   set p=%%a
if "%p%"=="" echo.&echo             未找到可移动磁盘 &goto :down&goto :eof
echo.还在复制呢!!&ping /n 5 127.1>nul&goto wait&goto :eof

:down
::shutdown.exe -r -f -t 0
echo.关机了!!&pause&goto :eof
说明:
查找是否存在U盘,若不存在,则直接重启;若存在,则删除所有的任务,等待U盘弹出后再重启。(每5秒检测一次)

测试时出现了问题:
我是在插入U盘的状态下运行的,可以正常运行,但是我拔出U盘后,它还是显示“还在复制呢!!”这样的信息,并不能重启,我想知道就上面的代码,我犯了什么错误?

[ Last edited by Wingl83 on 2009-10-4 at 19:37 ]

2009-10-2 16:42
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
mountvol
初级用户





积分 186
发帖 117
注册 2006-8-14
状态 离线
『第 2 楼』:  

:wait
set "p="

其他的没看,就看到了这明显的一处。

2009-10-4 00:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Wingl83
初级用户





积分 109
发帖 65
注册 2008-7-28
状态 离线
『第 3 楼』:  

没有错啦,我在Wait前做了延时,所以不用手动操作。

2009-10-4 09:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wxcute
中级用户





积分 458
发帖 211
注册 2006-7-26
状态 离线
『第 4 楼』:  

2 楼的意思是要清空变量。



┌───────┐
├→学习→实践→┤
└───────┘
2009-10-4 10:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Wingl83
初级用户





积分 109
发帖 65
注册 2008-7-28
状态 离线
『第 5 楼』:  

可以了,谢谢。

请问为什么一定要清空呢?都是检测出U盘的盘符啊?!

2009-10-4 10:36
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 6 楼』:  

当没有移动磁盘时,set p=%%a不会被运行,这时p的值为上次所赋值。
所以,当移动磁盘被拔出时,p依然是有移动磁盘时的值,并因为goto而一直保持下去。这样,if "%p%"=="" 就一直不被执行。

给你举个简单的例子:
@echo off
set a=1
echo hanyeguxing>test.txt
for /f %%i in (test.txt) do set a=2
echo %a%
pause
显示2。
但如果把echo hanyeguxing>test.txt改成echo. >test.txt,因为test.txt为空,所以for /f %%i in (test.txt) do 无法获取解析结果,即set a=2不被执行,这个时候a因为set a=1而保持1这个值。
for /f "skip=1" %%a in ('wmic logicaldisk where "drivetype='2'" get DeviceID 2^>nul') do   set p=%%a
if "%p%"=="" echo.&echo             未找到可移动磁盘 &goto :down&goto :eof
at /delete /yes
:wait
for /f "skip=1" %%a in ('wmic logicaldisk where "drivetype='2'" get DeviceID 2^>nul') do   set p=%%a
if "%p%"=="" echo.&echo             未找到可移动磁盘 &goto :down&goto :eof
echo.还在复制呢!!&ping /n 5 127.1>nul&goto wait&goto :eof

:down
shutdown.exe -r -f -t 0
echo.关机了!!&pause&goto :eof
回头看你写的批处理:
假如没有移动磁盘,第一个for解析但不赋值,所以p没有值,即为空,在if处跳转。
假如有移动磁盘,第一个for解析并赋值,if 因p不为空而不执行,第2个for执行时,此时无论有无移动硬盘,p都有值,if无法执行goto跳转。

还有一个问题,这个批处理中,没有必要使用&goto :eof。
另外一个问题,因为echo.还在复制呢!!在标签内部,所以将可能被循环,出于美观,最好只输出一次。
最后一个问题,for使用了2次,多余,可以把at /delete /yes加到wait标签里或外。如果不想要输出结果,可以屏蔽输出。
at /delete /yes
:wait
set "p="
for /f "skip=1" %%a in ('wmic logicaldisk where "drivetype='2'" get DeviceID 2^>nul') do set p=%%a
if "%p%"=="" echo.&echo             未找到可移动磁盘 &goto :down
echo.还在复制呢!!&ping /n 5 127.1>nul
cls
goto wait
:down
shutdown.exe -r -f -t 0
echo.关机了!!&pause
如果因为某些原因,at命令需要在标签内部,且要求只执行一次,可以这样写:
:wait
set /a n+=1&set "p="
for /f "skip=1" %%a in ('wmic logicaldisk where "drivetype='2'" get DeviceID 2^>nul') do set p=%%a
if "%p%"=="" echo.&echo             未找到可移动磁盘&echo.要关机了!!&pause&shutdown.exe -r -f -t 0
if %n% == 1 echo.还在复制呢!!&at /delete /yes
ping /n 5 127.1>nul&goto wait
[ Last edited by Hanyeguxing on 2009-10-4 at 13:00 ]

   此帖被 +2 点积分    点击查看详情   
评分人:【 Wingl83 分数: +2  时间:2009-10-4 19:37




批处理之家 http://bbs.bathome.net/forum-5-1.html
2009-10-4 11:57
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: