如何在Windowspath中使用卷标?

我想使用batch file从可移动驱动器复制文件,而不pipe其获取的驱动器号。

到目前为止,没有去。 似乎没有任何现成的命令或第三方命令行工具可以处理基于标的path。

我尝试了FreeFileSync,但它大批量工作,我需要在这里精确的文件操作。 此外,它不会删除,我需要移动文件从pendrive。

然而,我感兴趣的是发出一个无意义的命令,如…

C:\> cd MYPENDRIVE: 

…在默认的错误信息中产生了相当有趣的一点:

 The filename, directory name, or volume label syntax is incorrect. ^^^^^^^^^^^^^^^^^^^ 

如果这个消息是可信的,那么这意味着在那里放置一个卷标是一些正确的语法。 或者不在?

注意:如果需要的话,我可以写一个小的“getdriveletterforvolume”工具,但我宁愿不要重新发明轮子。 此外,在更长的batch file操作过程中,驱动器可能会被移除并replace为另一个驱动器,此时我需要停止操作,而不能在另一个驱动器上继续使用相同的驱动器号。

注2:使用\\?\ Volume {12345678 …..}是最后的手段,虽然它可以在一定程度上驯服,build立一个基本的batch file,如…

 SET PENDRIVE=\\?\Volume{949a764e-a2f0-11e3-b710-6cf04975450b} SET BACKUPDRIVE=\\?\Volume{e79091c4-5c2a-11e3-86f9-806e6f6e6963} if exist %PENDRIVE% { if exist %BACKUPDRIVE% { move %PENDRIVE%\*.* %BACKUPDRIVE% } } 

…但它很丑,不会让我做任何魔术,就像给两个pendrives同一个标签,让他们的行为相同。 我知道这不是一个普遍的情况,但是,嘿,为什么要限制一个select,哪里可以有一个现成的解决scheme呢?


编辑:进度。 我修改了子程序来返回一个值作为VOLUMEID:

 CALL :GetVolumeID PENDRIVE SET "PENDRIVE=%VOLUMEID%" IF EXIST "%PENDRIVE%\" ECHO PENDRIVE is connected at %PENDRIVE%! GOTO :eof :GetVolumeID FOR /F "skip=1" %%A in ('"wmic volume where label='%~1' get deviceid 2>/null"') do ( SET "VOLUMEID=%%A" GOTO :eof ) GOTO :eof 

…但是现在如果pendrive丢失, wmic返回一些类似于空的值(不是空string;它会失败, if %%A==""检查) – 所以IF EXIST \结果为true。 我如何消除这样的空结果? 我在FOR之前尝试了SET VOLUMEID=$FOO$ ,但是无论如何它都用一个空值来覆盖它。


最后! 这是一个概念的certificate,任何人发现它的用处。

 @ECHO OFF CALL :GetVolumeID BACKUPDRIVE SET "BACKUPDRIVE=%VOLUMEID%" CALL :GetVolumeID PENDRIVE SET "PENDRIVE=%VOLUMEID%" if exist %PENDRIVE%\ ( if exist %BACKUPDRIVE%\ ( echo Emptying the pendrive. move %PENDRIVE%\*.* %BACKUPDRIVE%\pendrive\ ) ) GOTO :eof :GetVolumeID SET VOLUMEID=$$$ FOR /F "tokens=1,* delims==" %%A IN ('"wmic volume where label='%~1' get deviceid /value 2>nul"') DO IF NOT "%%~B"=="" SET "VOLUMEID=%%~B" SET "VOLUMEID=%VOLUMEID:~0,-2%" GOTO :eof 

我添加了$ bogus值来返回以通过EXIST检查。 最后的SET VOLUMEID =%VOLUMEID …行删除后面的反斜杠(出于某种原因,它计为两个字符),以便写成%MYDRIVE%\file*.*path看起来很理智。

这里有一个子程序,它会把你的名字push到驱动器上。它需要一个参数 – 驱动器标签:

 @echo off :pushToLabel label setlocal for /f "skip=1 delims=:" %%A in ('"wmic logicaldisk where VolumeName='%~1' get name"') do ( set "drive=%%A:" goto :break ) :break echo %drive% endlocal && ( pushd %drive% ) 

这是一个概念的最后证明,任何人发现它是有用的。 调用GetVolumeID在“F:”窗体中设置一个DRIVELETTER变量作为返回值。

 @ECHO OFF CALL :GetVolumeID BACKUPDRIVE SET "BACKUPDRIVE=%DRIVELETTER%" CALL :GetVolumeID PENDRIVE SET "PENDRIVE=%DRIVELETTER%" if exist %PENDRIVE%\ ( if exist %BACKUPDRIVE%\ ( echo Emptying the pendrive. move %PENDRIVE%\*.* %BACKUPDRIVE%\pendrive\ ) ) GOTO :eof :GetVolumeID SET DRIVELETTER=$$$ FOR /F "tokens=1,* delims==" %%A IN ('"wmic volume where label='%~1' get deviceid /value 2>nul"') DO IF NOT "%%~B"=="" SET "DRIVELETTER=%%~B" SET "DRIVELETTER=%DRIVELETTER:~0,-2%" GOTO :eof