我需要能够删除超过180天的子目录中的所有文件(NOT FOLDERS)。唯一的问题是,我不想触摸根路径目录中的任何文件。
所以如果我有路径:S:\ UserData \ User1 S:\的UserData \用户2 S:\的UserData \用户3
我想在User1,User2和User3 directorys中删除180天以前的文件。 S:\ UserData中的任何文件我都不想被触及。
我尝试使用FORFILES,但似乎没有排除文件夹的命令。
谢谢!
答案 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
}
}
}