【问题标题】:Batch File to Output Subfolders sorted by Date Modified and # of Files批处理文件以输出按修改日期和文件数排序的子文件夹
【发布时间】:2015-12-02 04:12:42
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 从你的初始代码中去掉ECHO 0
  • 感谢@SomethingDark 的回复!当我从代码中仅删除“ECHO 0”时,批处理文件会运行但不会创建输出文本文件。如果我删除 '^|^|' 也是一样也是。我只是错过了一些简单的东西吗?谢谢!
  • 您的代码实际上不会返回以@ 开头的文件夹,而是返回文件 包含 @ 的文件夹;得到你想要的使用dir /-P /A:-D /O:-DE "@*" and omit |找到“@”`...
  • 感谢@aschipfl 的评论!我尝试了您的修改,但它只给出了相关文件的部分列表,然后在我再试几次后它就停止了工作。我的版本总是只给出“@”子文件夹;所以这部分代码工作正常。我只需要它还列出输出文本文件中每个“@”子文件夹的文件数。
  • 糟糕,我打错字了——应该是dir /-P /A:D /O:-DE "@*"(我之前打错了/A:-D),对不起!

标签: batch-file text output


【解决方案1】:

您正在使用的命令行dir *.* /-P /O:G-DE | find "@" 实际上返回文件 包含 @ 的目录。要仅获取以@ 开头的目录,请使用命令行dir /-P /A:D /O:-DE "@*"。开关/A:Ddir 只返回目录;模式@* 表示以@ 开头的项目,不需要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 并通过find 搜索包含文本File(s) 的行的方法基本上可以正常工作。不需要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

重定向到文本文件只进行一次,而不是每次循环迭代。我还从内部dir 命令中删除了2> nul,因为枚举目录肯定存在(它由外部dir 检索),因此不会出现错误消息。

内部循环不会产生输出,而是将文件数分配给变量numItems。这个循环通常迭代一次,但如果一个文件的名称中包含File(s),它会迭代两次——第一次是文件,第二次是摘要行。由于变量 numItems 被覆盖,它总是包含最后一个值,即预期的数字(因为摘要行位于末尾)。
此方法需要通过echo 内部循环产生输出。这需要延迟的环境变量扩展,它由setlocal 命令启用,实际上由语法!numItems! 而不是%numItems% 使用。输入 set /? 了解更多信息。

请注意,搜索字符串File(s) 需要在非英语系统上进行相应调整。

【讨论】:

  • 查看我的edit:我刚刚在脚本中添加了@echo off 行以避免命令回显也被写入Text1.txt...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多