【问题标题】:Batch file to delete specific files in multiple folders批处理文件删除多个文件夹中的特定文件
【发布时间】:2023-01-10 12:32:24
【问题描述】:

我需要从同一台服务器上的 28 个文件夹中删除特定文件。 例如

C:/文件夹/DMP/app_x0

C:/文件夹/DMP/app_x1

C:/文件夹/DMP/app_x2

DeleteList.txt 有一个文件名列表(带路径)。

C:/文件夹/DMP/app_x0/ABC1.txt

C:/文件夹/DMP/app_x0/ABC1.doc

批处理文件需要有一个循环来一个一个地遍历每个文件夹并删除文本文件中提到的所有文件。仅当我在 DeleteList.txt 文件中的每个文件名前指定完整路径时,以下内容才对一个文件夹有效。

for /f "delims=" %%f in (DeleteList.txt) do del "%%f"

如何使用上面的方法,使相同的代码可以在批处理文件中运行 28 次,但每次都替换文件夹位置路径。 DeleteList.txt 不会改变。

任何示例代码/建议都会有所帮助。 谢谢。

【问题讨论】:

    标签: loops batch-file


    【解决方案1】:

    我们需要从字里行间读出这些问题之一。

    鉴于我们有完整文件名的文件,但路径分隔符不正确,并且要求从 28 个目录中删除文件(但没有列表),那么我得出结论,因为显示的所需子目录都是 C:olderDMP 的子目录,所以实际上要求就是删除列表中全文件名的父目录的所有子目录下的文件中所有与文件名匹配的文件。

    所以我的建议是

     for /f "delims=" %%b in (DeleteList.txt) do del /s "%%~dpb..%%~nxb"
    

    当然,您应该在实施之前在虚拟树上对其进行测试。

    del /s删除目标目录和所有子目录。 target子目录为%%b的驱动器和路径;它的父母(..); %%b 的名称和扩展部分。

    我更喜欢使用不可用作元变量修饰符的元变量。

    要删除子目录但不删除父目录:

    for /f "delims=" %%b in (DeleteList.txt) do FOR /d %%c IN ("%%~dpb..*") DO del /s "%%c%%~nxb">nul
    

    这一次,%%c 依次设置为所有子目录名称,del/s 应用于每个子目录。 /s(...和子目录)可能不是必需的。如果需要,>nul 会抑制删除报告。

    【讨论】:

    • Thx,它确实有效,但它甚至会删除父文件夹和子文件夹中的所有文件。需要做什么来确保它只删除子文件夹中 DeleteList.txt 中列出的文件?
    【解决方案2】:

    不确定 OP 是否需要这个,但您可以使用以下批处理脚本从父文件夹开始从多个文件夹中删除特定文件。

    @echo off
    for /r "Drive:path	oparent_folder" %%d in (.) do (
      del "%%~dABC1.txt"
      del "%%~dABC1.doc"
    )
    

    该脚本将遍历父目录及其子文件夹,并仅删除特定文件。 在帖子的情况下,父文件夹可以是“C:older”。 我测试过它并且有效。

    【讨论】: