папка пакетного копирования, расположенная по guid

658
fkk

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

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

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

  • COPY может обрабатывать пути \? \ Volume для копирования файла, но не может копировать папки
  • XCOPY возвращает ошибку «неверный диск»
  • ROBOCOPY дает "сетевой путь не найден, подождите 30 секунд ..."
  • для каждой команды выше: варианты синтаксиса с \? \ UNC \ Volume и с завершающим "\"

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

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

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

1

1 ответ на вопрос

1
JosefZ

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

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

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

@ECHO OFF SETLOCAL EnableExtensions DisableDelayedExpansion call :getDriveLetter "\\?\Volume\" call :getDriveLetter "\\?\Volume\" call :getDriveLetter "\\?\Volume\" :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\ DriveLetter F: \\?\Volume\ DriveLetter unknown \\?\Volume\ DriveLetter E: 
я вижу, вы нашли время, чтобы ответить, но лично я не могу связать это с процессом копирования fkk 7 лет назад 0
@fkk Я не знаю, что неясно. Для конкретного USB-накопителя `call: getDriveLetter" \\? \ Volume \ "` всегда должен возвращать назначенную в настоящий момент букву диска в переменной `% _DriveLetter%`, как `F:` in приведенный выше пример. В других случаях возвращает `G:` (если буква `F:` может быть занята другим USB-накопителем); в другое время возвращает `H:` (если буквы `F:` и `G:` могут быть заняты другими USB-накопителями) и т. д. и т. д. JosefZ 7 лет назад 0
на самом деле просто сказать, что ни одна из функций копирования не может работать с unc path, было бы яснее. Таким образом, единственный способ - это обходной путь, заключающийся в получении буквы диска через wmic, позволил бы получить полный ответ. Вот упрощенный код: `for / F" usebackq tokens = 1,2 delims == "%% G in (\` wmic volume, где "DeviceID = '% _ volID: \ = \\%'" get DriveLetter / value \ ` ) установите _ %% G = %% H`. с _volID является переменной, содержащей unc-путь рассматриваемого тома. fkk 7 лет назад 0
@fkk Если этот ответ был полезен, пометьте его как принятый. [См. Эту страницу] (http://meta.stackexchange.com/questions/5234/) для объяснения того, почему это важно. JosefZ 7 лет назад 0