1

Могу ли я скопировать в пакетный файл папку с постоянным путем, например \?\Volume {GUID}?

При копировании (копирование, xcopy или robocopy) каталога и его содержимого с локального съемного диска (например, внешнего USB-диска) в другое место на том же диске, я хотел бы использовать уникальные и постоянные абсолютные пути, например \?\Volume {GUID}, чтобы избежать использования букв дисков, которые могут меняться со временем. Для работы с копией командный файл предназначен для размещения на съемном устройстве, но в случае, если файл перемещен или помещен куда-то еще, я бы предпочел быть уверенным, что он работает на хорошем диске.

Пока что я пробовал:

  • КОПИЯ может справиться \?\Volume {GUID} пути для копирования файла, но не могут копировать папки
  • XCOPY возвращает ошибку "неверный диск"
  • ROBOCOPY дает "сетевой путь не найден, подождите 30 секунд ..."
  • для каждой команды выше: варианты синтаксиса с \?\UNC \Volume {guid} и с последующим "\"

Я делаю что-то не так или это просто не способ сделать это?

Есть ли другой способ использовать инвариантные местоположения?

В идеале это должно включать как можно меньше настроек. Под настройкой я подразумеваю: маркировать диск или давать ему фиксированную букву и т.д.

1 ответ1

1

Наименование тома отличается от именования файлов, путей и пространств имен.

Следующий скрипт показывает возможный подход к получению буквы диска, назначенной в данный момент тому. Использует класс Win32_Volume:

Класс Win32_Volume представляет область хранения на жестком диске. Класс возвращает локальные тома, которые отформатированы, не отформатированы, смонтированы или отключены. Том форматируется с использованием файловой системы, такой как FAT или NTFS , и ему может быть назначена буква диска. Один жесткий диск может иметь несколько томов, а тома могут занимать несколько физических дисков. Класс Win32_Volume не поддерживает управление дисками.

@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion
call :getDriveLetter "\\?\Volume{5c729d19-70f7-11e5-830d-ac220b50824f}\"
call :getDriveLetter "\\?\Volume{090c044f-7ccc-11e4-824e-806e6f6e6963}\"
call :getDriveLetter "\\?\Volume{de60a588-fbe5-11e4-826f-806e6f6e6963}\"
:endlocal
ENDLOCAL
goto :eof

:getDriveLetter
set "_volumeID=%~1"
set "_DriveLetter="
for /F "tokens=1,* delims==" %%G in ('
  wmic volume where "DeviceID='%_volumeID:\=\\%'" get DriveLetter /value
  ') do for /F %%g in ("%%~H") do set "_%%~G=%%~g"
call :doSomething
goto :eof

:doSomething
rem only output for debugging 
if defined _DriveLetter (
    echo %_volumeID% DriveLetter %_DriveLetter% 
) else (
    echo %_volumeID% DriveLetter unknown
)
goto :eof

Выход:

d:\temp> D:\bat\SU\1163592.bat
\\?\Volume{5c729d19-70f7-11e5-830d-ac220b50824f}\ DriveLetter F:
\\?\Volume{090c044f-7ccc-11e4-824e-806e6f6e6963}\ DriveLetter unknown
\\?\Volume{de60a588-fbe5-11e4-826f-806e6f6e6963}\ DriveLetter E:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .