【问题标题】:How to change a drive letter dynamically on a .bat script如何在 .bat 脚本上动态更改驱动器号
【发布时间】:2016-08-16 13:37:45
【问题描述】:

我目前正在使用一个旧脚本,该脚本在我查看它之前就已经存在,前提是自动创建一个文件夹并将闪存驱动器的内容复制到 C: 驱动器中。以下是我关心的脚本部分:

xcopy "E:\directory" "c:\directory" /s /y

这是我现在拥有的脚本,目前我几乎每次插入新设备时都需要更改第一个目录条目,因为脚本中出现的驱动器号有时与本地的不同设备。例如,UBS 驱动器在笔记本电脑上是 D:,但在大多数台式机上是 E:,或者在具有多个外围设备的设备上是其他字母。

以前的脚本看起来像这样:

xcopy "...\directory" "c:\directory" /s /y

这不起作用,因为 .bat 文件将无法在 UBS 驱动器上找到所述目录。当我手动将 .bat 文件更改为硬设置 USB 驱动器号时,一切正常,所有目录复制,后续脚本运行正常。

我的问题,关于如何设置 xcopy 脚本以识别动态 USB 驱动器号并允许复制而无需更改每个设备上的脚本的任何想法?

谢谢!

【问题讨论】:

  • 等一下!批处理文件存储在哪里?它是存储在 USB 驱动器上并通过双击从那里执行,还是存储在本地硬盘驱动器上?如果批处理文件存储在 USB 驱动器上并通过双击从那里执行,请使用 xcopy "\directory" "c:\directory" /s /y,因为以反斜杠开头的路径相对于 当前驱动器的根目录 或使用 @987654322 @ 因为%~d0 引用了第一个参数的驱动器(字母加冒号) - 批处理文件。或者使用%~dp0 - 以\结尾的批处理文件的驱动器和路径。

标签: batch-file xcopy usb-drive


【解决方案1】:
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

                        Set objShell = CreateObject("Shell.Application")
                        Set Ag=Wscript.Arguments
                        set WshShell = WScript.CreateObject("WScript.Shell")

                        Set SrcFldr=objShell.NameSpace(objitem.driveletter)
                        Set DestFldr=objShell.NameSpace("c:\test\")
                        Set FldrItems=SrcFldr.Items
                        DestFldr.CopyHere FldrItems, &H214
                        Wscript.Echo "Finished Copying"
                        Wscript.sleep 2000

               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

此 vbs 脚本等待插入 USB,然后将其复制到文件夹。

删除所有调试wscript.echo 行。更改目标文件夹。

它会复制所有连接的 USB 驱动器。

【讨论】:

    【解决方案2】:

    尽管之前来自 Noodles 的回答

    @echo off
    
    set "destDrive="
    for /F "usebackq tokens=1,2 delims==" %i in (`"wmic logicaldisk get caption, drivetype"`) do (
      if %%j EQU 2 set "destDrive=%%i"
    )
    
    if "%destDrive%" EQU "" (
      echo No pendrive found
    ) else (
      echo copying
      xcopy "%destDrive%\directory\*.*" "c:\directory\*.*" /s /y
      echo done...
    )
    

    【讨论】:

      【解决方案3】:

      为什么不修改批处理文件以在复制开始之前询问驱动器号?

      SET /P USB=Enter USB Drive Letter (C:, D:, E: etc):  
      XCOPY "%USB%\directory" "C:\directory" /s /y
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-22
        相关资源
        最近更新 更多