删除早于180天的文件除了根路径中的文件

时间:2014-08-22 18:36:53

标签: windows powershell

我需要能够删除超过180天的子目录中的所有文件(NOT FOLDERS)。唯一的问题是,我不想触摸根路径目录中的任何文件。

所以如果我有路径:S:\ UserData \ User1                        S:\的UserData \用户2                        S:\的UserData \用户3

我想在User1,User2和User3 directorys中删除180天以前的文件。 S:\ UserData中的任何文件我都不想被触及。

我尝试使用FORFILES,但似乎没有排除文件夹的命令。

谢谢!

4 个答案:

答案 0 :(得分:0)

DISM / online / Cleanup-Image / SpSuperseded试试这个:

[int] $AddDays = -180
$directories = gci -path "S:\UserData\" -directory
$directories | % {
        $files = gci -path $_.fullName -file -Recurse | ? { $_.CreationTime -le (Get-Date).AddDays($AddDays) }
        $files | Remove-Item -Force -WhatIf #Note that I added WhatIf here for testing!
    }

答案 1 :(得分:0)

Get-ChildItem接受通配符作为路径的一部分,因此您可以使用它来声明根文件夹并获取其下面的内容。然后你可以使用在哪里跳过目录

gci'c:\ dontexist \ user *'-recurse | ? {-not $ _.psiscontainer}

显然,您需要对此进行彻底测试,并确保在执行任何删除操作之前将其定位到所需的数据。不要忘记大多数你可以在remove-item上使用-whatif参数进行测试。

编辑:不太具体的替代答案

gci 'c:\dontexist\*\*\' -recurse | ? {!$_.psiscontainer -and $_.CreationTime -le (Get-Date).AddDays(-180)} | remove-item -whatif

答案 2 :(得分:0)

您可以对FullName使用简单的RegEx匹配,以确保它在文件和根驱动器之间至少有一个文件夹。抛入!$_.PSIsContainer以确保它不是文件夹,并检查创建日期以确保它足够老,并将其正确移至Remove-Item

$Path = "S:\UserData"
$Path = $Path.TrimEnd("\")
Get-ChildItem $path -recurse| Where{(!$_.PSIsContainer) -and $_.FullName -match "$([regex]::escape($path))\\.+?\\.+" -and $_.CreationDate -le (Get-Date).AddDays(-180)} | Remove-Item

编辑已更新,适用于非根位置的“root”文件夹。

答案 3 :(得分:0)

或试试这个。

$strRootPath = "S:\UserData"
$intMaxFileAge = 180

Foreach ($objFolder in (Get-ChildItem -Path $strRootPath | Where-Object -FilterScript {$_.PsIsContainer -eq $true})) {
    Get-ChildItem -Path $objFolder.FullName -Recurse -Force | Where-Object -FilterScript {$_.PsIsContainer -eq $false} | ForEach-Object {
        If (((Get-Date)-($_.CreationTime)).TotalDays -gt $intMaxFileAge) {
           Remove-Item -Path $.FullName -Force
        }
    }
}