【问题标题】:batch script to list local hard drives and then do a dir command on each drive列出本地硬盘驱动器的批处理脚本,然后在每个驱动器上执行 dir 命令
【发布时间】:2015-06-11 14:56:23
【问题描述】:

我试图根据这个主题制作一个脚本

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 个驱动器号...

有人可以帮忙吗?

【问题讨论】:

  • 这个脚本需要批量实现吗?如果您可以使用PowerShell,事情会容易得多。参见例如Get-PSDrive.
  • 我们坚持使用批处理,因为我们还不熟悉powershell。

标签: windows batch-file


【解决方案1】:
@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:\

在不知道有多少个驱动器可以排成一行的情况下,我们无法(或多或少)指明我们想要多少个令牌。因此,我们需要获取行,分离标题,获取列表并遍历列表中的元素(驱动器)

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

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

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

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

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

由于vol命令只接受一个驱动器引用,没有路径,我们需要从列表中的元素中去掉结尾的反斜杠,所以我们不直接使用%%c,而是使用%%~dc,即, %%c 中引用的元素的驱动器。

完整的for 循环用括号括起来并重定向,因此输出文件只需打开/关闭一次。

【讨论】:

  • 您的脚本有效。您能否解释一下 for %%c in (%%b) .. 的代码行是如何工作的?
  • @bapa,答案已更新以包含有关其工作原理的更多详细信息。
  • 嗯...在我让这个脚本在域计算机中完成它的工作后,在某些计算机上我收到错误“Windows - 无磁盘”并且人们无法登录。 :( 可能是 fsutil 的问题,并且初始化的速度没有达到应有的速度?
  • @bapa,据我所知,发布的代码不包含任何要更改的内容,但 "fud_india.com_%computername%.txt"也许 临时文件或交换文件(如果操作系统决定使用)他们。代码中的所有内容都是同步的。我没有看到初始化问题。也许脚本执行是触发器,但问题出在另一个地方。
  • 延迟时间可以解决这个问题吗?也许Windows的某些部分没有按时初始化并产生这个问题?我想将此 .txt 文件放在联网位置 - 可能在计算机登录时网络初始化速度不够快,脚本已经启动,但无法到达联网位置??
【解决方案2】:

你的%%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-error 发送到 nirvana。

【讨论】:

  • 嗯......我试过这个脚本,但它不起作用。我得到的只是批量输出:驱动器 C 中的卷是系统卷序列号是 xyz 文件未找到驱动器 E 中的卷是数据卷序列号是 E08A-0F2D 文件未找到驱动器 C 中的卷是系统卷序列号是 xyz 文件未找到
  • 刚刚再次尝试(使用另一个文件名,存在于我的驱动器上):在这里工作正常。
  • 那个脚本是你写的整个脚本吗?因为我一个人尝试过,没有我写在那里的任何预先脚本的东西,它没有工作?附言我在winxp上试试
  • 应该也可以在 XP 中使用。 wmic logicaldisk get caption 一个人能用吗?
猜你喜欢
  • 2016-12-04
  • 2023-02-22
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多