2017-02-20 66 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中是更好的選擇。