标题: [系统相关] 批处理如何实现当USB接口有设备接入时就开始? [打印本页]
作者: xuexiaosa 时间: 2008-6-16 13:22 标题: 批处理如何实现当USB接口有设备接入时就开始?
请高手们不吝赐教!
如何实现当USB接口有设备接入时就开始运行P的代码
作者: batman 时间: 2008-6-16 13:36
这个用批处理来做不是很合适,会占去大量的内存,建议楼主另想其它的方法如计划任务。
判断usb设备是否接入的代码如下(必须先具备计算机管理员权限):- @echo off
- for /f "delims=驱动器:\A " %%i in ('fsutil fsinfo drives^|more') do fsutil fsinfo drivetype %%i:|findstr "移动">nul&&set flag=%%i
- if defined flag (
- echo usb设备已就续,所在盘符为%flag%:
- ) else (
- echo 未发现usb设备,或设备未就续。
- )
- pause>nul
复制代码
ps:论坛处理长句子还真的是有问题啊
[ 本帖最后由 zw19750516 于 2008-6-16 13:45 编辑 ]
作者: xuexiaosa 时间: 2008-6-16 13:56
非常感谢!!!
作者: xuexiaosa 时间: 2008-6-16 14:00
for /f "delims=驱动器:\A " %%i in ('fsutil fsinfo drives^|more') do fsutil fsinfo drivetype %%i:|findstr "移动">nul&&set flag=%%i
请问这个FOR语句具体解释一下行吗?
作者: batman 时间: 2008-6-16 16:40
原帖由 xuexiaosa 于 2008-6-16 14:00 发表
for /f "delims=驱动器:\A " %%i in ('fsutil fsinfo drives^|more') do fsutil fsinfo drivetype %%i:|findstr "移动">nul&&set flag=%%i
请问这个FOR语句具体解释一下行吗?
&&这是一句批处理长句式,对新手来说确实比较难以弄懂,下面我就分段来说明下:
"for /f "delims=驱动器:\A " %%i in ('fsutil fsinfo drives^|more') do"这是使用for循环句式对主机所有的盘符(不包括软盘A盘)进行探测找出当前主机有多少个盘(含移动盘),同时盘符分别为什么,在括号里面的fsutil fsinfo drives|more为检测盘符命令,它将依次列出当前主机所有的盘符;
而紧接着的"fsutil fsinfo drivetype %%i:|findstr "移动">nul&&set flag=%%i"则是依次检测当前主机所有盘符的类型,并查找含有"移动"(实际上是移动磁盘)字样的输出信息,如找到(实际上就是找到了usb盘符)就将%%i赋值给变量flag。
作者: youxi01 时间: 2008-6-16 19:27
呵呵,楼上代码似乎并不能满足楼主要求
该代码只能检测移动设备是否准备好
却不能实时检测设备准备好
实现方案有二:
1、在U盘修改autorun.inf相关内容
2、利用vbs定时检测(bat定时检测太耗资源,当然也可以尝试sleep...)
作者: batman 时间: 2008-6-16 20:35
我给出的并不是即时监控代码,如真要通过纯批处理实现即时监控就会占用大量内存,是不可取的,可采用个变通的方法开启计划任务来实现,具体如下:
一、将以下代码保存为d:\control.bat- @echo off
- for /f "delims=驱动器:\A " %%i in ('fsutil fsinfo drives^|more') do fsutil fsinfo drivetype %%i:|findstr "移动">nul&&set flag=%%i
- if defined flag start "" "在这里填上楼主要运行的程序的完整路径和程序名"
复制代码
二、通过以下代码建立计划任务(每五分钟运行一次):- @echo off
- schtasks /create /ru system /tn control /tr d:\control.bat /sc minute /mo 5
复制代码
三、删除此计划任务- @echo off
- schtasks /delete /f /tn control
复制代码
[ 本帖最后由 zw19750516 于 2008-6-16 20:39 编辑 ]
作者: xuexiaosa 时间: 2008-6-16 20:37
老鸟们都出来帮我小虾解决一下这个问题吧!!谢谢了
作者: fastslz 时间: 2008-6-16 21:35
方法1 VBS+Wmi- set objShell = CreateObject ("Wscript.Shell")
- Set oLocator = CreateObject ("WbemScripting.SWbemLocator")
- Set oSink = WScript.CreateObject ("WbemScripting.SWbemSink","Event_")
- Set oWMISvc = oLocator.ConnectServer
- oWMISvc.ExecNotificationQueryAsync oSink, "Select * From __InstanceCreationEvent WITHIN 5 " & _
- "Where TargetInstance ISA 'Win32_LogicalDisk'"
- Do
- WScript.Sleep 2000
- Loop
-
- Sub Event_OnObjectReady(oEventSource,oContext)
- WScript.Echo "USB 设备已插入,盘符为 "&oEventSource.TargetInstance.Name
- End Sub
复制代码
方法2 VBS+FileSystemObject-
- Set Fso = CreateObject("Scripting.FileSystemObject")
- Set DC = Fso.Drives
- Do
- For Each D in DC
- aDisk=""
- If D.DriveType = 1 Then
- aDisk = aDisk & D.DriveLetter & ": "
- End If
- Next
- aDisk = Replace(aDisk, "A: ","")
- If aDisk = "" Then
- Wscript.sleep 8000
- Else
- WScript.Echo "USB 设备已插入,盘符为 "&aDisk
- End If
- Wscript.sleep 20000
- Loop
复制代码
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |