Powershell查找文件夹,删除最新的文件5

时间:2017-09-18 03:30:24

标签: powershell

我们使用名为Revit的软件,文件保存为:filename.rvt

每次用户编辑文件时,Revit都会自行保存旧文件,格式为filename.xxxx.rvt(其中xxx是数字)。

随着文件编辑数百次,我们在文件服务器上有许多不必要的文件。

我正在编写一个脚本:

  • 查找包含Revit备份文件的文件夹
  • 删除除最近修改的5个revit备份文件以外的所有文件

我尝试过以下两种方法

Math.pow

这种方法的问题在于它只会跳过"跳过"整个搜索结果中的前5个文件,而不是每个文件夹中的5个。

然后我使用循环来解决它,而这无处可去:

$searchpath = "e:\"
# Find a unique list of directories that contains a revit backup file (*.*.rvt)
$a = Get-ChildItem -Path $searchpath -Include *.*.rvt -Recurse | Select-object Directory -expandproperty FullName | Get-Unique -AsString

# For each folder that contains a single revit backup file (*.*.rvt)...
# - Sort by modified time
# - Select all except first 5
$a | Get-ChildItem -Include *.*.rvt | Sort-Object LastWriteTime -descending | select-object -skip 5 -property Directory,Name,CreationTime,LastWriteTime | Out-GridView -Title "Old Backups" -PassThru

对正确方法有什么想法,哪些是错误的?

3 个答案:

答案 0 :(得分:1)

尝试这样的事情:

$searchpath = "E:\"
$number = 5

$directories = Get-ChildItem -Path $searchpath -Include *.*.rvt -Recurse | Where-Object {$_.PsIsContainer}
foreach ($dir in $directories) 
{
    $files = Get-ChildItem -Path $dir.FullName | Where-Object {-not $_.PsIsContainer}
    if ($files.Count -gt $number) 
{
  $files | Sort-Object CreationTime | Select-Object -First ($files.Count - $number) | Remove-Item -Force
}
}

相应地更改占位符。我只是给了你合乎逻辑的方法。

答案 1 :(得分:0)

执行所需操作的关键是使用Group-Object cmdlet。

在您的情况下,您要创建的组是包含同一文件夹中所有项目的组。这会给你这样的东西:

Grouped object

从那里,您可以对每个组执行操作,例如选择所有文件,同时跳过每个文件夹的前5个文件并删除其余文件夹。

请参阅这个简单的极简主义示例:

$Path = 'C:\__TMP\1'
$Items = Get-ChildItem -Path "$path\*.rvt" -Recurse | Group-Object -Property PsparentPath

Foreach ($ItemsGroup in $Items) {
    $SortedFiles = $ItemsGroup.Group | sort LastWriteTime -Descending
    $SortedFiles | Select-Object -Skip 5 | % {Write-host "Deleting $($_.FullName)";  Remove-Item $_.FullName}
}

答案 2 :(得分:0)

试试这个:

get-childitem -file -recurse | group Directory | where Count -gt 5 | %{
    $_.Group | Sort LastWriteTime -descending | select -skip 5 Directory,Name,CreationTime,LastWriteTime 
} | Out-GridView -Title "Old Backups"

如果你想删除,你可以这样做(删除如果)

gci -file -recurse | group Directory | where Count -gt 5 | %{
$_.Group | Sort LastWriteTime -descending | select -skip 5 | remove-item -WhatIf 
}