当前位置: 首页 > 知识库问答 >
问题:

如何删除*。bak文件是否递归地早于特定日期,取决于文件路径中的目录?

杜河
2023-03-14

我正在为Windows 7编写批处理文件。

我目前有一个代码,可以从站点管理文件夹中的masters文件夹中删除旧备份。代码如下:

for /d %%A in ("Y:\*.*") do del /s /q /f "%%A\masters\*.bak"

但是,我需要将其编码为仅删除超过3年的内容,这将是以下代码:

forfiles /P "Y:\" /S /D -1096 /M *.bak /C "cmd /C del @path"

但是,我需要顶部代码中的内容,以便我可以从我们173个站点管理文件夹中存在的master文件夹中删除所有*. bak文件。我正在努力解决这个问题。我不能让它从我们的其他文件夹中删除*. bak文件。

我已尝试组合代码,但批处理文件中下面的命令行无法按预期工作:

forfiles /S /D -1096 /M *.bak /C "cmd /C for /d %%A in ("Y:\*.*") do del /s /q /f "%%A\masters\*.bak"

如何删除所有*。如果文件路径中的第二个目录是主目录,则在目录树中的任何位置保存3年以上的bak文件,并保留所有其他*。bak文件较新或位于文件路径中的第二个目录不是主目录的目录中?

共有1个答案

翟昊明
2023-03-14

首先使用以下命令创建批处理文件C:\Temp\DeleteBackup.bat

@echo off
set "BackupFileName=%~1"
if not "%BackupFileName:\masters\=%" == "%BackupFileName%" ECHO del "%BackupFileName%"

此批处理代码通过从字符串比较的左参数中删除此字符串不区分大小写来检查具有完整路径和文件扩展名的文件名是否包含任何地方\master\

如果剩余字符串不等于未修改的文件名字符串,因为其中包含

例如,备份文件的完整列表是:

Y:\masters\Level2\Level3\Level4\Level5\Test1.bak
Y:\Folder2\masters\Level3\Test2.bak
Y:\Folder3\Level2\masters\Level4\Test3.bak
Y:\Folder4\Level2\Level3\Level4\Level5\Test4.bak
Y:\Folder5\Level2\Test5.bak
Y:\Folder6\Level2\Level3\Level4\Level5\Level6\Test6.bak
Y:\Folder7\masters\Test7.bak

删除的文件将是:

Y:\masters\Level2\Level3\Level4\Level5\Test1.bak
Y:\Folder2\masters\Level3\Test2.bak
Y:\Folder3\Level2\masters\Level4\Test3.bak
Y:\Folder7\masters\Test7.bak

剩下的文件是:

Y:\Folder4\Level2\Level3\Level4\Level5\Test4.bak
Y:\Folder5\Level2\Test5.bak
Y:\Folder6\Level2\Level3\Level4\Level5\Level6\Test6.bak

然后在您的批处理文件中使用:

forfiles /P "Y:\" /S /D -1096 /M *.bak /C "C:\Temp\DeleteBackup.bat @PATH"

当然可以修改DeleteBackup。bat检查第二个目录层次结构级别中的目录是否为主目录。

@echo off
for /F "tokens=3 delims=\" %%I in ("%~1") do if /I "%%I" == "masters" ECHO del "%~1"

此代码将从文件上方的完整列表中删除:

Y:\Folder2\masters\Level3\Test2.bak
Y:\Folder7\masters\Test7.bak

剩下的文件是:

Y:\masters\Level2\Level3\Level4\Level5\Test1.bak
Y:\Folder3\Level2\masters\Level4\Test3.bak
Y:\Folder4\Level2\Level3\Level4\Level5\Test4.bak
Y:\Folder5\Level2\Test5.bak
Y:\Folder6\Level2\Level3\Level4\Level5\Level6\Test6.bak

小罗伯特·奇兹马迪亚(Robert Chizmadia Jr.)在已删除的评论中问道:

是否可以使用GOTO而不是在FORFILES命令行上调用另一个批处理文件?

关于这个附加问题的答案:

FORFILES不是cmd的内部命令。exe类似。它是一个控制台应用程序,存储在目录SystemRoot%\System32中(如果已使用的Windows版本已预先安装)。

在FORFILES选项之后指定要执行的命令必须是可执行文件或脚本。这就是为什么Windows命令解释器的内部命令总是使用cmd/C的原因。类似DEL的exe应该由FORFILES执行,其中真正完整的命令是SystemRoot%\System32\cmd。exe/C。

因此,在FORFILES命令中不可能使用像GOTO这样的命令,因为没有名称为GOTO的可执行文件或脚本。

此外,FOR循环中的GOTO退出循环,因此批处理文件的命令行的解释将在批处理文件的另一个位置继续进行。

但是,可以使用相同的批处理文件进行文件路径评估和备份文件删除

示例1,批处理文件不需要任何默认操作参数:

@echo off
if not "%~1" == "" (
    for /F "tokens=3 delims=\" %%I in ("%~1") do if /I "%%I" == "masters" ECHO del "%~1"
    goto :EOF
)

%SystemRoot%\System32\forfiles.exe /P "Y:\" /S /D -1096 /M *.bak /C "%~f0 @PATH"

如果使用参数执行此批处理文件,它将运行FOR循环,以检查文件路径中的第二个目录是否为masters,并在删除ECHO后删除此文件。否则,在没有任何参数的情况下启动批处理文件时,批处理文件将运行FORFILES可执行文件。

示例2:批处理文件的默认操作需要1个或多个参数:

@echo off
if "%~1" == "#Delete:Backup#" (
    for /F "tokens=3 delims=\" %%I in ("%~2") do if /I "%%I" == "masters" ECHO del "%~2"
    goto :EOF
)

rem Other commands processing the parameters.

%SystemRoot%\System32\forfiles.exe /P "Y:\" /S /D -1096 /M *.bak /C "%~f0 #Delete:Backup# @PATH"

rem More commands executed after the deletion of the backup files.

这与示例1几乎相同,不同之处在于如果运行批处理文件时使用的第一个参数区分大小写,则字符串#Delete: Backup#,批处理文件期望作为第二个参数,如果文件路径中的第二个目录是master,则删除具有完整路径的备份文件的名称。

与所有批处理代码示例一样,在执行删除备份文件的命令之前,必须先删除命令ECHO,在此代码示例中也是如此。

要了解使用的命令及其工作方式,请打开命令提示窗口,在那里执行以下命令,并仔细阅读为每个命令显示的所有帮助页。

  • <代码>回声/
  • <代码>用于/
  • <代码>forfiles/
  • <代码>转到/
  • <代码>如果/
  • <代码>设置/
 类似资料:
  • 问题内容: 我使用以下命令删除了一年以上的文件。 但是,现在我想删除所有修改时间 早于2014年1月1日的文件 我如何在Linux中做到这一点。 问题答案: 您可以将时间戳记作为文件,并将其用作参考点: 例如,2014年1月1日: 之所以有效,是因为我们正在使用一个开关。 来自:

  • 问题内容: 当我通过相对路径引用CSS文件中的图片或其他文件时,是使用CSS文件相对于CSS文件还是HTML文件的路径? 问题答案: 是的,这是相对于 这是一个示例布局: CSS中:

  • 我已经创建了一个批处理文件,将文件名中带有xxxx*的文件移动到临时文件夹,然后使用第二个命令forfiles删除原始目录中早于xx天的任何文件,然后使用robocopy/MOVE将所有其他文件移回原始目录。是否有一种方法可以运行forfiles命令从原始控制器中删除所有早于-xx天的文件,但名称中包含xxxx*的文件除外,而无需来回移动文件? 我的原始代码是:

  • 在本例中,我希望保存foo/foo2、foo/foo3和foo/foo3/foo4。有什么想法吗?谢了!

  • 我有一个包含一些文件路径的长文本。 我想做的是从其中删除路径。文件路径都类似于: 我知道使用“^/all”将选择以/all开头的句子,并选择以.js$结尾的句子。但我无法将这些合并在一起以选择整个文件路径。 毕竟,正则表达式应该放在下面的代码上以删除路径。 我能为它写正则表达式吗?有什么工具吗?

  • 问题内容: 我在删除空目录时遇到问题。这是我的代码: 参数是我要传递需要完成工作的目录的位置。该目录如下所示: 请注意,以上所有文件夹均为空。当我运行该脚本的文件夹,单独被删除!但是,文件夹,并不会被删除,即使它们是空文件夹。 编辑: 我得到的例外是: 我在哪里弄错了? 问题答案: 尝试: