[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[系统相关] 批处理如何实现当USB接口有设备接入时就开始?

请高手们不吝赐教!
如何实现当USB接口有设备接入时就开始运行P的代码
1

评分人数

    • lengyff: 可以制作U盘忘拔提醒技术 + 1

这个用批处理来做不是很合适,会占去大量的内存,建议楼主另想其它的方法如计划任务。
判断usb设备是否接入的代码如下(必须先具备计算机管理员权限):
  1. @echo off
  2. for /f "delims=驱动器:\A " %%i in ('fsutil fsinfo drives^|more') do fsutil fsinfo drivetype %%i:|findstr "移动">nul&&set flag=%%i
  3. if defined flag (
  4.    echo usb设备已就续,所在盘符为%flag%:
  5.    ) else (
  6.    echo 未发现usb设备,或设备未就续。
  7. )
  8. pause>nul
复制代码
ps:论坛处理长句子还真的是有问题啊

[ 本帖最后由 zw19750516 于 2008-6-16 13:45 编辑 ]
***共同提高***

TOP

非常感谢!!!

TOP

for /f "delims=驱动器:\A " %%i in ('fsutil fsinfo drives^|more') do fsutil fsinfo drivetype %%i:|findstr "移动">nul&&set flag=%%i
 请问这个FOR语句具体解释一下行吗?

TOP

原帖由 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。
***共同提高***

TOP

呵呵,楼上代码似乎并不能满足楼主要求
该代码只能检测移动设备是否准备好
却不能实时检测设备准备好

实现方案有二:
1、在U盘修改autorun.inf相关内容
2、利用vbs定时检测(bat定时检测太耗资源,当然也可以尝试sleep...)

TOP

我给出的并不是即时监控代码,如真要通过纯批处理实现即时监控就会占用大量内存,是不可取的,可采用个变通的方法开启计划任务来实现,具体如下:
一、将以下代码保存为d:\control.bat
  1. @echo off
  2. for /f "delims=驱动器:\A " %%i in ('fsutil fsinfo drives^|more') do fsutil fsinfo drivetype %%i:|findstr "移动">nul&&set flag=%%i
  3. if defined flag start "" "在这里填上楼主要运行的程序的完整路径和程序名"
复制代码
二、通过以下代码建立计划任务(每五分钟运行一次):
  1. @echo off
  2. schtasks /create /ru system /tn control /tr d:\control.bat /sc minute /mo 5
复制代码
三、删除此计划任务
  1. @echo off
  2. schtasks /delete /f /tn control
复制代码

[ 本帖最后由 zw19750516 于 2008-6-16 20:39 编辑 ]
***共同提高***

TOP

老鸟们都出来帮我小虾解决一下这个问题吧!!谢谢了

TOP

方法1 VBS+Wmi
  1. set objShell = CreateObject ("Wscript.Shell")
  2. Set oLocator = CreateObject ("WbemScripting.SWbemLocator")
  3. Set oSink = WScript.CreateObject ("WbemScripting.SWbemSink","Event_")
  4. Set oWMISvc = oLocator.ConnectServer
  5.     oWMISvc.ExecNotificationQueryAsync oSink, "Select * From __InstanceCreationEvent WITHIN 5 " & _
  6.             "Where TargetInstance ISA 'Win32_LogicalDisk'"
  7. Do
  8.     WScript.Sleep 2000
  9. Loop
  10. Sub Event_OnObjectReady(oEventSource,oContext)
  11.     WScript.Echo "USB 设备已插入,盘符为 "&oEventSource.TargetInstance.Name
  12. End Sub
复制代码
方法2 VBS+FileSystemObject
  1. Set Fso = CreateObject("Scripting.FileSystemObject")
  2. Set DC = Fso.Drives
  3. Do
  4. For Each D in DC
  5.     aDisk=""
  6.     If D.DriveType = 1 Then
  7.        aDisk = aDisk & D.DriveLetter & ": "
  8.     End If
  9. Next
  10. aDisk = Replace(aDisk, "A: ","")
  11. If aDisk = "" Then
  12.    Wscript.sleep 8000
  13.    Else
  14.    WScript.Echo "USB 设备已插入,盘符为 "&aDisk
  15. End If
  16. Wscript.sleep 20000
  17. Loop
复制代码

TOP

返回列表