Windows批处理根据文件名中的时间戳保留最新的N个文件

时间:2019-02-12 19:58:24

标签: batch-file timestamp filenames

我需要一个批处理脚本,以仅根据文件名中的时间戳记来保留最新的N个文件,并且仅在大小大于150 KB时才保留(如果大小较小,则意味着备份的文件已损坏,可以删除) 。 我发现了类似的脚本,但仅适用于Linux。

该脚本首先应删除所有大小小于150 KB的文件,并保留最新的N个文件,并将文件名中的时间戳记作为参考,而不是文件的修改日期。

此.txt文件每天都会修改几次(周末除外)。 每天备份文件几次,并在文件名中添加日期和时间。

文件名示例:Test_2019-01-16_21-57-34.txt

路径为:Z:\
操作系统为Windows 8

1 个答案:

答案 0 :(得分:2)

可以使用以下批处理文件完成此任务:

@echo off
pushd "Z:\" || goto :EOF
for /F "eol=| delims=" %%I in ('dir /A-D-H /B /OS "Test_*.txt" 2^>nul') do if %%~zI LEQ 153600 (del "%%I") else goto DeleteOldFiles
:DeleteOldFiles
for /F "skip=5 eol=| delims=" %%I in ('dir /A-D-H /B /O-N "Test_*.txt" 2^>nul') do del "%%I"
popd

使用命令 PUSHD 将目录Z:\设置为当前目录,并在失败时以goto :EOF退出批处理文件执行。

下一个命令 FOR 在后台命令行的单独命令进程中以cmd.exe /C(更确切地说为%ComSpec% /C)执行:

dir /A-D-H /B /OS "Test_*.txt" 2>nul

命令 DIR 输出

  • 由于选项/A-D-H而引起的非隐藏文件的名称(属性不是目录,也不是隐藏的)
  • 以纯格式显示,由于选项/B而没有任何其他数据
  • 由于选项/OS,按大小顺序排在最前面,最小文件排在最后,最大文件排在最后。
  • 匹配当前目录中的通配符模式Test_*.txt

通过将错误消息从句柄 STDERR 重定向到设备,可以抑制 DIR 输出的错误消息,该错误消息在当前目录中未找到符合这些条件的目录条目而被抑制NUL

阅读有关Using Command Redirection Operators的Microsoft文章,以获取2>nul的解释。当Windows命令解释器在执行命令之前处理此命令行时,重定向操作符>必须在 FOR 命令行上使用脱字符号^进行转义,才能被解释为文字字符。 FOR ,它将在后台启动的单独命令进程中执行嵌入式dir命令行。

FOR 捕获为处理已启动命令过程的 STDOUT 而编写的所有内容,并在启动cmd.exe自身终止后逐行处理捕获的输出。

带有选项/F

FOR 会忽略在选项<{1}上使用 DIR 时不会出现的空行。

FOR 还将忽略以分号开头的行,因为/B是默认的行尾字符。文件名可以以分号开头,因此最好将;的行末字符重新定义为完全没有文件名的竖线。在这种情况下,eol=|是不必要的,因为 DIR 的输出只是以eol=|开头的文件名,因此默认Test_不需要用覆盖eol=;

FOR 将使用常规空格和水平制表符作为分隔符将每行分成子字符串(令牌),并将仅第一个空格/制表符分隔的字符串分配给指定的循环变量eol=|。通过使用I定义一个空的字符串定界符列表,可以禁用此行拆分行为。在这种情况下,实际上delims=并不是必需的,因为备份文件的文件名不包含空格字符。

IF 命令将当前文件的si z e与值153600(即150 KiB)进行比较,如果文件的大小小于或等于该文件,则将其删除这个值。

注意:Windows命令处理器使用带符号的32位算术。因此,此 IF 条件无法正确处理长度超过2,147,483,647字节(2 GiB)的文件。如果备份文件可以大于2 GiB,则有必要解决这一带符号的32位算术限制。

否则,当前文件大于150 KiB时,跳到标签delims=下面标签DeleteOldFiles下方的行退出第一个循环,因为此文件以及此文件之后 DIR 输出的所有其他文件都具有文件大小大于150 KiB。

第二个 FOR 循环在后台的单独命令过程中再次运行命令 DIR 。但是 DIR 选项/OS/O-N代替,以根据文件名以相反的顺序输出文件名。日期最新的文件名首先由 DIR 输出,名字中最早的文件名最后输出,因为文件名中使用了国际日期格式。

第二个 FOR 命令行另外包含选项skip=5,以跳过前五个文件名,即最新的五个备份文件。

如果 DIR 输出的文件名超过五个,则所有其他比第一个五个输出文件名早的文件将被命令< strong> DEL 由第二个 FOR 无条件执行。

最后,使用 POPD 将初始当前目录再次设置为当前目录。

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

  • del /?
  • dir /?
  • echo /?
  • for /?
  • goto /?
  • if /?
  • popd /?
  • pushd /?

另请参阅:

另一个提示:如果将驱动器号Z:\分配给网络资源,则用UNC路径替换Z:。并确保该批处理文件由具有访问网络资源权限的帐户执行,并且在此批处理文件作为计划任务执行的情况下,该帐户有权删除网络资源上该文件夹中的文件。另请参见What must be taken into account on executing a batch file as scheduled task?