2016-09-19 91 views
3

我試圖刪除給定文件夾的子文件夾中的所有文件,而不刪除子文件夾本身。我嘗試了各種例子,但他們沒有做到我期望的。在x天以前的子文件夾中刪除文件

文件樹,我試圖通過談判的基本結構是:

C:\Backups\Subfolder1 
C:\Backups\Subfolder2 
C:\Backups\Subfolder3

,我使用下面的代碼:

$limit = (Get-Date).AddDays(-14) 
$path = "C:\Backups" 

Get-ChildItem -Path $path -Recurse -Force | 
    Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | 
    Remove-Item -WhatIf 

我發現,在子目錄中的文件即使使用-Recurse標誌,也會被忽略,儘管C:\ Backups目錄中的任何文件都包含在內。如果我刪除!$_.PSIsContainer子句,則包含子文件夾中的文件,但所有這些目錄也是如此。

任何人都可以告訴我如何將文件包含在子文件夾中,同時仍然忽略子文件夾本身?

+3

我沒有看到你的代碼中的錯誤,這應該工作......你知道,你是使用'-WhatIf'標誌並且沒有文件被實際刪除? –

+0

是的,我知道這一點。在這個階段,我只驗證哪些文件正在被刪除。 – Duncan

+0

將lt更改爲gt後,因爲無法使用兩週前創建的文件重新創建,所以對我也有效'如果執行操作「刪除文件」上的目標「C:\ Backups \ Subfolder1 \ Test.txt「.' – BenH

回答

0
$limit = (Get-Date).AddDays(-14) 
$files = Get-ChildItem -Path C:\Backups -Directory:$false -Recurse 
$files | ForEach-Object -Process { 
    if($_.CreationTime -lt $limit) 
    { 
    Remove-Item $_.FullName -Force 
    } 
} 

-Directory:$False參數意味着你不必擔心刪除任何目錄,因爲它們將不包括在數組中。

+0

-Directory:$ False參數意味着您不必擔心刪除任何目錄,因爲它們不會包含在數組中。 –

+0

您應該添加,作爲您的答案的編輯,因爲評論並不總是閱讀,並不保證被保留。另外你的答案可能會更有用一點更多的解釋。 –

+0

我對這種方法沒有好運,目錄仍然包含在內。然而,進一步的研究已經引導我:'code'$ files2 = Get-ChildItem -Path $ path -Recurse -Attributes!D這實現了我忽略目錄的目標。 – Duncan

0

以下代碼適用於我。您是否使用較舊版本的PowerShell?

$limit = (Get-Date).AddDays(-14) 
$path = "C:\Users\nathan.cooper\Documents" 
Get-ChildItem -Path $path -Recurse -Force | 
    where { (! $_.PSIsContainer) -and ($_.LastWriteTime -lt $limit) } | 
    Remove-Item -whatif 
1

如果您在使用PowerShell 3.0,你可以簡單地使用-File開關:

$limit = (Get-Date).AddDays(-14) 
$path = "C:\Backups" 
Get-ChildItem -Path $path -File -Recurse | where { $_.LastWriteTime -lt $limit } | Remove-Item 
+0

這可以被接受爲答案。 – DtechNet

相關問題