使用Powershell删除30天以上的文件

时间:2017-03-17 12:34:12

标签: powershell

我正在尝试删除目录中的所有文件以及其子目录中超过30天的所有文件,并保留所有文件夹。这个问题似乎已被要求在网上死亡,我有这个解决方案,我从Stackoverflow获得:

$limit = (Get-Date).AddDays(-30)
$path = "path-to"

# Delete files older than the $limit.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force

现在这个有效,但事实并非如此。 当我在某些目录上尝试这个时,它工作正常并正常退出。但是当我在其他人身上尝试时,我得到了这个错误:

Get-ChildItem : The given path's format is not supported.
At C:path-to-whatever\ClearFiles.ps1:5 char:1
+ Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsCo ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Get-ChildItem], NotSupportedException
    + FullyQualifiedErrorId : System.NotSupportedException,Microsoft.PowerShell.Commands.GetChildItemCommand

我认为这是因为$._CreationTime中的时间格式,我试图删除它但是当我这样做时不断询问我是否真的要删除以下文件,因为我没有指定递归参数,我在一开始就有。

有人可以解决这个问题吗?也许解释为什么它适用于某些目录而不是其他目录。

干杯

1 个答案:

答案 0 :(得分:0)

我无法使用以下代码重现您的问题,但我将解释我是如何使用一些错误处理方法完成的。

让我们首先比较两个变量。

$_.LastWriteTime =上次写入文件的时间。 $_.CreationTime =创建文件的时间或复制并粘贴。

使用Out-GridView语句添加Select将为我们提供该路径上的文件列表。我添加了Name,Attributes,CreationTime,LastWriteTime和Fullname。

Get-ChildItem -Path $path -Recurse -Force | Where-Object { $_.CreationTime -lt $Date } | Select Name, Attributes, CreationTime, LastWriteTime, Fullname | Out-GridView

如果以管理员身份运行,您可以看到更多文件。某些隐藏目录需要以管理员身份运行。

Remove-Item有一个非常好的-WhatIf选项。如果我们决定删除文件夹和文件怎么办? WhatIf选项不会删除,但会显示已删除的内容。非常适合测试。

Get-ChildItem -Path $path -Recurse  | Where-Object { $_.CreationTime -lt $Date } | Remove-Item -Recurse -whatif

让我们把它放到一个有效的函数中并进行一些错误处理:

Function Remove_FilesCreatedBeforeDate{
$Path="F:\ISO\"
$Date=(Get-Date).AddDays(-30)
$ValidPath = Test-Path $Path -IsValid
If ($ValidPath -eq $True) {
Write-Host "Path is OK and Cleanup is now running"
#Get-ChildItem -Path $path -Recurse | Where-Object { $_.CreationTime -lt $Date } | Select Name, Attributes, CreationTime, LastWriteTime, Fullname | Out-GridView
#Get-ChildItem -Path $path -Recurse | Where-Object { $_.CreationTime -lt $Date } | Remove-Item -Recurse -whatif
Get-ChildItem -Path $path -Recurse  | Where-Object { $_.CreationTime -lt $Date } #| Remove-Item -Recurse -Verbose
}
Else {Write-Host "Path is not a ValidPath"}
}
    Remove_FilesCreatedBeforeDate

当您要删除文件夹结构时,您只能看到警告\确认菜单。很多人都不理解的是-Force选项只删除隐藏文件和只读文件。我们将希望使用-Recurse选项来避免此提示,但请注意它将删除所有内容。

出于安全原因,我已将删除项目注释掉了。 #| Remove-Item -Recurse -Verbose

这适用于$Path\\SERVER\$C\Directory\C:\Directory\个选项。如果您对此功能有任何疑问,请与我们联系。