使用PowerShell删除超过15天的文件

我想只删除15天前在特定文件夹中创build的文件。 我怎样才能使用PowerShell?

给定的答案只会删除文件(这确实是在这篇文章的标题),但是这里有一些代码将首先删除所有超过15天的文件,然后recursion删除任何可能已经剩下的空目录背后。 我的代码也使用-Force选项来删除隐藏和只读文件。 另外,我select不使用别名,因为OP是PowerShell的新function,可能不理解什么gci%等等。

 $limit = (Get-Date).AddDays(-15) $path = "C:\Some\Path" # Delete files older than the $limit. Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force # Delete any empty directories left behind after deleting the old files. Get-ChildItem -Path $path -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse 

当然,如果您想在删除文件/文件夹之前查看要删除的文件/文件夹,只需在两行的末尾添加-WhatIf开关到Remove-Item cmdlet调用即可。

此处显示的代码与PowerShell v2.0兼容,但我也将这些代码和更快的PowerShell v3.0代码显示为我的博客上方便的可重用函数 。

另一种方法是从当前date减去15天,并将CreationTime与该值进行比较:

 $root = 'C:\root\folder' $limit = (Get-Date).AddDays(-15) Get-ChildItem $root -Recurse | ? { -not $_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item 

基本上,您可以遍历给定path下的文件,从当前时间中减去find的每个文件的CreationTime时间,然后与结果的Days属性进行比较。 -WhatIf开关会告诉你,如果没有真正删除文件(哪些文件将被删除)会发生什么情况,请删除开关以实际删除文件:

 $old = 15 $now = Get-Date Get-ChildItem $path -Recurse | Where-Object {-not $_.PSIsContainer -and $now.Subtract($_.CreationTime).Days -gt $old } | Remove-Item -WhatIf 

只是简单的(PowerShell V5)

 Get-ChildItem -Path "C:\temp" -Recurse -File | Where CreationTime -lt (Get-Date).AddDays(-15) | Remove-Item -Force 

尝试这个:

 dir C:\PURGE -recurse | where { ((get-date)-$_.creationTime).days -gt 15 } | remove-item -force 
 $limit = (Get-Date).AddDays(-15) $path = "C:\Some\Path" # Delete files older than the $limit. Get-ChildItem -Path $path -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force -Recurse 

这将删除旧的文件夹和它的内容。

另一个select(15.自动键入[timespan]):

 ls -file | where { (get-date) - $_.creationtime -gt 15. } | Remove-Item -Verbose 

Esperento57的脚本在旧的PowerShell版本中不起作用。 这个例子确实:

 Get-ChildItem -Path "C:\temp" -Recurse -force -ErrorAction SilentlyContinue | where {$_.LastwriteTime -lt (Get-Date).AddDays(-15) } | Remove-Item -Verbose -Force -Recurse -ErrorAction SilentlyContinue 
 #----- Define parameters -----# #----- Get current date ----# $Now = Get-Date $Days = "15" #----- define amount of days ----# $Targetfolder = "C:\Logs" #----- define folder where files are located ----# $Extension = "*.log" #----- define extension ----# $Lastwrite = $Now.AddDays(-$Days) #----- Get files based on lastwrite filter and specified folder ---# $Files = Get-Children $Targetfolder -include $Extension -Recurse | where {$_.LastwriteTime -le "$Lastwrite"} foreach ($File in $Files) { if ($File -ne $Null) { write-host "Deleting File $File" backgroundcolor "DarkRed" Remove-item $File.Fullname | out-null } else write-host "No more files to delete" -forgroundcolor "Green" } }