批处理脚本列出本地硬盘驱动器,然后在每个驱动器上执行dir命令

时间:2015-04-07 05:24:07

标签: windows batch-file

我尝试按照这个主题制作一个脚本

batch script to find drive letter of a mounted device

但没有真正的成功。

这是剧本:

SETLOCAL EnableDelayedExpansion
for /f "usebackq tokens=1,*" %%i in (`fsutil fsinfo drives`) do (
    if exist %%j dir /S /D "%%j*hurrdurr.txt" >> fud_india.com_%computername%.txt
)
pause

问题是我得到的结果,但只有1个驱动器号......

任何人都可以在这里帮忙吗?

2 个答案:

答案 0 :(得分:3)

@echo off
    setlocal enableextensions disabledelayedexpansion

    >"fud_india.com_%computername%.txt" 2>nul (
        for /f "delims=: tokens=1,*" %%a in ('fsutil fsinfo drives') do (
            for %%c in (%%b) do vol %%~dc && dir /s /d "%%~dc\hurrdurr.txt"
        )
    ) 

for /f只处理行,在这种情况下是fsutil命令的输出,并且能够使用指定的分隔符集将这些行拆分为标记。由于fsutil返回一行中的所有驱动器,如

Drives: C:\ D:\ E:\

并且不知道线路中可以有多少驱动器,我们不能(或多或少)指示我们想要多少令牌。因此,我们需要获取行,分隔标题,获取列表并迭代列表中的元素(驱动器)

第一步是将标题与驱动器列表分开。这可以通过for /f %%atokens条款直接在delims中完成。我们将使用冒号作为分隔符来分割标记中的行。

我们正在请求两个令牌:第一个令牌(%%a)将文本存储到第一个分隔符(标题),第二个令牌(%%b)将存储该行的其余部分(这是令牌子句中*的含义)

使用%%b中存储的驱动器列表,我们需要一种迭代它的方法。这就是for %%c in (%%b) ...的原因。展开%%b时,生成的命令将为

for %%c in (C:\ D:\ E:\) do ...

对于列表中的每个元素,vol命令用于确定驱动器是否可用,如果未设置errorlevel,则执行dir命令。

由于vol命令只接受没有路径的驱动器引用,我们需要从列表中的元素中删除结尾反斜杠,因此我们不使用%%c而是直接使用{{1} },即%%~dc中引用的元素的驱动器。

完整的%%c循环括在括号中并重定向,因此输出文件只需要打开/关闭一次。

答案 1 :(得分:1)

您的%%j包含C:\ D:\ E:\ F:\ G:(对我来说),这会让您if

if exist C:\ D:\ E:\ F:\ G:\ dir ...

明显错误的语法。

我建议另一种方法(wmic):

for /f "skip=1" %%i in ('wmic logicaldisk get caption') do (
  dir /s /d %%i\*hurrdurr.txt" >>fud_india.com_%computername%.txt 2>nul
)

通过删除if exist,您可以避免使用GUI-Box“无媒体”; >nul只是将dir - 错误发送给必杀技。