【问题标题】:How does findstr "^" equate to an empty directory?findstr "^" 如何等同于一个空目录?
【发布时间】:2019-05-26 18:40:36
【问题描述】:

在最好的情况下,Windows 中的批处理文件可能会令人困惑。怎么样

  findstr "^"

等于找到一个空文件夹,当 ^ 表示行的开头?

for /d /r %1 %%A in (.) do (
  dir /ad /b "%%~fA" 2>nul | findstr "^" >nul || echo %%~fA
)

取自dbenham's answer

除非我读错了

dir /ad /b "%%~fA" 2>nul

查找空文件夹。

【问题讨论】:

  • 提供的链接不是dir /ad /B ... 它只是dir /a /b... 还包括隐藏的系统属性。 findstr "^" 将匹配任何行,如果没有,则不向条件执行运算符 || 返回成功。

标签: windows batch-file command-line directory is-empty


【解决方案1】:

此脚本将获取目录列表(及其子目录),遍历每个目录以检查子目录,然后仅列出不包含子目录的目录名称。提供的链接中的原始脚本的工作方式类似,只是它只会列出 完全 空目录(不包含子目录 文件)。下面是每一段代码的细分:


您示例中的 for /d 正在获取目录的递归列表:

for /d /r %1 %%A in (.) do ( )
  • for /d 循环遍历指定的目录集
  • for /d /r 告诉 for 循环递归到子目录
  • %1 是从命令行指定的可选文件路径
  • %%A 将在每个循环中返回当前目录
  • in (SET) 指定要循环的目录集
  • 指定“in (.)”告诉for 循环遍历所有目录

for 循环中的代码然后检查每个目录是否为空*:

  dir /ad /b "%%~fA" 2>nul | findstr "^" >nul || echo %%~fA
  • dir /ad /b "PATH" 获取指定路径中的子目录列表*
  • "%%~fA" 将当前目录名称扩展为完整路径
  • 2>nul 通过将 STDERR 重定向到 nul 来隐藏任何 dir 错误
  • |dir 找到的子目录列表通过管道传输到findstr
  • findstr "^" 然后检查子目录的非空列表
  • >nul 通过将所有输出重定向到 nul 来隐藏 findstr 结果
  • || 如果上一个命令失败(没有findstr 结果)则运行命令
  • echo %%~fA 如果没有找到子目录,则返回目录名称*

*请注意:如 LotPings 所述,您提供的代码将产生与您链接的示例不同的结果。 dir /a /b 列出所有文件和目录,而dir /ad /b 仅列出目录。这意味着您的脚本将列出所有不包含子目录(但仍可能包含文件)的目录。如果这是预期行为,请忽略此说明。

编辑:按照Ben Voigt的建议进一步分解了上述命令列表。

【讨论】:

  • 我不确定您为什么将重定向到 nul 与 || 一起分组。对于|,这很有意义,因为管道是一种重定向形式。
  • 同意。这可能会造成混淆或误导,因为命令的这些部分之间没有逻辑联系。我也不确定为什么在我将其他所有内容都分解后以这种方式对它们进行分组。我现在更新了我的答案以进一步澄清这一点。谢谢。
【解决方案2】:

我相信您缺少的部分是 ||(逻辑 OR)操作。

只有在前面的命令失败时才会运行后面的命令。

知道了这一点,dir /ad /b "%%~fA" 2>nul | findstr "^" >nul 就不会在寻找空目录了。当dir 生成的列表不为空时成功。列表为空时失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    相关资源
    最近更新 更多