批处理脚本:查找已挂载设备的驱动器字母

6

我正在尝试编写一个批处理脚本来定位特定的已挂载设备,我的操作系统是Windows 7。

我知道该设备将具有文件夹驱动器:\custom,因此我希望查看所有可能性以找到具有此路径的设备。

这是我目前拥有的内容:

    @echo off
   setLocal Enabledelayedexpansion


for %%d in (c d e f g h i j k l m n o p q r s t u v w x y z) do (
  if exist %%d:\custom (
     ECHO Device Found : %%d
  )
)

然而这并不起作用,它认为每个驱动器字母都存在..因此我会看到每个单独的驱动器字母上显示“找到设备”。为什么会这样?我做错了什么吗?我如何定位根目录上有一个名为“custom”的文件夹的驱动器字母?

谢谢,
Stephanie

6个回答

3

for语句中使用fsutil fsinfo drives而不是静态的驱动器列表。

for /f "tokens=1,*" %%i in ('fsutil fsinfo drives') do (
  :: work with %%j here
)

然而,如果给没有媒体的设备分配驱动器号,它可能仍然会出现错误。无论如何,可以进行如下检查:

if not exist O:\ @echo test

对我来说工作得非常好(有和没有not)。这个驱动器在我的系统上不存在,因此当去掉not时没有输出。


当我运行它时,似乎什么都没有发生。你能告诉我 '/f "toekns=1,*' 是什么意思吗? - Without Me It Just Aweso
@没有我,它只是很棒:/f 与单引号一起使用会执行单引号中的命令并对其进行分词。 "tokens=1,*" 告诉它在变量 %%i(第一个标记)和 %%j(剩余部分)中获取命令的输出。我试过了,它可以工作。在命令行上无法工作,因为有双重 %%(这只是脚本文件内的语法)。删除一个 %,它也应该在命令行上工作。显然,您必须对接收驱动器字母的变量(%%j)进行某些操作,例如将它们传递给您最初执行的任何内容。 - 0xC0000022L

2
在路径末尾添加\
IF EXIST %%d:\custom\ (...)

1
这个有点有效...现在它只会在文件存在的情况下进入if语句,但每次都会弹出错误提示框“驱动器中没有磁盘。请将磁盘插入驱动器\device\harddisk1\dr115”。 - Without Me It Just Aweso
@没有我,它就是很棒的:有趣...显然,这个消息与可移动磁盘驱动器有关。但是当我运行您的示例脚本并进行修改时,在XP中我没有收到任何这样的消息。不知道为什么。 - Andriy M
是啊,我想不出来了。我试着把它寻找的文件路径改成我的C:\users,只是为了看看是否是外部设备的问题,但我得到了同样的错误。我不知道它在抱怨什么。如果我点击“继续”按钮,它就可以正常工作。只是每次运行脚本时都会弹出一个烦人的弹窗。 - Without Me It Just Aweso
@没有我就不完美:你有没有把 a 和/或 b 加入到“驱动器”列表中呢? - Andriy M
不,我没有。我正在努力追踪错误。网上有很多关于它的东西,但没有好的解决方案。 - Without Me It Just Aweso
在win7 x64上无法工作:它显示“找到设备:C:系统找不到指定的设备。” - m1m1k

1

有点复杂,但这是避免Win7阻止错误的唯一解决方案:

for /f "tokens=3" %%d in ('echo LIST Volume ^| DISKPART ^| findstr "Healthy Unusable"') do (
  if exist %%d:\custom echo Device found
)

我发现另一种方法是使用vol命令+检查ERRORLEVEL(如果== 1,则驱动器未挂载):

for /f "tokens=3" %%d in ('echo LIST Volume ^| DISKPART ^| findstr "Healthy Unusable"') do (
   vol %%d:
   if !ERRORLEVEL!==0 if exist %%d:\custom echo Device found
)

注意:在Windows XP上,DISKPART无法识别可移动驱动器...


在Win7 x64上无法运行 - 必须获取用户权限才能运行DISKPART(权限弹出窗口),然后它会在一个不同的窗口中打开。 - m1m1k

0
@ECHO OFF
:CICLO
CLS&ECHO.&ECHO  VER ESTADO UNIDADES CON WMIC
SET "DVF="

FOR /F "tokens=1,*" %%A IN ('wmic logicaldisk get caption^, description ^| FIND ":"') DO (

   VOL %%A >nul 2>&1 && (
      CALL SET "DVF=%%DVF%% %%A"& ECHO   %%A ^| ON.  %%B) || (
      ECHO   %%A ^| OFF. %%B
   )
)   
ECHO  DEVICEFOUND: %DVF%
TIMEOUT /T 5 >NUL
GOTO:CICLO

1
欢迎来到 Stack Overflow!请考虑在您的回答中包含一些信息,而不仅仅是发布代码。我们试图提供的不仅仅是“修复”,而是帮助人们学习。您应该解释原始代码中出了什么问题,您做了什么不同的事情以及为什么您的更改有效。 - Andrew Barber
谢谢Andrew,但我的英语...一无所知。实际上没有什么需要解释的。我们使用“wmic LogicalDisk get caption, description”来提取驱动器(%% A)或驱动器和类型(%% B)。Vol用于推断驱动器是否准备好,并且其输出可以随意修改。'^ | FIND ""循环是为了格式化原因,否则我们会得到回车符或其他东西wmic。但是,使用'^ | findstr / i "X"',其中X是本地磁盘、硬盘或CD-ROM等,可以区分您需要的驱动器类型。该循环仅用于动态演示其操作。: )。问候。 - aNT366 - ALICANTE
你需要把那个解释放在答案里。 - Andrew Barber

-1

试试这个:

if exist %%d:\nul (
   echo Device found %%d
)

我得到了以下输出:“找到设备:C:系统找不到指定的设备。”然后它退出并且不尝试任何其他字母。 - Without Me It Just Aweso
在Win7 x64中出现了相同的错误。 - m1m1k
@m1m1k:在我的 Win7 x64 上,当在原始批处理文件中将“custom”替换为“nul”时,它对我有效。请看这里:http://imgur.com/vvlyXqV。你的代码确切是什么样子?你是如何调用它的? - a_horse_with_no_name

-2

这适用于硬盘和闪存驱动器:

@echo off
for  %%? in (c d e f g h i j k l m n o p q r s t u v w x y z) do (
        dir %%?:\ > nul 2>nul
        if exist %%?:\custom echo Device found(s): %%?:\ 
)

附注:运行WinXP


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接