我需要一个批处理脚本,以仅根据文件名中的时间戳记来保留最新的N个文件,并且仅在大小大于150 KB时才保留(如果大小较小,则意味着备份的文件已损坏,可以删除) 。 我发现了类似的脚本,但仅适用于Linux。
该脚本首先应删除所有大小小于150 KB的文件,并保留最新的N个文件,并将文件名中的时间戳记作为参考,而不是文件的修改日期。
此.txt文件每天都会修改几次(周末除外)。 每天备份文件几次,并在文件名中添加日期和时间。
文件名示例:Test_2019-01-16_21-57-34.txt
路径为:Z:\
操作系统为Windows 8
答案 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?