2014-10-28 109 views
0

我有一個腳本,我認爲是工作,但我得到報告,其刪除文件夾,而不是隻是文件。有人可以幫我調整腳本來解決這個問題嗎?我需要添加一個文件過濾器嗎?像你期望它Powershell腳本刪除x天以前的文件,但不是文件夾

$Path = "D:\AppData\Downloads" 

$Limit = (Get-Date).AddDays(-6) 

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

回答

2

你在哪裏,賓語從句是最有可能無法正常工作。

{!$_.PSIsContainer -and $_.CreationTime -lt $Limit } 

應該是

{!$_.PSIsContainer -and ($_.CreationTime -lt $Limit)} 

托架確保第二邏輯比較independantly評價。請參閱about_logical_operators以獲取更多信息

Windows PowerShell邏輯運算符僅評估確定語句真值所需的語句 。如果包含and運算符的語句中的左操作數 爲FALSE,則不評估右操作數 。如果包含 的語句中的左操作數爲真,則不計算右操作數。因此, 您可以按照與If語句使用 相同的方式使用這些語句。

另外,由於它是刪除文件而不是文件夾,Remove-Item-Recurse似乎沒有必要。 來自Alroc的評論:假設你有3版或更高版本的PowerShell,你可以使用Get-ChildItem-File參數來代替Where-Object!$_.PSIsContainer條款(這是版本2中通常做的)的簡化。就像你有你的評論:

Get-ChildItem -path $Path -file -Recurse -force | Where-Object {$_.CreationTime -lt $Limit } 
+1

在v3和更高版本,可以使用'得到-childitem'的'-file'開關,並跳過檢查'$ _ PSIsContainer'在'那裏對象每個對象上。 '。 – alroc 2014-10-28 14:43:44

+0

謝謝Matt和alroc。那麼這看起來更好嗎? Get-ChildItem -path $ Path -file -Recurse -force | Where-Object {$ _。CreationTime -lt $ Limit} | Remove-Item -Force – 2014-10-28 14:52:35

+0

@Powershell_Toddler它_looks_罰款,但你應該先測試它。在測試中刪除'Remove-Item'並檢查你的結果。幹得好! – Matt 2014-10-28 15:01:28

相關問題