使用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" } }