我正在尝试编写一个简单的批处理文件,该文件将列出以批处理文件所在的特定文件夹的“@”开头的子文件夹,按修改日期对这些文件进行排序,并告诉我每个文件的数量子文件夹。这是我的代码,它完美地工作,除了它总是输出文件的数量为“0”,这是不正确的:
FOR /F "tokens=* delims= " %%D IN ('DIR *.* /-P /O:G-DE ^| FIND "@"') DO (
FOR /F %%K IN ('DIR "%%D" 2^>NUL ^| FIND "File(s)" ^|^| ECHO 0') DO (
ECHO %%D %%K>>Test1.txt
)
)
当我执行测试批处理文件只是为了输出子文件夹中的文件数时,它可以工作(尽管它提供了文件夹中的文件数和文件总数,但至少我得到了每个子文件夹的文件数量):
FOR /F %%K IN ('DIR /S ^| FIND "File(s)"') DO ECHO %%K >>Test2.txt
当我将两位代码组合起来简单地给我子文件夹的名称+文件数量(每个子文件夹一行)时,我似乎无法让它工作。任何帮助将不胜感激!
谢谢!
答案 0 :(得分:0)
您正在使用的命令行dir *.* /-P /O:G-DE | find "@"
实际上返回包含 @
的和目录。要仅使用@
获取开始的目录,请使用命令行dir /-P /A:D /O:-DE "@*"
。交换机/A:D
只允许dir
返回目录;模式@*
表示以@
开头的项目,不需要find
。
现在让我们使用for /F
来浏览所有项目。为此,将开关/B
添加到dir
以避免输出中的任何标头并返回纯目录列表:
for /F "delims=" %%D in ('
dir /B /-P /A:D /O:-DE "@*"
') do (
rem print each item:
echo "%%~D"
)
因此,现在让我们专注于每个列出的目录中包含的文件数量。使用dir
并使用File(s)
搜索包含文本find
的行的方法基本上可以正常工作。不需要echo 0
,因为dir
也返回空目录的摘要行。但是您需要考虑名称中包含字符串File(s)
的项目。所以下面的代码应该可以工作:
@echo off
setlocal EnableExtensions EnableDelayedExpansion
> "Test1.txt" (
for /F "delims=" %%D in ('
dir /B /-P /A:D /O:-DE "@*"
') do (
for /F "tokens=1 delims= " %%K in ('
dir /-P "%%~D" ^| find "File(s)"
') do (
set "numItems=%%K"
)
echo "%%~D" !numItems!
)
)
endlocal
重定向到文本文件只执行一次,而不是每次循环迭代。我还从内部2> nul
命令中删除了dir
,因为枚举目录肯定存在(它由外部dir
检索),因此不会出现错误消息。
内部循环不会产生输出,但会将文件数分配给变量numItems
。此循环通常迭代一次,但如果文件名称中包含File(s)
,则迭代两次 - 第一次为文件,第二次为摘要行。由于变量numItems
被覆盖,因此它始终包含最后一个值,即预期的数字(汇总行在末尾)。
内循环后,此方法需要echo
生成输出。这需要延迟环境变量扩展,该扩展由setlocal
命令启用,并且实际上由语法!numItems!
而不是%numItems%
使用。输入set /?
可获取更多相关信息。
请注意,搜索字符串File(s)
需要在非英语系统上进行相应调整。