我不想“删除超过 X 天的文件”。如果我想这样做,我会从已经为此目的编写的数千个脚本中挑选一个,我不会费心在 ServerFault 上问这样一个微不足道的问题。
我确实想删除特定文件夹中除了最近的 N 个文件之外的所有文件。
背景:远程系统配置为将定期存档文件转储到 Windows 服务器上的共享中。这些文件的命名约定为 YYYYMMDD-hhmm.ext。如果存档过程失败,我不希望清除脚本仅仅因为文件超过这么多天而删除文件。无法将远程系统配置为在归档过程中清除文件。
因此,例如,当脚本运行时,可能有 10 个文件,可能有 7 个文件,文件夹中可能有 5 个文件。我需要始终至少保留最近的 5 个,无论它们多大。
这可以用 PowerShell 完成吗?
编辑:最好忽略与命名约定不匹配的文件或文件夹。不应删除其他文件和文件夹,也不应混淆脚本(导致保留少于 5 个存档文件)。
用法:yourScript.ps1 -Path path\to\run\against [-NumberToSave N]
我不认为这真的比@John 的更好,我只是为了尝试参数、正则表达式而不是使用循环。进行正则表达式匹配确实有可能排除其他与格式不匹配的 .ext 文件(例如 20130504-1200.txt.ext、20.ext),但它是否适用是值得怀疑的。
我很沮丧地发现如果 $NumberToSave = $items.Count 则需要 if 语句,否则它将不存在。技术上:
工作正常(如果您引用超过数组边界,PowerShell 似乎不会出错,它只是处理并忽略它?)但这似乎可能令人困惑。
一位朋友提供了这个脚本:
这适用于我使用 powershell v5.1
我以前在 Bash 中做过这个,你也许可以将它翻译成 PowerShell。就我个人而言,我是一名 Linux 管理员,我对 Windows/PowerShell 的了解还不够,无法自己这样做。
抱歉,我无法提供更多帮助。
编辑:我也把它放在这里,以防 Linux 管理员需要类似的信息。