批量文件到输出子文件夹按修改日期和文件数

时间:2015-12-02 04:12:42

标签: batch-file text output

我正在尝试编写一个简单的批处理文件,该文件将列出以批处理文件所在的特定文件夹的“@”开头的子文件夹,按修改日期对这些文件进行排序,并告诉我每个文件的数量子文件夹。这是我的代码,它完美地工作,除了它总是输出文件的数量为“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

当我将两位代码组合起来简单​​地给我子文件夹的名称+文件数量(每个子文件夹一行)时,我似乎无法让它工作。任何帮助将不胜感激!

谢谢!

1 个答案:

答案 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)需要在非英语系统上进行相应调整。