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

编写一个批处理文件,删除子目录的特定子目录中3年前的文件

龚永新
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文件较新或位于文件路径中的第二个目录不是主目录的目录中?

伊姆古尔。com/a/isTOm这里是目录。由于我在驱动器上的权限,我无法进行转储,因此这是我所能做的最好的。

我如何使它从删除:|美国-美国|加拿大|GME|GMIO|GMSA|墨西哥|文件夹以及进展中的和MASTERS文件夹在这6个目录中的每一个是3岁或更老?

提前谢谢!!

@Mofi试图在这里帮助我,但在工作后他们更改了文件夹,MOFI建议我提出一个新问题,而不是编辑他自己的问题,如何根据文件路径中的目录递归删除比特定日期更旧的*. bak文件?给你。

共有2个答案

邵星河
2023-03-14

据我所知,这项任务是:从路径为Masters的文件夹中删除所有旧文件。

>

  • 使用dir /S /B获取所有文件夹的完整路径这将递归输出当前路径中所有文件夹的完整路径。

    使用命令findstr/R/C筛选文件夹:“Y:\\[^\]*\\[^\]*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\。它将只输出与reqexp匹配的路径。请注意双斜杠<代码>[^\]*\[^\]*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\。要在批处理中使用,符号必须加倍,因为它是特殊的转义符号。

    在找到的路径上对文件执行

    从示意图上看

    for /f "delims=" %%f in ('dir masters /S /B ^| findstr /R /C:"Y:\\[^^\\]*\\[^^\\]*\\masters$"') do (
      :: %%f contains full path to "masters" folder
      forfiles ... 
    )
    

  • 谭献
    2023-03-14

    我使用了文档。txt和以下批处理代码,用于测试批处理文件顶部的代码:

    @echo off
    if "%~1" == "#Delete:Backup#" (
        for /F "tokens=4 delims=\" %%I in ("%~2") do (
            if /I "%%I" == "masters" (
                ECHO del from line %Line%: "%~2"
            ) else if /I "%%I" == "wip" (
                ECHO del from line %Line%: "%~2"
            )
        )
        goto :EOF
    )
    
    set "Line=1"
    for /F "delims=" %%# in (Document.txt) do (
        call "%~f0" #Delete:Backup# "%%#"
        set /A Line+=1
    )
    

    输出用于文档中的1219行。txt文件:

    del from line 19: "Y:\America - US\Milford\WIP\Site\29678-EDM\156400000-CS1-00.bak"
    del from line 20: "Y:\America - US\Milford\WIP\1908\20170721_05.59\156401908-IF1-L1.bak"
    del from line 21: "Y:\America - US\Milford\WIP\1908\20170721_05.59\156401908-AE1-L1.bak"
    del from line 22: "Y:\America - US\Milford\WIP\1908\20170721_05.59\30083-EDM\156401908-1500086IF1-L1.bak"
    del from line 34: "Y:\America - US\Milford\Masters\1908\156401908-AE1-L1.bak"
    del from line 48: "Y:\America - US\Warren Tech Center\WIP\20005\20170804_09.09\156320005-IF1-01.bak"
    del from line 49: "Y:\America - US\Warren Tech Center\WIP\20005\20170804_09.09\156320005-IF1-L1.bak"
    del from line 50: "Y:\America - US\Warren Tech Center\WIP\20005\20170804_09.09\156320005-IF1-02.bak"
    del from line 51: "Y:\America - US\Warren Tech Center\WIP\20005\20170804_09.09\156320005-IF1-03.bak"
    del from line 52: "Y:\America - US\Warren Tech Center\WIP\20005\20170804_09.09\AEB cabinet modifications Duane\156320005-IF1-02_SOM.bak"
    del from line 53: "Y:\America - US\Warren Tech Center\WIP\20005\20170804_09.09\AEB cabinet modifications Duane\156320005-IF1-L1_SOM.bak"
    del from line 54: "Y:\America - US\Warren Tech Center\WIP\20005\20170804_09.09\AEB cabinet modifications Duane\156320005-IF1-01_SOM.bak"
    del from line 55: "Y:\America - US\Warren Tech Center\WIP\20005\20170804_09.09\AEB cabinet modifications Duane\156320005-IF1-03_SOM.bak"
    del from line 56: "Y:\America - US\Warren Tech Center\WIP\1971\30147-EDM\156301971-EL1-03.bak"
    del from line 57: "Y:\America - US\Warren Tech Center\WIP\1971\30147-EDM\156301971-EL1-02.bak"
    del from line 58: "Y:\America - US\Warren Tech Center\WIP\1971\30138-EDM\156301971-AC1-L1.bak"
    del from line 59: "Y:\America - US\Warren Tech Center\WIP\1971\30138-EDM\156301971-EL1-L1.bak"
    del from line 60: "Y:\America - US\Warren Tech Center\WIP\1971\30138-EDM\156301971-AE1-L1.bak"
    del from line 139: "Y:\America - US\Warren Tech Center\Masters\4606\156304606-IF1-L1g.bak"
    del from line 140: "Y:\America - US\Warren Tech Center\Masters\4606\156304606-IF1-L1f.bak"
    del from line 141: "Y:\America - US\Warren Tech Center\Masters\4606\156304606-IF1-L1.bak"
    del from line 142: "Y:\America - US\Warren Tech Center\Masters\9227\156309227-IF1-01.bak"
    del from line 143: "Y:\America - US\Warren Tech Center\Masters\20005\156320005-IF1-L1.bak"
    del from line 144: "Y:\America - US\Warren Tech Center\Masters\1971\156301971-IF1-L1w.bak"
    del from line 145: "Y:\America - US\Warren Tech Center\Masters\1971\156301971-IF1-L1e.bak"
    del from line 146: "Y:\America - US\Warren Tech Center\Masters\1971\156301971-IF1-L1.bak"
    del from line 147: "Y:\America - US\Warren Tech Center\Masters\1971\156301971-AC1-L1.bak"
    del from line 148: "Y:\America - US\Warren Tech Center\Masters\1971\156301971-EL1-L1.bak"
    del from line 149: "Y:\America - US\Warren Tech Center\Masters\1971\156301971-AE1-L1.bak"
    del from line 150: "Y:\America - US\Warren Tech Center\Masters\1958\156301958-IF1-02.bak"
    del from line 151: "Y:\America - US\Warren Tech Center\Masters\19867\156319867-IF1-09.bak"
    del from line 152: "Y:\America - US\Warren Tech Center\Masters\19867\156319867-IF1-02.bak"
    del from line 153: "Y:\America - US\Warren Tech Center\Masters\19867\156319867-IF1-06.bak"
    del from line 154: "Y:\America - US\Warren Tech Center\Masters\19867\156319867-IF1-07.bak"
    del from line 155: "Y:\America - US\Warren Tech Center\Masters\1963\156301963-IF1-02.bak"
    del from line 156: "Y:\America - US\Warren Tech Center\Masters\1979\156301979-AE1-01.bak"
    del from line 157: "Y:\America - US\Warren Tech Center\Masters\1979\156301979-IF1-01.bak"
    

    这看起来很正确,因此要使用的代码是:

    @echo off
    if "%~1" == "#Delete:Backup#" (
        for /F "tokens=4 delims=\" %%I in ("%~2") do (
            if /I "%%I" == "masters" (
                del "%~2"
            ) else if /I "%%I" == "wip" (
                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.
    

    然后我认为您将来可能会添加额外的目录,因此比这更好的代码结构将有助于您添加额外的目录。所以我想了一点,并在修改后的版本后再次测试,首先使用Documen.txt和1219*. bak文件名与完整路径。

    @echo off
    if "%~1" == "#Delete:Backup#" (
        for /F "tokens=4 delims=\" %%I in ("%~2") do (
            for %%J in (masters wip) do if /I "%%I" == "%%~J" ECHO del from line %Line%: "%~2" & goto :EOF
        )
        goto :EOF
    )
    
    set "Line=1"
    for /F "delims=" %%# in (Document.txt) do (
        call "%~f0" #Delete:Backup# "%%#"
        set /A Line+=1
    )
    

    此代码产生的输出与第一个代码完全相同。因此,您还可以使用:

    @echo off
    if "%~1" == "#Delete:Backup#" (
        for /F "tokens=4 delims=\" %%I in ("%~2") do (
            for %%J in (masters wip) do if /I "%%I" == "%%~J" del "%~2" & goto :EOF
        )
        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.
    

    第三目录级别的其他目录可以通过master wip轻松添加。

     类似资料:
    • 问题内容: 如何在当前目录及其子目录中显示所有大于10k字节的文件。 尝试过,但是没有用。 问题答案: 第一部分与@sputnicks答案相同,并成功查找目录中超过10k的所有文件(不要将k与K混淆),我的补充是,第二部分然后执行或ls列出(-l)文件通过人类可读的大小(-h)。如果愿意,可以取反h。当然是文件本身,而仅仅是文件的替代 在实践中会重复或: 将其显示为一条语句或: 更多\; vs +

    • 问题内容: 我想知道,删除包含所有文件的目录的最简单方法是什么? 我正在删除一个文件夹,但是,如果其中有文件,我将无法删除。 问题答案: 如今至少有两种选择。 在删除文件夹之前,请删除其所有文件和文件夹(这意味着递归!)。这是一个例子: } 如果您使用的是5.2+,则可以使用RecursiveIterator来实现,而无需自己实现递归:

    • 问题内容: 在spring batch中,我正在使用MultiResourceItemReader从目录中读取多个文件。然后,我使用FlatFileItemReader作为委托来处理单个文件。我的用例是,一旦文件被完全处理(READ- WRITE完成),则将其删除,然后multiResourceitemReader必须选择另一个文件并继续。 我尝试了FileDeletingTasklet删除目录中

    • 我从特定目录下的Stackoverflow使用通配符子域获取源代码 原始代码: 它可以正常工作,但上面的代码指向根目录。我希望所有子域都指向我的“公文包”目录中的目录,所以我尝试修改自己的代码 修改后(添加"/投资组合"): 但它给了我“500-内部服务器错误”。。。为什么?有人能纠正我的密码吗? 对我的英语表示感谢和歉意。

    • 本文向大家介绍使用bash shell删除目录中的特定文件的3种方法,包括了使用bash shell删除目录中的特定文件的3种方法的使用技巧和注意事项,需要的朋友参考一下 我是一名Linux新用户。现在我需要清理一个下载目录中的文件,其实我就是想从~/Download/文件夹删去除了以下格式的文件外所以其它文件: 1.*.iso - 所有的iso格式的文件。 2.*.zip - 所有zip格式的文

    • 问题内容: 使用此代码 返回特定目录中文件夹和文件的总和,而不用关心 子目录 。我想获取目录及其子目录中所有文件的数量。 PS:返回所有文件和文件夹的总和几乎无关紧要。 任何帮助表示赞赏,谢谢 问题答案: 试试这个。 它可能会帮助您。