Как динамически изменить букву диска в сценарии .bat

В настоящее время я работаю со старым сценарием для процесса, который существовал до того, как я взглянул на него, предпосылкой является автоматическое создание папки и копирование содержимого флэш-накопителя на диск C:. Ниже приведена часть скрипта, которая меня интересует:

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

Это сценарий, который у меня есть сейчас, в настоящее время мне нужно менять первую запись в каталоге почти каждый раз, когда я подключаюсь к новому устройству, поскольку буква диска, отображаемая в сценарии, иногда отличается от того, что находится на локальном устройстве. Например, диск UBS будет D: на ноутбуке, но E: на большинстве настольных компьютеров или какой-либо другой буквой в случае устройства с несколькими периферийными устройствами.

Раньше скрипт выглядел примерно так:

xcopy "...\каталог" "c:\каталог" /s /y

Это не работает, так как файл .bat вернется с невозможностью найти указанный каталог на диске UBS. Когда я вручную меняю файл .bat на жесткую установку буквы USB-накопителя, все работает нормально, все каталоги копируются, и последующие сценарии выполняются нормально.

Мой вопрос, какие-либо идеи о том, как настроить сценарий xcopy для распознавания буквы динамического USB-накопителя и разрешить копирование без изменения сценария на каждом устройстве?

Спасибо!


person Steve R    schedule 16.08.2016    source источник
comment
Подождите минутку! Где хранится пакетный файл? Он хранится на USB-накопителе и выполняется оттуда двойным щелчком или хранится на локальном жестком диске? Если пакетный файл хранится на USB-накопителе и выполняется оттуда двойным щелчком, используйте xcopy "\directory" "c:\directory" /s /y, поскольку путь, начинающийся с обратной косой черты, относится к корню текущего диска, или используйте xcopy "%~d0\directory" "c:\directory" /s /y, поскольку %~d0 ссылается диск (буква плюс двоеточие) первого аргумента - пакетный файл. Или используйте %~dp0 - диск и путь к пакетному файлу, заканчивающийся на \.   -  person Mofi    schedule 16.08.2016


Ответы (3)


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-накопители.

person Noodles    schedule 16.08.2016

несмотря на предыдущий ответ от лапши

@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...
)
person elzooilogico    schedule 16.08.2016

Почему бы не изменить пакетный файл, чтобы он запрашивал букву диска перед началом копирования?

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