windows - findstr "^" 如何等同于一个空目录?
问题描述
在最好的情况下,Windows 中的批处理文件可能会令人困惑。如何
findstr "^"
等于找到一个空文件夹,当 ^ 表示行的开头?
for /d /r %1 %%A in (.) do (
dir /ad /b "%%~fA" 2>nul | findstr "^" >nul || echo %%~fA
)
除非我读错了
dir /ad /b "%%~fA" 2>nul
找到空文件夹。
解决方案
该脚本将获取目录列表(及其子目录),遍历每个目录以检查子目录,然后仅列出不包含子目录的目录名称。提供的链接中的原始脚本的工作方式类似,只是它只会列出完全空的目录(不包含子目录或文件)。以下是每个代码部分的细分:
在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
dir
通过将 STDERR 重定向到 nul 来隐藏任何 - | 通过管道将找到的子目录列表
dir
导入到findstr
- findstr "^"然后检查子目录的非空列表
- >nul
findstr
通过将所有输出重定向到 nul 来隐藏 - || 如果前一个命令失败(无
findstr
结果) - echo %%~fA如果没有找到子目录,则返回目录名称*
*请注意:正如LotPings所述,您提供的代码将产生与您链接到的示例不同的结果。dir /a /b
列出所有文件和目录,而dir /ad /b
仅列出目录。这意味着您的脚本将列出所有不包含子目录(但仍可能包含文件)的目录。如果这是预期的行为,请忽略此说明。
编辑:进一步分解了Ben Voigt建议的上述命令列表。
推荐阅读
- linux - Linux 记录器的替代品
- oracle-cloud-infrastructure - 无法列出公共存储桶中的内容
- python - 在 NumPy 中向量化 2D 卷积
- docker - 与不同桥接网络中的多个 docker-compose.yml 通信
- markdown - 如何按顺序自动编号 MkDocs 图形
- java - Java固定线程池竞争条件?
- python-3.x - 如何使用 if 语句同时读取列表中的所有元素?
- python - 按 2 列分组并在 Pandas 中为每个组合打印数据
- ios - Apple 开发者注册错误:此时无法完成您在 Apple 开发者计划中的注册
- apache-spark - 在 Pyspark 中将月份名称转换为数字