我有一个目录,它包含许多子目录。例如:“\ IP \ Share \ Directory \ Machine \ Year \ Month \ Date \ Image_ID”
问题是此目录存储图像,我需要删除任何存储时间超过730天的图像。问题是“Image_ID”文件夹上有数百个图像。有时您最多可以创建100个“Image_ID”文件夹。我需要创建一个PowerShell脚本来搜索目录创建日期,排序并将目录壁橱移除到早于730天创建的“IP地址”(不是图像/文件,因为这个过程可能需要一整天)。
这是一项日常任务,我需要尽量减少任务的持续时间。所以我想找到目录日期,而不是文件日期。
这是我正在使用的脚本,对我有用。但它需要很长时间才能完成,它只需多次运行相同的删除行来删除子目录文件夹:
Param (
[string]$Source = "\IP\Share\Directory\Machine\Year\Month\Date\Image ID",
[string]$Days = "730"
)
$Folder = Get-ChildItem $Source -Recurse | Where-Object { !$_.PSIsContainer -and $_.LastWriteTime -le (get-date).adddays(-$($Days)) }
$Folder | Remove-Item -Force
$Folder = Get-ChildItem $source -Recurse -Force | Where {$_.PSIsContainer} | Sort-Object FullName -Descending | Where {!(Get-ChildItem $_.FullName -Force)}
$Folder | Remove-Item -Force
$Folder = Get-ChildItem $source -Recurse -Force | Where {$_.PSIsContainer} | Sort-Object FullName -Descending | Where {!(Get-ChildItem $_.FullName -Force)}
$Folder | Remove-Item -Force
$Folder = Get-ChildItem $source -Recurse -Force | Where {$_.PSIsContainer} | Sort-Object FullName -Descending | Where {!(Get-ChildItem $_.FullName -Force)}
$Folder | Remove-Item -Force
$Folder = Get-ChildItem $source -Recurse -Force | Where {$_.PSIsContainer} | Sort-Object FullName -Descending | Where {!(Get-ChildItem $_.FullName -Force)}
$Folder | Remove-Item -Force
stop-process -Id $PID
}
如果我没有正确解释,我会尽力澄清。我是PowerShell的新手,这个脚本是我工作的多个组合。
答案 0 :(得分:1)
您的代码存在明显问题:
Where
中被丢弃的每个文件生成对象,因为自PowerShell 3.0以来您没有指定-Directory
参数更有效的方法是使用IO.DirectoryInfo.GetDirectories,因此整个代码将是:
$DateCutOff = (Get-Date).AddDays(-$Days)
([IO.DirectoryInfo]$Source).GetDirectories('*', [IO.SearchOption]::AllDirectories) |
Where { $_.LastWriteTime -le $DateCutOff } |
ForEach { $_.Delete($true) } # recursively delete all subdirectories
在ForEach块中使用$_.FullName
测试此代码,以便先查看列表并检查它是否正常。
P.S。在.NET 4和更新的IO.DirectoryInfo.EnumerateDirectories中是更好的选择。