CD以cmd为单位的卷序列号(VSN)

时间:2018-12-01 07:09:41

标签: batch-file cmd

简而言之,有没有一种方法可以神奇地使用cd后跟卷序列号而不是驱动器号?

通常,当我打开命令提示符并想移入E:之类的驱动器时,我将输入以下命令:

cd /d E:/

我正在编写一个批处理脚本,以将文件复制到闪存驱动器中,但是我没有驱动器号。
相反,我有卷序列号,例如:123456

我通过wmic命令从卷序列号获得驱动器号:

wmic LogicalDisk where VolumeSerialNumber=123456 get Name

输出为:

Name
E:

,反之亦然:

wmic LogicalDisk where Name="E:" get VolumeSerialNumber

,输出为:

VolumeSerialNumber
123456

因此,要么我必须将返回的驱动器号由wmic存储在变量中(在Shell中,我将简单地grep并将其存储,但是我不知道如何在批处理文件中进行存储)并使用该变量移动到该卷,或者我找到一种通过其序列号直接移动到该卷的方法,例如:

cd #123456#

神奇的是它可以驱动E:

我不希望使用wmic,因为它查询卷序列号太慢了,我知道我的闪存驱动器的序列号是静态的,并且不会在系统之间更改。

我希望我能找到一种通过序列号直接移入卷的方法。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

如果您真的知道USB闪存驱动器中的卷序列号(VSN)(因为每次格式化卷都会创建该序列号),那么可以采用以下解决方案:

@echo off

wmic LogicalDisk where VolumeSerialNumber="123456" get Name > VSN.txt
for /f "skip=1 delims=" %%A IN ('type VSN.txt') do @set "vsn=%%A"
set "diskletter=%vsn: =%"
del VSN.txt
cd /d %diskletter%
rem [do whatever you want]

希望这会有所帮助!

答案 1 :(得分:1)

这是一个可能的解决方案。

@Echo Off
For /F "Delims=\" %%A In ('MountVol^|Find ":\"'
) Do Vol %%A 2>Nul|Find "XXXX-XXXX">Nul&&(CD /D %%A&GoTo :Next)
Exit /B

:Next
Echo Your current directory is %CD%
Pause

您显然会用特定的代码替换:Next下的代码,并用区分大小写的序列号替换XXXX-XXXX

[编辑] 如果您要做的只是复制文件,那么即使使用WMIC,也应该能够做到这一点而无需更改目录:

@For /F Skip^=1 %%A In ('"WMIC LogicalDisk Where (VolumeSerialNumber='XXXXXXXX') Get DeviceID 2>Nul"') Do @For %%B In (%%A) Do @Copy "A File.ext" "%%B\"

您显然会将XXXXXXXX更改为序列号(不带连字符),并将"A File.ext"更改为要复制的文件。

也可以使用使用FindMountVolVol的类似方法:

@For /F "Delims=\ " %%A In ('MountVol^|Find ":\"') Do @For /F %%B In ('Vol %%A 2^>Nul^|Find "XXXX-XXXX"') Do @Copy "A File.ext" "%%A\"