【问题标题】:Use drive letters on batch files在批处理文件上使用驱动器号
【发布时间】:2016-03-04 13:23:30
【问题描述】:

我使用脚本扫描整个用户的驱动器 C 以查找特定文件,然后将结果记录在网络上的 txt 中。它就像一个魅力。

这是脚本:

@echo off

pushd C:\
dir /s /a-d "setup.txt" /s "setup2.txt" >nul && (goto printresult) || (goto notfound)

:printresult
dir /s /a-d setup.txt /s setup2.txt >>"\\servidor\pastadelogs\FOUND_%computername%.txt
popd
exit

:notfound
echo "Este PC não possui os arquivos" >>"\\servidor\pastadelogs\NOTFOUND_%computername%.txt
popd
exit

现在我需要对其进行改进,使其也能在 USB 驱动器内进行扫描。我已经有一个可以给我 USB 字母的代码:

  @echo off
for /F "usebackq tokens=1,2,3,4 " %%i in (`wmic logicaldisk get caption^,description^,drivetype 2^>NUL`) do (

    if %%l equ 2 (
    echo %%i is a drive letter

        )
        )

我的两个问题是:

  • 可以一起使用吗?
  • 如果插入了多个 USB 怎么办?它将如何运作?我可以为每个驱动器号结果设置 1 个变量吗?

最好的问候

【问题讨论】:

    标签: batch-file


    【解决方案1】:

    因为任务也在扫描慢速 USB 介质,所以明智的做法是在第一次通过时创建一个带有结果的文件,如果有结果,只需 type 将数据写入目标文件,而不是再次进行扫描.

    这是未经测试的,将检查可移动和本地磁盘:(不包括 A: 和 B:)

    已编辑

    这使用了一种选择不包括哪些驱动器等的方法(在 findstr 命令中):例如驱动器号和驱动器类型号,ID 删除了标题。

    @echo off
    set "file=%temp%\drivescan.tmp"
    for /f "tokens=1,2" %%a in ('wmic logicaldisk get deviceid^,drivetype^|findstr /i /v "a: b: 0 1 4 5 6 ID"') do (
        echo Processing drive %%a
        (dir /b /s /a-d "%%a\setup.txt" "%%a\setup2.txt")>"%file%" 2>nul
        for %%d in ("%file%") do if %%~zd NEQ 0 (
          type "%file%" >> "\\servidor\pastadelogs\FOUND_%computername%.txt"
            ) else (
          echo "[%%a] Este PC não possui os arquivos">>"\\servidor\pastadelogs\NOTFOUND_%computername%.txt"
        )
        del "%file%" 2>nul
    )
    

    这是我在 Google 上搜索的驱动器类型列表:

    wmic logicaldisk where drivetype=2 get deviceid, volumename, description
    
    Types
    
    0 => Unknown
    1 => No Root Directory
    2 => Removable Disk
    3 => Local Disk
    4 => Network Drive
    5 => Compact Disc
    6 => RAM Disk
    

    【讨论】:

    • 这比我的好很多,你是对的,它比扫描设备两次要好得多。当驱动器 A 上没有光盘时,我仍然收到错误消息。我正在 vmware 机器上运行测试。您认为有可能排除 A 和 B 驱动器吗?此外,C 盘的结果以某种方式出现了两次,并不是说这是一个大问题。问候。
    • 另外,如果它可以避免显示任何错误弹出窗口,那就太好了。谢谢!
    • @LuizGustavoBatista 代码现在应该排除 a: 和 b: 并确保在运行测试之前删除目标文件。驱动器 c:据我所知,应该只扫描一次。
    • 你是最棒的!奇迹般有效!!刚刚救了我的命!
    • 最后一次观察,如果它没有找到任何文件(setup.txt、setup2.txt),它会生成一个空白的 FOUND txt 文件而不是 NOTFOUND txt 文件。
    【解决方案2】:
    @echo off
    for /f %%i in ('wmic logicaldisk where "drivetype=2" get caption^|find ":"') do (
      pushd %%i
        dir /s /a-d "setup.txt" /s "setup2.txt" >nul && (
          dir /b /s /a-d setup.txt /s setup2.txt >>"\\servidor\pastadelogs\FOUND_%computername%.txt"
        ) || (
          echo "[%%i] Este PC não possui os arquivos" >>"\\servidor\pastadelogs\NOTFOUND_%computername%.txt"
        )
      popd
    )
    

    这将为每个 USB 驱动器处理

    【讨论】:

    • 谢谢,但我收到一条错误消息,说驱动器 A 中没有磁盘。是否可以包括 C 驱动器,每个 USB 并排除所有其他驱动器? (CD、DVD 等)。由于这将静默完成,因此我不会在屏幕上弹出任何错误消息。感谢您的帮助。
    • 计算机可能还有另一个分区,除了网络驱动器...非常感谢!
    • 再次在这里运行测试,我看到它找到了 C: 中的文件,但它没有扫描 USB。对于相同的驱动器,结果出现了两次,如下所示: C:\Users\gi-tecso\Dropbox\2-Gustavo\LUGUTA\SOFTWARES\SCRIPTS\setup.txt C:\Users\gi-tecso\Dropbox\2-Gustavo\ LUGUTA\SOFTWARES\SCRIPTS\setup.txt
    • 这是我现在得到的:节点 - AX-NTB-000787 错误:描述 = 无效查询
    • 试试for /f "tokens=2" %%i in ('wmic logicaldisk where "drivetype=2"^|find ":"') do (echo %%i)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多