gpt4 book ai didi

batch-file - 如何删除文件夹中最旧的文件?

转载 作者:行者123 更新时间:2023-12-05 00:59:53 25 4
gpt4 key购买 nike

我正在编写一个批处理脚本来备份文件,并希望包含在备份数量超过某个变量设置的特定数量时删除文件夹中最旧文件的逻辑。批处理非常新,我当前的代码一旦超过数量就会删除所有文件。

任何想法如何做到这一点?

SET Count=0
FOR %%A IN ("%SNAPSHOTNAME%*.*") DO SET /A Count += 1
IF %Count% gtr %NumberOfBackups% FOR %%A IN ("%SNAPSHOTNAME%_PBCS_Test_*.*") DO del "%%A"

最佳答案

我建议为此任务使用以下单个命令行:

for /F "skip=%NumberOfBackups% eol=| delims=" %%I in ('dir "%SNAPSHOTNAME%_PBCS_Test_*.*" /A-D-H /B /O-D 2^>nul') do del "%%I"

FOR 在命令行后台以 cmd.exe/C 开始的单独命令进程中执行:

dir "%SNAPSHOTNAME%_PBCS_Test_*.*" /A-D-H /B /O-D 2>nul

DIR 输出以逐行处理STDOUT

  • 只是非隐藏文件,因为 /A-D-H(不是属性目录或隐藏)
  • 由于 /B 仅表示文件名,因此采用裸格式
  • 按最后修改(写入)时间排序,最新文件在前,最旧文件在后。

DIR 输出的用于处理 STDERR 的错误消息通过使用 2>nul NUL 被抑制.

另请阅读有关 Using Command Redirection Operators 的 Microsoft 文章2>nul 的解释。重定向运算符 > 必须在 FOR 命令行上使用脱字符 ^ 转义,以便在 Windows 命令解释器处理此命令行时被解释为文字字符在执行命令 FOR 之前,该命令使用在后台启动的单独命令进程来执行嵌入式 dir 命令行。

FOR 捕获此输出并根据双引号字符串中指定的选项逐行处理它,忽略 DIR 的此输出中不存在的空行.

%NumberOfBackups% 行被 FOR 跳过,这意味着最新的 %NumberOfBackups% 始终保存在当前目录中。

FOR 默认也会忽略以分号开头的行,因为 ; 是行尾字符的默认值。因此,eol=| 用于将行尾字符更改为竖线,这在文件或文件夹名称中是不可能的,因此 DIR< 输出的文件名是不可能的/strong> 以 | 开头。

FOR 默认使用普通空格和水平制表符作为字符串分隔符将一行拆分为子字符串,并将第一个空格/制表符分隔的字符串分配给循环变量 I。可以通过在选项字符串末尾使用 delims= 指定一个空的分隔符列表来禁用此字符串拆分行为,以将整行(= 文件名)分配给循环变量 I

所以 DIR 输出与模式 "%SNAPSHOTNAME%_PBCS_Test_*.*" 匹配的所有非隐藏文件的名称,最新文件在前,最旧文件在后FOR 忽略第一个/最新的 %NumberOfBackups% 文件并删除所有其他较旧的文件。

如果 DIR 输出较少或完全输出 %NumberOfBackups% 文件名,则

FOR 不执行任何操作。

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

  • del/?
  • 目录/?
  • for/?

注意:这与 Squashman 所写的答案几乎相同。 ,但有完整的解释它是如何工作的。

关于batch-file - 如何删除文件夹中最旧的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51733826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com