在批处理文件中,我可以复制位于常量路径(如 \?\Volume{GUID})的文件夹吗?
当将目录及其内容从本地可移动驱动器(例如 USB 外部驱动器)复制(copy、xcopy 或 robocopy)到同一驱动器上的另一个位置时,我希望使用唯一且恒定的绝对路径(如 \?\Volume{GUID})以避免使用随时间变化的驱动器号。要操作副本,批处理文件应放置在可移动设备上,但如果文件被移动或放置在其他地方,我宁愿确保它在好的驱动器上运行。
到目前为止我已经尝试过:
- COPY 可以处理 \?\Volume{GUID} 路径来复制文件,但不能复制文件夹
- XCOPY 返回“无效驱动器”错误
- ROBOCOPY 给出“未找到网络路径,等待 30 秒...”
- 对于上面的每个命令:语法变化为 \?\UNC\Volume{guid} 和尾随的“\”
是我做错了什么还是这不是应该做的方式?
还有其他方法可以使用不变位置吗?
理想情况下,它应该涉及尽可能少的调整。我所说的调整是指:给驱动器贴标签或给它一个固定的字母等。
答案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: