首页 > 解决方案 > findstr "^" 如何等同于一个空目录?

问题描述

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

  findstr "^"

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

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

取自dbenham的回答

除非我读错了

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

找到空文件夹。

标签: windowsbatch-filecommand-linedirectoryis-empty

解决方案


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


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>nuldir通过将 STDERR 重定向到 nul 来隐藏任何
  • | 通过管道将找到的子目录列表dir导入到findstr
  • findstr "^"然后检查子目录的非空列表
  • >nulfindstr通过将所有输出重定向到 nul 来隐藏
  • || 如果前一个命令失败(无findstr结果)
  • echo %%~fA如果没有找到子目录,则返回目录名称*

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

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


推荐阅读