【问题标题】:Batch script to get a list of all files in multiple subdirectories获取多个子目录中所有文件列表的批处理脚本
【发布时间】:2016-11-08 21:37:27
【问题描述】:

我想创建一个批处理脚本,它将创建一个目录中所有文件的列表。

到目前为止,这是我所拥有的:

@echo off

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

这与一个小故障完美结合。我要为列表获取的文件位于多个用户目录中,这些用户目录位于两个目录 (A-L / M-Z) 中。只需为此编写两行代码,我就可以轻松绕过这两个按字母顺序排列的目录。但是,我不确定如何获取子目录中的文件列表。

奖励:这是一个我还没有真正研究过的额外部分,但我想我会把它扔在那里。我将尝试让这个脚本将“filelist.txt”附加到电子邮件并自动发送出去。

编辑:忘记了一个更重要的奖金问题。

这是文件结构的一个非常可怜的插图。

我希望能够有一个显示文件父目录的列表,以便它在 filelist.txt 中显示如下内容:“A Name\File1.ext”

编辑:使用dir /b/s 似乎列出了所有子目录、文件并给出了完整的路径长度。有没有办法只在特定的“名称目录”中有内容时才返回列表?因此,如果除了“D Name”之外的所有内容都是空的,它只会返回

\D Name\file1.ext
\D Name\file2.ext

【问题讨论】:

  • 输入dir /? 并阅读帮助。这是一个愚蠢的问题。
  • 我代表其他人道歉。不需要敌意

标签: batch-file subdirectory


【解决方案1】:

dir 没有删除部分输出的代码。因此,您必须使用执行删除操作的 for 循环解析其输出:

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

要发送自动邮件,请参阅我们的search function,它隐藏在本网站的右上角(请不要告诉任何人,否则我们会收到更少的重复邮件;))。

编辑I don't suppose there's anyway I can limit how far down in subdirectories this works?
有志者事竟成……

@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 没有什么不同我仍然得到一个文本文件,其中包含所有子目录、这些子目录中的文件、这些子目录中的目录等的列表。跨度>
  • NVM 我出了点问题。这在大多数情况下都有效。我不认为无论如何我可以限制子目录的工作范围?哪里只显示 1 或 2 个级别?
  • “是的,我们可以” - Barrack Obama。 “Wir schaffen das”(我们可以做到)- Angela Merkel - 请看我的编辑。
  • 所以用set /p lv="0"替换set /p lv="max Levels deep [0...n]= "
  • 不,set /p= 后面的字符串是提示符。请参阅set /? 或尝试一下。顺便提一句。 0 表示“Null 级别深”,或者换句话说:“只是这个目录,没有任何子文件夹”
【解决方案2】:

要递归搜索所有子目录,请将/s 开关用于dir

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

但据我所知,没有其他程序就无法从批处理文件发送电子邮件。如果您不接受使用批处理文件的想法,您可以使用 PowerShell 轻松完成此操作(我推荐这种方法,因为 PowerShell 是 Microsoft 的前进方向)。

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;

【讨论】:

  • 更多的是批处理的简单性。如果我能侥幸逃脱,如果我不必安装任何程序,这样做会容易得多。至少有一台我需要执行此操作的机器未连接到互联网。
  • 您不需要安装任何东西 - 自 Windows 7 以来,PowerShell 已成为 Windows 的一部分(并且一直可作为单独安装回到 XP)。如果您的系统仍然没有 PowerShell,那么它们很可能已经过了 EOL,无论如何都应该更换/升级。至于没联网的机器,不管是不是批量转PS,你打算怎么发邮件?批处理已死 - PowerShell 是我们进行现代 Windows 自动化的方式。
  • 如果批处理死了,为什么微软在 Windows 10 中为 cmd.exe 添加了新功能?任何事物都有其优点和缺点。
  • @alroc 机器没有连接到互联网,但是通过内网连接到其他机器。
  • @alroc 我至少要让文件列表正常工作,稍后我可能会过渡到 PowerShell,但这需要我学习如何使用 PowerShell,而且我至少需要相对较快的东西另外,这个答案并不是我想要的。它为我提供了所有目录及其完整路径的列表,但我只需要一个列表,其中包含“名称”目录中存在的任何文件,并且这些文件可能具有完整路径(尽管我更喜欢父目录)。另外,我不需要“名称”目录中任何文件夹的完整路径。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
  • 2014-10-24
  • 2012-07-27
相关资源
最近更新 更多