Batch file 您能否自动检查批处理中是否有可移动磁盘?

Batch file 您能否自动检查批处理中是否有可移动磁盘?,batch-file,Batch File,我想批量编写一个程序,它可以识别你是否放入了U盘,然后自动复制一个文件夹。复制很容易,但我很难识别U盘 我已经做了这个,但是如果U盘上有另一个字母,字母“E”上有一个硬盘怎么办。此外,它仅每2分钟检查一次。如果程序能够立即识别U盘,那就太好了 我尝试过的代码: @echo off goto search :search IF EXIST E: GOTO E timeout /T 120 /nobreak goto search :F xcopy /s F:\test\*.* C:\Users\s

我想批量编写一个程序,它可以识别你是否放入了U盘,然后自动复制一个文件夹。复制很容易,但我很难识别U盘

我已经做了这个,但是如果U盘上有另一个字母,字母“E”上有一个硬盘怎么办。此外,它仅每2分钟检查一次。如果程序能够立即识别U盘,那就太好了

我尝试过的代码:

@echo off
goto search
:search
IF EXIST E: GOTO E
timeout /T 120 /nobreak
goto search
:F
xcopy /s F:\test\*.* C:\Users\sebas\Desktop\copied\*.*
exit

USB驱动器是可移动磁盘,可按如下方式找到:

Prompt>wmic logicaldisk get DeviceID, Description
Description       DeviceID
Local Fixed Disk  C:
Removable Disk    D:
CD-ROM Disc       E:
Removable Disk    F:

您可以使用以下方法获得可移动磁盘:

wmic logicaldisk get deviceid, description | find "Removable"

使用提供的链接标记,这就是如何将驱动器号存储到文本文件中,然后启动批处理程序

在批处理中包含一些代码,以恢复驱动器号并将其应用于变量:

<StoreDriveLeterFilepath.txt (
Set /p Drive_Letter=
)
修改vbs代码以将驱动器存储到.txt并启动批处理程序。 在指定位置插入批处理的文件路径

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2") 
Set evtDevice = objWMIService.ExecNotificationQuery ("SELECT * FROM Win32_VolumeChangeEvent")

Wscript.Echo "Waiting for events ..."
Do
    Set objReceivedEvent = evtDevice.NextEvent
    'report an event
    Wscript.Echo " Win32_Device Changed event occurred" & VBNewLine
    If objReceivedEvent.EventType = 1 Then 
         Wscript.Echo "Type = Config Changed" 
    ElseIf objReceivedEvent.EventType = 2 Then 
         Wscript.Echo "Type = Device Arrived" 

         Set colItems = objWMIService.ExecQuery("Select * From Win32_Volume")
         For Each objItem in colItems
               If objitem.DriveType = 2 then
                        Wscript.Echo objItem.DriveType & " " & objItem.Name & " " & objItem.driveletter

            Dim objFSO 'File System Object
            Set objFSO = CreateObject("Scripting.FileSystemObject")
            Dim objTS 'Text Stream Object
            Const ForWriting = 2
            Set objTS = objFSO.OpenTextFile("StoreDriveLeterFilepath.txt", ForWriting, True)
            objTS.Write ("objItem.driveletter")
            objTS.Close()
            Set bjFSO = Nothing 'Destroy the object.
            Set objTS = Nothing 'Destroy the object.
            set WshShell=createobject("wscript.shell") 
            WshShell.run "Your Batch Filepath Here.bat", 1, true


               End If
        Next


    ElseIf objReceivedEvent.EventType = 3 Then 
         Wscript.Echo "Type = Device Left" 
    ElseIf objReceivedEvent.EventType = 4 Then 
         Wscript.Echo "Type = Computer Docked" 
    End If
Loop

上面提到的主要问题是它不太正确。并非所有USB存储设备都指定为可移动磁盘,并且所有可移动磁盘都不是USB存储设备。这意味着该代码只适用于被系统读取为可移动磁盘的存储设备。他们不想获得可移动磁盘,他们想获得USB存储设备。并非所有USB存储设备都指定为可移动磁盘,并且所有可移动磁盘都不是USB存储设备。这意味着该代码仅在系统读取为可移动磁盘的逻辑存储设备上工作,并实际检索指定为可移动的所有逻辑设备,而不管它们是否使用通用串行总线。>Marks comment提供了答案。如果您仍然希望使用批处理,那么修改vbs中执行复制操作以运行批处理文件的代码并不需要太多。您还可以创建用于写入的FileSystemObject,并将驱动器值写入文本文件,以便与启动的批一起检索。使用标记方法,您不需要超时或(如果存在)方法。上面修改的解决方案可以在插入新驱动器时自动启动.bat。在批处理中包含一个选项,允许您选择在插入设备时是否继续备份,这可能是值得的。为此,使用Batch/Vbs Hybrid有其优点。您可以在批处理中使用一个菜单来选择备份方式和内容。进一步的测试表明,当事件发生时,将报告每个连接的Usb,而不仅仅是最近连接的Usb。每个都将分别加载到批处理中,最旧的连接到最新的连接。在确认消息框之前,在循环的每次迭代期间重新启动批处理。为此,请在批处理中添加一个菜单选项,以便在加载驱动器号后选择操作,或者进行条件检查,根据检测到的驱动器号自动执行操作。
strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2") 
Set evtDevice = objWMIService.ExecNotificationQuery ("SELECT * FROM Win32_VolumeChangeEvent")

Wscript.Echo "Waiting for events ..."
Do
    Set objReceivedEvent = evtDevice.NextEvent
    'report an event
    Wscript.Echo " Win32_Device Changed event occurred" & VBNewLine
    If objReceivedEvent.EventType = 1 Then 
         Wscript.Echo "Type = Config Changed" 
    ElseIf objReceivedEvent.EventType = 2 Then 
         Wscript.Echo "Type = Device Arrived" 

         Set colItems = objWMIService.ExecQuery("Select * From Win32_Volume")
         For Each objItem in colItems
               If objitem.DriveType = 2 then
                        Wscript.Echo objItem.DriveType & " " & objItem.Name & " " & objItem.driveletter

            Dim objFSO 'File System Object
            Set objFSO = CreateObject("Scripting.FileSystemObject")
            Dim objTS 'Text Stream Object
            Const ForWriting = 2
            Set objTS = objFSO.OpenTextFile("StoreDriveLeterFilepath.txt", ForWriting, True)
            objTS.Write ("objItem.driveletter")
            objTS.Close()
            Set bjFSO = Nothing 'Destroy the object.
            Set objTS = Nothing 'Destroy the object.
            set WshShell=createobject("wscript.shell") 
            WshShell.run "Your Batch Filepath Here.bat", 1, true


               End If
        Next


    ElseIf objReceivedEvent.EventType = 3 Then 
         Wscript.Echo "Type = Device Left" 
    ElseIf objReceivedEvent.EventType = 4 Then 
         Wscript.Echo "Type = Computer Docked" 
    End If
Loop