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