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

Batch file Windows批处理以根据文件名中的时间戳保留最新的N个文件,batch-file,timestamp,filenames,Batch File,Timestamp,Filenames,我需要一个批处理脚本,以根据文件名的时间戳仅保留最新的N个文件,并且仅当大小大于150 KB时(如果大小小于150 KB,则表示备份的文件已损坏,可以删除)。 我发现了类似的脚本,但只适用于Linux 脚本应首先删除大小小于150 KB的所有文件,并使用文件名中的时间戳(而不是文件的修改日期)作为参考保留最新的N个文件 该.txt文件每天修改几次,周末除外。 该文件每天备份几次,并在文件名中添加日期和时间 文件名示例:Test_2019-01-16_21-57-34.txt 路径是:Z:\ 操作

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

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

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

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

路径是:
Z:\


操作系统是Windows 8

此任务可通过以下批处理文件完成:

@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
通过将错误消息从handleSTDERR重定向到deviceNUL来抑制DIR在当前目录中未找到与这些条件匹配的任何目录项时输出的错误消息

阅读Microsoft关于的文章,了解有关
2>nul
的解释。当Windows命令解释器在执行
FOR的命令之前处理此命令行时,重定向操作符必须在上用插入符号^转义,以便命令行被解释为文字字符,该命令行以单独的方式执行嵌入的dir命令行命令进程在后台启动

FOR捕获为处理已启动命令进程的STDOUT而写入的所有内容,并在启动
cmd.exe后逐行处理捕获的输出

FORwith option
/F
忽略在使用DIRwith option
/B
时不会出现的空行

FOR也会忽略以分号开头的行,因为
是默认的行尾字符。文件名可以以分号开头,因此最好使用
eol=|
将行尾字符重新定义为竖线,因为没有文件名可以包含竖线。在这种情况下,
eol=|
是不必要的,因为DIR的输出只是以
Test|开头的文件名,因此默认的
eol=不需要被
eol=|
覆盖

FOR将使用普通空格和水平制表符作为分隔符,将每行拆分为子字符串(标记),并将第一个空格/制表符分隔的字符串分配给指定的循环变量
I
。通过使用
delims=
定义字符串分隔符的空列表,可以禁用此行分割行为<在这种情况下,code>delims=
在这里不是必需的,因为备份文件的文件名不包含空格字符

IF命令将当前文件的大小与值153600(150)进行比较,如果文件大小小于或等于该值,则删除该文件

注意:Windows命令处理器使用有符号32位算术。因此,如果文件超过2147483647字节(2),则此条件处理的文件不正确。如果备份文件可能超过2 GiB,则有必要绕过此有符号32位算术限制

否则,将跳转到大于150 KiB的当前文件上标签
DeleteOldFiles
下的行,退出第一个循环,因为此文件以及该文件之后由DIR输出的所有其他文件的文件大小大于150 KiB

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

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

如果DIR输出五个以上的文件名,则第二个FOR无条件执行的命令DEL将删除早于前五个输出文件名的所有其他文件

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

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

  • del/?
  • dir/?
  • echo/?
  • 获取/?
  • goto/?
  • 如果/?