由guid定位的批量复制文件夹


1

在批处理文件中,我可以复制位于\?\ Volume {GUID}之类的常量路径的文件夹吗?

将目录及其内容从本地可移动驱动器(例如usb外部驱动器)复制(复制,xcopy或robocopy)到同一驱动器上的另一个位置时,我想使用独特且常量的绝对路径,如\?\卷{GUID}以避免使用可能随时间变化的驱动器号。要操作副本,批处理文件应放在可移动设备上,但如果文件被移动或放在其他地方,我宁愿确定它在好的驱动器上运行。

到目前为止,我已经尝试过:

  • COPY可以处理\?\ Volume {GUID}路径来复制文件但无法复制文件夹
  • XCOPY返回“无效驱动器”错误
  • ROBOCOPY给出了“找不到网络路径,等待30秒......”
  • 对于上面的每个命令:语法变体与\?\ UNC \ Volume {guid} 和尾随的“\”

我做错了什么或者这不是这样做的方法吗?

还有另一种使用不变位置的方法吗?

理想情况下,它应该涉及尽可能少的调整。通过调整我的意思是:标记驱动器或给它一个固定的字母等。

Answers:


1

命名卷 不同于 命名文件,路径和命名空间

下一个脚本显示了如何获取驱动器号的可能方法 目前已分配 一卷。用途 Win32_Volume类

Win32_Volume class表示硬盘上的存储区域。   该类返回格式化,未格式化的本地卷,   已安装或离线。使用文件系统格式化卷,   如 FAT 要么 NTFS,可能会分配一个驱动器号。   一个硬盘可以有多个卷,卷可以跨多个卷   物理磁盘。该 Win32_Volume class不支持磁盘驱动器   管理。

@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:

我看到你花时间回复,但我个人无法将其连接到复制过程
fkk

@fkk我不知道什么不清楚。对于特定的USB驱动器, call :getDriveLetter "\\?\Volume{5c729d19-70f7-11e5-830d-ac220b50824f}\" 应始终返回变量中当前分配的驱动器号 %_DriveLetter% 喜欢 F: 在上面的例子中。其他时间返回 G: (如果 F: 字母可以被另一个USB驱动器占用);其他时间返回 H: (如果 F:G: 字母可能被其他USB驱动器占用)等。
JosefZ

实际上只是说复制功能都不能与unc路径一起工作会更清楚。因此,唯一的方法是通过wmic检索驱动器号的解决方法将完成答案。这是简化的代码: for /F "usebackq tokens=1,2 delims==" %%G in (`wmic volume where "DeviceID='%_volID:\=\\%'" get DriveLetter /value`) do set _%%G=%%H 。 _volID是包含相关卷的unc路径的变量。
fkk

@fkk如果这个答案有帮助,请考虑将其标记为已接受。 看到这个页面 解释为什么这很重要。
JosefZ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.