我可以使用以下wmic
命令找到该驱动器:
wmic logicaldisk where VolumeName='USB-BACKUP' get deviceid |find /v "DeviceID"
它返回Q:
并且效果很好。但是,我也想,同时,将返回的驱动器号设置为环境变量。我查看了如何使用来设置它wmic
,但找不到如何将其组合成单个命令。
这可能超出了这篇文章所需的内容,因为我真正想要的是:一个组合wmic
命令,根据找到的 USB 驱动器设置环境变量。
以下所有方法都是为了使其正常工作而采取的临时措施。我将其发送到文本文件,然后通过以下方式将其读入环境变量:
wmic logicaldisk where VolumeName='USB-BACKUP' get deviceid |find /v "DeviceID" >c:\Util\DrvLtr.txt
set /p DrvLtr=<c:\UTIL\DrvLtr.txt
表面上看,这个方法行得通。但是,生成的文本文件实际上多出了 8 个错误的不可见字符,以及几个额外的 CR/LF。我担心这会在以后引起问题,果然如此。
使用已删除的文本文件,它将执行一个简单的操作dir %DrvLtr%
,并且有效。但是,如果我执行以下操作:
if not (%DrvLtr%)==() echo %DrvLtr%
它显示以下错误:
)==()此时是出乎意料的。
我验证了它是由于文本文件中的垃圾而出错的。如果我通过记事本创建一个文本文件,其中包含一些内容Q:
(当然,还有记事本在保存时添加的必需 CR/LF 对),它就可以正常工作。
不过不要偏离主题。最初的目标依然是:找到 USB 驱动器号并将其放入环境变量中。
你可能会问:“为什么?”这是用于无人值守的备份程序,你不能指望 USB 位于多台机器上的特定驱动器上。
答案1
您不需要"usebackq tokens=2 delims=="
或者`/format:list ^| find /I "DeviceID"
...
for /f %%a in ('wmic logicaldisk where VolumeName^='USB-BACKUP' get deviceid^|find ":"')do set "_DrvLtr=%%a" && call echo\%_DrvLtr%
答案2
用这个:
@echo off
for /f "usebackq tokens=2 delims==" %%a in (`wmic logicaldisk where "VolumeName='USB-BACKUP'" get deviceid /format:list ^| find /I "DeviceID"`) do set "DrvLtr=%%a"
您可以使用/format:list
显示类似DeviceId=Q:
格式并轻松进行解析for /f
。