保留最新文件

时间:2014-10-01 14:15:01

标签: windows file batch-file cmd delete-file

我已阅读answer to "Batch File to Delete Files in a Folder" proposed by @Magoo并尝试了代码,但无法发表评论或提出其他问题,所以如果我在这里违反规则,我会道歉。

让我先说一下我可能误解了这应该如何运作。

首先,我确保要清理的目录中的所有文件都具有相同的日期。 然后我用所述目录的名称替换了c:\ sourcedir并运行了cmd文件。

我希望它产生一个空字符串,但得到了完整的文件列表。

尽管我可能遗漏了一些东西,但这可能会非常不幸。

我不太擅长DOS / CMD,所以我想知道@Magoo是否可能澄清这个问题。

1 个答案:

答案 0 :(得分:1)

不确定这是你需要的,但可以用作骨架来启动

@echo off
    setlocal enableextensions disabledelayedexpansion

    pushd "c:\where\the\filesAre" && (
        for /f "skip=1 delims=" %%a in ('dir /b /a-d /tw /o-d *') do echo del "%%a"
        popd
    )

首先,将活动目录更改为已添加的文件夹(根据需要更改)。然后使用for命令执行dir命令并处理其输出。对于dir输出中的每一行,执行do子句后的代码,该行的内容存储在for可替换参数%%a

dir命令将以裸格式列出文件(/b仅文件名),不包括目录(/a-d),按下一个写入日期顺序降序/tw /o-d )。因此,最新文件是for命令将处理的列表中的第一个文件(dir命令的输出)。

由于我们要求for跳过一行(skip=1),因此将忽略此第一个文件。对于其余的行/文件,执行del命令。

del操作仅响应控制台。如果输出正确,请删除echo命令以删除文件。

已修改以适应评论

@echo off
    setlocal enableextensions disabledelayedexpansion

    rem Configure extensions to process
    set "_ext.00=al*.txt"
    set "_ext.01=cm*.txt"

    rem Change to the desired folder
    pushd "c:\where\the\filesAre" || goto :eof

    rem For each pattern in the list
    rem     For each file matching the pattern (except the newest)
    rem         Delete the file
    for /f "tokens=1,* delims==" %%x in ('
        set _ext.
    ') do for /f "skip=1 delims=" %%a in ('
        dir /b /a-d /tw /o-d "%%~y" 2^>nul
    ') do echo del "%%a"

    popd

定义一个"数组"使用要处理的文件模式列表。对于每个模式(在outter set内使用for /f命令检索)迭代匹配该模式的文件(内部for),跳过第一个/最新模式并删除其余模式