【问题标题】:batch script to find drive letter of a mounted device查找已安装设备的驱动器号的批处理脚本
【发布时间】:2011-04-18 21:33:43
【问题描述】:

我正在尝试编写一个批处理脚本来定位特定的已安装设备。我在 Windows 7 中。

我知道该设备将具有文件夹 drive:\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
  )
)

但这不起作用,它认为每个驱动器号都存在它。所以我看到每个驱动器号都“找到设备”。这是为什么?我要解决这个问题了吗?如何找到根目录上包含“自定义”文件夹的驱动器号?

谢谢,
斯蒂芬妮

【问题讨论】:

    标签: windows batch-file


    【解决方案1】:

    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) 的变量做一些事情,例如将它们传递给您最初所做的任何事情。
    【解决方案2】:

    在路径末尾添加\

    IF EXIST %%d:\custom\ (...)
    

    【讨论】:

    • 这行得通.. 有点.. 现在它只在文件存在时才属于 if 状态,但每次出现时我都会收到弹出错误“驱动器中没有磁盘。请将磁盘插入驱动器 \device\harddisk1\dr115'
    • @Without Me It Just Aweso:有趣...显然,该消息与可移动磁盘驱动器有关。但是,当我在修改后运行您的示例脚本时,在 XP 中没有收到任何此类消息。不知道为什么。
    • 是的..我想不通。我尝试将它寻找的文件路径更改为我的 C:\users 只是为了查看它是否是我的外部设备的问题,但我得到了同样的错误。我不知道它在抱怨什么。如果我点击“继续”出现错误,它工作正常.. 烦人的是每次我运行脚本时都会弹出一个窗口
    • @Without Me It Just Aweso:您是否已将a 和/或b 包含在“驱动器”列表中?
    • 不,我没有。我很难追踪错误。网上有很多关于它的东西,但没有好的解决方案..
    【解决方案3】:

    有点复杂,但这是避免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
    )
    

    注意:在 WinXP DISKPART 上不会看到可移动驱动器...

    【讨论】:

    • 在 win7 x64 上不起作用 - 它必须获得用户权限才能运行 DISKPART(权限弹出窗口),然后它在另一个窗口中。
    【解决方案4】:
    @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
    

    【讨论】:

    • 欢迎来到 Stack Overflow!请考虑包含有关您的答案的一些信息,而不是简单地发布代码。我们试图提供的不仅仅是“修复”,而是帮助人们学习。您应该解释原始代码中的问题、您所做的不同之处以及您的更改为何有效。
    • 谢谢安德鲁,但我的英语……什么都没有。真的没什么好解释的。我们使用“wmic LogicalDisk get caption, description”来提取驱动程序(%% A)或驱动程序和类型(%% B)。 Vol 用于推断驱动程序是否准备好,其输出是否被随意修改。 '^ |出于格式化原因查找“”循环是因为否则我们会得到回车或wmic之类的东西。但是使用 '^ | findstr /i "X"',其中X是本地磁盘、硬盘或CD-ROM等,可以区分你需要的驱动类型。该循环仅用于动态演示其操作。 :)。问候。
    • 您需要将该解释放在答案中
    【解决方案5】:

    试试这个:

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

    【讨论】:

    • 我得到以下输出“找到设备:C:系统找不到指定的设备。”然后它存在并且不尝试任何其他字母
    • win7 x64 中出现同样的错误
    • @m1m1k:当在原始批处理文件中将custom 替换为nul 时,它适用于我在Win7 x64 上。请参见此处:imgur.com/vvlyXqV 您的代码到底是什么样的?你怎么称呼它?
    【解决方案6】:

    这适用于硬盘和随身碟:

    @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): %%?:\ 
    )
    

    P.S.:运行 WinXP

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多