用于删除最旧文件的 Powershell 脚本(与当前日期无关)

Jon*_*n J 5 scripting powershell

不要想“比X天的删除文件。” 如果我想这样做,我只会选择已经为此目的编写的数千个脚本中的一个,而且我不会费心在 ServerFault 上提出这样一个微不足道的问题。

确实想删除特定文件夹中除最近的 N 个文件之外的所有文件。

背景:远程系统配置为将定期存档文件转储到 Windows 服务器上的共享。这些文件的命名约定为 YYYYMMDD-hhmm.ext。如果存档过程失败,我不希望清除脚本仅仅因为文件比这么多天旧而删除文件。无法将远程系统配置为在归档过程中清除文件。

例如,当脚本运行时,文件夹中可能有 10 个文件,可能有 7 个文件,可能有 5 个文件。我需要始终至少保留最近的 5 个,无论它们有多大。

这可以用 PowerShell 完成吗?

编辑:忽略与命名约定不匹配的文件或文件夹是可取的。不应删除其他文件和文件夹,也不应将它们混淆(导致保留的存档文件少于 5 个)。

Jos*_*non 6

用法:yourScript.ps1 -Path path\to\run\against [-NumberToSave N]

param([String]$Path,[Int32]$NumberToSave=5)

$items = Get-ChildItem "$Path\*.ext" |
    Where-Object Name -match "\d\d\d\d\d\d\d\d-\d\d\d\d\.ext" |
    Sort-Object Name -Descending

if ($NumberToSave -lt $items.Count)
{
    $items[$NumberToSave..($items.Count-1)] | Remove-Item
}
Run Code Online (Sandbox Code Playgroud)

我不认为这真的比@John 的好,我只是为了尝试参数、regexp,而不是使用循环。进行正则表达式匹配确实有可能排除其他与格式不匹配的 .ext 文件(例如 20130504-1200.txt.ext、20.ext),但它是否适用值得怀疑。

我很沮丧地发现如果 $NumberToSave = $items.Count 则需要 if 语句,否则它不会存在。技术上:

$items[$numberToSave..$items.Count] | Remove-Item 
Run Code Online (Sandbox Code Playgroud)

工作正常(如果您引用超出数组边界,PowerShell 似乎不会出错,它只是处理并忽略它?)但这似乎可能令人困惑。


joh*_*ohn 5

$n = x

$items = Get-ChildItem path_to_folder\*.ext

$items | 
  Sort-Object Name -Descending | 
  Select-Object -Last ($items.count - $n) | 
  Foreach-Object { Remove-Item $_ }
Run Code Online (Sandbox Code Playgroud)