PowerShell删除Archiv目录下嵌套空文件夹代码失效问题咨询
故障原因排查
- 核心问题:遍历Archiv目录下子文件夹时未添加递归参数
原代码中处理逻辑为Get-ChildItem -LiteralPath $dir -Directory -Force,缺少-Recurse参数,仅能获取Archiv目录下的一级子文件夹,无法扫描到嵌套的深层目录(如示例中的文件夹B、C、D、E、H等),因此无法匹配删除这些深层空文件夹。 - 逻辑验证:原代码自带的按路径长度降序排序逻辑无需修改,添加递归参数后会优先处理最深层的目录,删除深层空目录后,上层目录如果变为空,轮到处理上层目录时会自动触发空目录判断逻辑完成删除。
修复后代码
$LogFile = 'C:\Users\User\RemovedEmptyFolders.log' $TopDir = 'C:\Users\User\Test' # 首先获取$TopDir下所有名为Archiv的文件夹完整路径,按路径长度降序排列保证优先处理深层嵌套的Archiv目录 $archiveDirs = (Get-ChildItem -LiteralPath $TopDir -Filter 'Archiv' -Recurse -Directory -Force).FullName | Sort-Object -Property Length -Descending # 逐个处理每个Archiv目录下的空文件夹 $removed = foreach ($dir in $archiveDirs) { # 新增-Recurse参数扫描所有层级子文件夹,按路径长度降序排列优先处理最深层目录 (Get-ChildItem -LiteralPath $dir -Directory -Force -Recurse) | Sort-Object @{Expression = {$_.FullName.Length}} -Descending | ForEach-Object { # 判断文件夹是否为空(包含统计隐藏文件/文件夹) if (@($_.GetFileSystemInfos()).Count -eq 0) { $_.FullName Remove-Item -LiteralPath $_.FullName -Force } } # 处理完成后如果Archiv目录本身为空也同步删除 if (@(Get-ChildItem -LiteralPath $dir -Force).Count -eq 0) { $dir Remove-Item -LiteralPath $dir -Force } } $removed | Set-Content -Path $LogFile -PassThru
内容的提问来源于stack exchange,提问作者Peppino
相关产品推荐
相关产品推荐

