如果在子文件夹中多次找到文件 - 使用批处理脚本删除所有文件

Posted

技术标签:

【中文标题】如果在子文件夹中多次找到文件 - 使用批处理脚本删除所有文件【英文标题】:If a file was found more than once in subfolders - delete all using batch script 【发布时间】:2021-11-08 04:04:29 【问题描述】:

我正在开发的系统如下所示:

D:\TargetFolder\Subfolder1 
D:\TargetFolder\Subfolder2\Subfolder3

每个文件夹中都可能存在一个名为 "Settings.txt" 的文件。我想要的是以下内容:

如果在目标文件夹及其所有子文件夹中多次找到该文件然后将其全部删除。

如果在目标文件夹及其所有子文件夹中仅找到一次文件然后继续执行脚本。

如果文件不存在那么继续执行脚本。

最终的脚本可能是这样的:

IF exist "D:\TargetFolder\*Settings.txt" (goto delete) else goto continue
:delete
del *Settings.txt /f /q
:continue
exit

我希望我正确地解释了我的问题。 提前致谢。

【问题讨论】:

【参考方案1】:
@echo off

for /F "skip=1" %%a in ('dir /B /S D:\TargetFolder\Settings.txt 2^>NUL') do (
   del /Q /S D:\TargetFolder\Settings.txt >NUL
   goto break
)
:break

for /F循环处理来自dir /S命令的文件名,但是第一个被跳过(因为"skip=1"switch),也就是说,如果有多个文件 ,执行下一条命令。

for 中的第一个命令会删除所有名称为“Settings.txt”的文件,而 forgoto 命令而中断。

【讨论】:

【参考方案2】:

此批处理文件可用于该任务:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SettingsFile="
for /F "delims=" %%I in ('dir "D:\TargetFolder\Settings.txt" /A-D-L /B /S 2^>nul') do if not defined SettingsFile (set "SettingsFile=1") else (del "D:\TargetFolder\Settings.txt" /A /F /Q /S >nul 2>nul & goto Continue)
:Continue
endlocal

上面的一个不太紧凑的变体:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SettingsFile="
for /F "delims=" %%I in ('dir "D:\TargetFolder\Settings.txt" /A-D-L /B /S 2^>nul') do (
    if not defined SettingsFile (
        set "SettingsFile=1"
    ) else (
        del "D:\TargetFolder\Settings.txt" /A /F /Q /S >nul 2>nul
        goto Continue
    )
)
:Continue
endlocal

首先,确保环境变量SettingsFile不是偶然定义的。

接下来,命令 DIR 由后台启动的单独命令进程执行,以在 D:\TargetFolder 中搜索名称为 Settings.txt 的文件,并以完整路径输出它们。 DIR 的输出被 FOR 捕获,并在 DIR 找到文件 Settings.txt 时逐行处理。

环境变量SettingsFile 是用一个字符串值定义的,这在第一个文件Settings.txt 上并不重要。如果没有更多文件Settings.txt,则FOR 循环结束而无需执行任何其他操作。

但在第二个文件Settings.txt 上执行命令DEL 删除指定文件夹及其所有子文件夹中的文件Settings.txt。循环被命令 GOTO 激发,以继续在标签 Continue 下方的行上进行批处理文件处理,因为 Settings.txt 的其他出现不再重要,当然在删除所有Settings.txt 成功。

要了解所使用的命令及其工作原理,请打开command prompt 窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

del /? dir /? echo /? endlocal /? for /? goto /? if /? set /? setlocal /?

阅读有关Using command redirection operators 的Microsoft 文档,了解>nul2>nul。重定向运算符 > 必须在 FOR 命令行上使用插入符号 ^ 转义,以便在 Windows 命令解释器在执行命令 FOR 之前处理此命令行时解释为文字字符> 在后台启动的单独命令进程中执行嵌入的dir 命令行,cmd.exe /c' 中的命令行作为附加参数附加。

有关运算符& 的说明,另请参阅single line with multiple commands using Windows batch file。

【讨论】:

【参考方案3】:

如果您可以在 Windows 系统上使用 PowerShell,这并不难。如果找到的文件数大于零,则删除每个文件。否则,什么都不会发生。如果您确信将删除正确的文件,请从 Remove-Item 命令中删除 -WhatIf

@powershell.exe -NoLogo -NoProfile -Command ^
    "$Files = Get-ChildItem -Recurse -File -Path 'C:\TargetFolder' -Filter 'Settings.txt';" ^
    "if ($Files.Count -gt 1) " ^
        "foreach ($File in $Files)  Remove-Item $File.FullName -Whatif " ^
    ""

如果可以将其作为 PowerShell .ps1 脚本文件运行,则可以消除一些噪音。

$Files = Get-ChildItem -Recurse -File -Path 'C:\TargetFolder' -Filter 'Settings.txt'
if ($Files.Count -gt 1) 
    foreach ($File in $Files)  Remove-Item $File.FullName -Whatif 

【讨论】:

以上是关于如果在子文件夹中多次找到文件 - 使用批处理脚本删除所有文件的主要内容,如果未能解决你的问题,请参考以下文章

PHP中的文件包含

如果我在日志文件中找到字符串“found”,如何编写批处理脚本来循环目录中的日志文件并生成“filename.found”?

防止多次执行 Lua 脚本

Play Framework [2.4.x] 如何在子模块的路由文件中处理公共资产

在子位置运行时反应脚本父文件夹node_modules错误

删除大文件中的一行内容