我们使用名为Revit的软件,文件保存为:filename.rvt
每次用户编辑文件时,Revit都会自行保存旧文件,格式为filename.xxxx.rvt(其中xxx是数字)。
随着文件编辑数百次,我们在文件服务器上有许多不必要的文件。
我正在编写一个脚本:
我尝试过以下两种方法
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
对正确方法有什么想法,哪些是错误的?
答案 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。
在您的情况下,您要创建的组是包含同一文件夹中所有项目的组。这会给你这样的东西:
从那里,您可以对每个组执行操作,例如选择所有文件,同时跳过每个文件夹的前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
}