简而言之,有没有一种方法可以神奇地使用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
,因为它查询卷序列号太慢了,我知道我的闪存驱动器的序列号是静态的,并且不会在系统之间更改。
我希望我能找到一种通过序列号直接移入卷的方法。
任何帮助将不胜感激。
答案 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"
更改为要复制的文件。
也可以使用使用Find
,MountVol
和Vol
的类似方法:
@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\"