PowerShell中的Get-ChildItem -Recurse当前以级别顺序方式遍历目录。有没有办法在Powershell中以后序方式遍历目录?
我正在尝试删除早于某些时间的文件。删除文件后,如果子文件夹为空,则也删除该文件夹。现在正在这样做。
$path = 'D:\Files'
Get-ChildItem -Path $path -Recurse | Where-Object {
(($_.LastWriteTime -lt (Get-Date).AddDays(-30)) -and ($_ -is [system.io.fileinfo]) )
} | Remove-Item
Get-ChildItem -Path $path -Recurse | Where-Object {
($_ -is [System.IO.DirectoryInfo]) -and $_.CreationTime -lt (Get-Date).AddDays(-30) -and ((Get-ChildItem $_.FullName).Count -eq 0)
} | Remove-Item -Force
但是我想用一个命令来完成。不能作为两个不同的命令。
答案 0 :(得分:5)
您可以用Get-ChildItem
颠倒[Array]::Reverse
返回的项目的顺序
完整脚本:
$items = Get-ChildItem 'D:\Files' -Recurse
[Array]::Reverse($items)
$date = (Get-Date).AddDays(-30)
foreach ($item in $items) {
if ($item.PSIsContainer) {
if ($item.CreationTime -lt $date -and (Get-ChildItem $item.FullName).Count -eq 0) {
Remove-Item $item.FullName
}
}
elseif ($item.LastWriteTime -lt $date) {
Remove-Item $item.FullName
}
}
答案 1 :(得分:0)
我无法使用 GCI 使 post order 正常工作,有人声称应该这样做,但它没有先遍历深度。下面是使用 push directory 和 pop directory 命令的经典后序算法的简单实现。将您的“操作”放在 Write-Host 所在的位置。
function PostOrder($d){
pushd $d
$folders = Get-ChildItem .\ -Directory -Force
foreach ($folder in $folders){
PostOrder($folder)
}
popd
Write-Host $d.FullName
}
PostOrder("C:\myFolder")