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

问题描述 投票:0回答:4

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

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

@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
batch-file subdirectory
4个回答
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

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

;)
)。

编辑

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%
- 无回声。


4
投票

要递归搜索所有子目录,请使用

/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;

1
投票

不确定这是否是您在编辑中的意思,但尝试一下

目录 /A-D /S /B


0
投票

可以尝试:

cd "root_dir"
dir /b /s 

在网络上可以尝试:

pushd "root_dir"
dir /b /s 
popd "root_dir"
© www.soinside.com 2019 - 2024. All rights reserved.