Windows CMD/批次保留最新的日期盖章文件



我有一些我想整理并保留最新文件的文件。我无法通过文件属性修改或创建日期来完成,我没问题。

这是文件的命名约定。 fileabc_yyyymmdd.txt

  • fileabc_20190201.txt
  • fileabc_20190125.txt
  • fileabc_20190118.txt
  • fileabc_20190111.txt
  • fileabc_20190104.txt

您可以看到日期邮票在文件名中本身。这些文件每周生成。因此,我想通过它们进行批处理文件循环,并删除除当前日期的所有大多数日期外的所有内容。我真的在寻找如何做到这一点的方法,但我找不到太多,所以我需要想法。我更喜欢纯CMD解决方案,但我也对PowerShell解决方案开放。


我自己尝试的是用...

解析日期
@echo off
setlocal enabledelayedexpansion
for /f "tokens=* delims= " %%G IN ('dir/b /a-d "C:Usersthomas.mausDocumentsTomdevTest Batch FilesdevsortbyFileDateNameFileABC_*.txt"') do (
            set fileName=%%G 
            Set theDate=!fileName:~8,8!
            echo !theDate!

)

然后,我想从循环的结果中以某种方式进行这些日期,然后做

之类的事情
if "%theDate%" GEQ "*****not sure what to put here*****" (
    del *all the old files, also not sure what to put here*
)  

怎么样?

@echo off
for /f "skip=1" %%i in ('dir /o-n /b *.txt') do del %%i

如果您只想测试它(请查看它将删除的内容),请执行:

@echo off
for /f "skip=1" %%i in ('dir /o-n /b *.txt') do echo %%i

如果您不关心文件日期,而仅在于文件名中的日期,则可以执行以下操作,鉴于零件FileABC始终是相同的,并且不包含任何_自己:

pushd "C:Usersthomas.mausDocumentsTomdevTest Batch FilesdevsortbyFileDateName" && (
    for /F "skip=1 delims= eol=|" %%F in ('
        dir /B /A:-D "FileABC_????????.txt" ^
            ^| sort /R
    ') do (
        del "%%F"
    )
    popd
)

尽管sort /R进行了字母排序,但由于您选择的日期格式而有效,这确保字母顺序等于字母数字。

我们只是循环浏览文件,按日期按预期顺序排序,然后跳过第一个文件,现在是最新文件:

@for /f "skip=1" %%a in ('dir /b /o-d *.txt') do @echo @del %%a

重要!

此示例仅将echo作为安全度量删除命令,这样您就不会删除不应该拥有的文件。要执行实际删除,请从行中删除@echo

要更多地了解我们使用的功能,请从cmd.exe

运行以下内容
  • for /?
  • dir /?

作为一个附加选项,以防万一文件名前缀在整个过程中更改,并且只有 _YYYYMMDD.txt保持恒定,您仍然可以使用该日期来等待任务,因为它已经在字母表上可排序。

这是一个示例:

@Echo Off
Set "SrcDir=%UserProfile%DocumentsTomdevTest Batch FilesdevsortbyFileDateName"
For /F "Delims==" %%A In ('Set $ 2^>Nul') Do Set "%%A="
Set "_="
For /F Delims^=^ EOL^= %%A In ('Where "%SrcDir%":*_????????.txt 2^>Nul'
) Do Set "_=%%~nA" & Call Set "$%%_:~-8%%=%%A"
If Not Defined _ Exit /B
For /F "Tokens=1* Delims==" %%A In ('Set $ 2^>Nul') Do Set "_=%%B"
For /F Delims^=^ EOL^= %%A In ('Where "%SrcDir%":*_????????.txt^|Find /V "%_%"'
) Do Del /A /F "%%A"

这使用了以下事实:Set命令将按字母顺序输出变量。

  • 线24只是定义和不确定我们将要使用的变量。
  • 线56是一条线上的一行,以使其可读性。这将使用文件basenamnam的最后八个字符设置变量,并将整个文件名的值设置。
  • 包含LINE 7以退出脚本,以防万一没有.txt文件的BASENAME结束,并以下划线尺寸结尾,然后在LINE 2的目录集中找到了八个字符。
  • 线8是这里的特殊案例,它以字母顺序输出每个变量和相应的值。输出设置为变量,该变量将覆盖自身直到循环结束。这意味着最新的文件,最后一个字母以最新日期命名的文件的值。
  • 9&10再次是一条线上分为两行,以获得可读性。该循环再次在目录中的所有匹配文件上循环,并使用 Find命令排除输出与变量中符合的文件作为文件最新日期的文件。使用Del命令简单地删除每个文件输出。

请注意,此脚本假设您每个日期只有一个文件,因为您只指出文件是每周生成的。

最新更新