2017-02-20 77 views
0

我有一个目录,它包含许多子目录。例如:“\ 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

我不确定我关注。你似乎多次重复相同的代码块! – gvee

回答

1

明显的问题与您的代码:

  1. 缓慢的网络路径的多重枚举
  2. GET-ChildItem生产对象为获取在未来Where丢弃,因为你没有指定-Directory参数的每个文件自从PowerShell 3.0后可用
  3. 还有Get-ChildItem在网络路径上速度慢的已知问题。

更有效的方法是使用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中是更好的选择。