批处理脚本以获取多个子目录中所有文件的列表

4
我希望创建一个批处理脚本,以列出目录中的所有文件。
到目前为止,这是我拥有的内容:
@echo off

dir c:\users\documents\* /b > filelist.txt

这个方案完美运作,但有一个小问题。我想要列出的文件位于多个用户目录中,这些目录嵌套在两个目录(A-L / M-Z)中。我可以很容易地通过编写两行代码来解决这两个字母目录的问题。然而,我不知道如何获取子目录内的文件列表。
额外奖励:这是一个额外的问题,我还没有进行研究,但我想把它加进来。我将尝试让此脚本自动将“filelist.txt”附加到电子邮件并发送出去。
编辑:忘记了一个更重要的奖励问题。
下面是一个非常简陋的文件结构图示。

enter image description here

我希望能够有一个列表,显示文件的父目录,以便在filelist.txt中显示类似于"A Name\File1.ext"的内容。
编辑:使用“dir /b/s”似乎列出了所有子目录、文件并给出了完整的路径长度。是否有办法只返回特定“Name目录”中有内容时的列表?因此,如果除了“D Name”以外的所有内容都为空,它将只返回
\D Name\file1.ext
\D Name\file2.ext

输入“dir /?”并阅读帮助文档。这是一个愚蠢的问题。 - user6017774
2
我代表那个人道歉。没有必要表现敌对。 - Malcolm Salvador
3个回答

5

dir命令没有删除其输出的一部分的代码。因此,您需要使用一个for循环来解析其输出并进行删除:

@echo off
setlocal enabledelayedexpansion
pushd "c:\users\documents\"
(
  for /r %%a in (*) do (
    set x=%%a
    echo !x:%cd%=!
  )
)>filelist.txt
popd

如果您需要发送自动邮件,请查看我们的搜索功能,该功能位于本网站右上角(请不要告诉任何人,否则我们将会有更多的重复问题;))。

编辑:我不认为有任何办法可以限制它在子目录中的深度,有志者事竟成...

@echo off
setlocal enabledelayedexpansion
set /p lv="max Levels deep [0...n]= "
set /a lv+=2
pushd "c:\users\theo\"
(
  for /r %%a in (*.bat) do (
    set x=%%a
    set x=!x:%cd%=!
    for /f "tokens=1,%lv% delims=\" %%b in ("!x!") do if "%%c"=="" echo !x!
  )
)>filelist.txt
popd

输入"0"表示"仅在此文件夹中,不搜索子文件夹"; "2"表示"在此文件夹及其子文件夹中搜索,最大深度为2"

内部的for循环检查是否存在"%lv%+2"标记(因此是set /a lv+=2)。如果是空的,则深度小于或等于%lv%,并且将显示该字符串。如果不为空,则深度大于%lv%,不会输出。


这似乎与“dir c:\ users \ documents \ * / b / s> filelist.txt”没有任何区别。我仍然得到一个文本文件,其中列出了所有子目录中的文件,这些子目录中的目录等。 - JohnN
NVM我有些问题。这在大部分情况下都有效。我不认为有任何方法可以限制它向下遍历多少个子目录?只显示1或2个级别以下的目录? - JohnN
“是的,我们能做到” - 巴拉克·奥巴马。“Wir schaffen das”(我们能做到)- 安格拉·默克尔 - 请查看我的编辑。 - Stephan
那么将 set /p lv="max Levels deep [0...n]= " 替换为 set /p lv="0" - JohnN
不,使用“set /p”,等号后面的字符串是提示。详见“set /?”或直接尝试一下。顺便说一句,“0”表示“无任何子文件夹”的“零级深度”,换言之,就是“仅此目录”。 - Stephan

4

要递归搜索所有子目录,请使用dir命令的/s开关。

dir c:\users\documents\* /b/s > filelist.txt

但是我不知道有什么方法可以在批处理文件中发送电子邮件,除非使用其他程序。如果您不坚持使用批处理文件,可以使用PowerShell轻松完成此操作(我建议使用此方法,因为PowerShell是微软的未来方向)。

Get-ChildItem -File -Recurse | Select-Object -ExpandProperty FullName | Out-File -FilePath c:\filelist.txt;
Send-MailMessage -To YOURADDRESS -From YOURADDRESS -SmtpServer YOURSMTPHOST -Subject Filelist -Attachments c:\filelist.txt;

这更多是批处理的简单性问题。如果我可以不安装任何程序,那么做这件事情会更容易得多。至少有一台机器需要这样做,但它没有连接到互联网。 - JohnN
1
您不需要安装任何东西 - PowerShell 自 Windows 7 起就已成为 Windows 的一部分(并且在 XP 中作为单独的安装程序可用)。如果您的系统仍然没有 PowerShell,则它们很可能已经过了 EOL,应该被替换/升级。至于未连接到互联网的机器,无论是批处理还是 PS,您打算如何发送电子邮件?批处理已死 - PowerShell 是我们进行现代 Windows 自动化的方式。 - alroc
4
如果批处理已经过时了,为什么微软会在Windows 10的cmd.exe中添加新功能呢?每个东西都有其优点和缺点。 - Squashman
@alroc 该机器未连接到互联网,但通过局域网与其他机器相连。 - JohnN
@alroc 我至少要让文件列表工作起来,可能以后会转到PowerShell,但那需要我学习如何使用PowerShell,而我需要尽快得到一些东西。此外,这个答案并不完全是我想要的。它给了我一个包含所有目录及其完整路径的列表,但我只需要一个包含任何存在于“Name”目录内的文件的列表,这些文件可以有完整路径(虽然我更喜欢只有父目录)。此外,我不需要在“Name”目录中的任何文件夹的完整路径。 - JohnN
@Squashman,批处理的任何更新可能都是PowerShell功能的副产品;但如果我错了,请告识我。 - Daniel

1

不确定你在编辑中的意思是否是这个,但可以尝试这个:

dir /A-D /S /B


1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community
我也不确定那是否是我的意思,哈哈。我5年前问过这个问题 :) - JohnN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接