如何调整PowerShell脚本以查找指定名称的空文件夹及子文件夹、删除它们并导出结果至CSV
解决方案
咱们一步步来调整你的脚本,完美实现你要的两个功能,还能导出CSV:
1. 修正文件夹筛选逻辑
你的原代码是先找所有空文件夹再挑名字是Archiv的,咱们换个更精准高效的顺序:先递归找出所有名叫Archiv的文件夹,再检查它们是不是空的。这样既能确保找到所有层级的目标文件夹,也不会做多余的判断。
调整后的获取列表代码:
$TopDir = 'C:\Users\User\Test' $DirToFind = 'Archiv' # 递归找所有名为"Archiv"的空文件夹 $EmptyDirList = Get-ChildItem -LiteralPath $TopDir -Directory -Recurse | Where-Object { $_.Name -eq $DirToFind -and # 先精准匹配文件夹名,要模糊匹配就换回-match $_.GetFileSystemInfos().Count -eq 0 # 检查文件夹内是否完全没有文件/子文件夹 } | Select-Object -ExpandProperty FullName
这里把-match改成-eq是为了精准匹配(避免误抓到叫ArchivBackup这类的文件夹),如果你确实需要模糊匹配,再改回-match就行。
2. 导出结果到CSV
用Export-Csv把找到的文件夹列表导出到指定路径,记得加-NoTypeInformation去掉多余的类型头,再加-Encoding UTF8避免乱码:
# 导出到CSV文件,路径你可以自己改 $EmptyDirList | Export-Csv -Path 'C:\Users\User\Documents\EmptyArchivFolders.csv' -NoTypeInformation -Encoding UTF8
3. 删除空文件夹
确认列表没问题后,咱们循环删除这些空文件夹。先加-WhatIf参数预览操作,确认没问题再去掉它执行实际删除:
# 先预览删除操作,确认后移除-WhatIf foreach ($dir in $EmptyDirList) { Remove-Item -LiteralPath $dir -Force -WhatIf }
-Force是为了确保能删除那些标记为只读的空文件夹,避免报错。
整合后的完整脚本
把上面的步骤拼起来,就是完整的可运行脚本,还加了一些友好的提示:
$TopDir = 'C:\Users\User\Test' $DirToFind = 'Archiv' $CsvOutputPath = 'C:\Users\User\Documents\EmptyArchivFolders.csv' # 获取目标空文件夹列表 $EmptyDirList = Get-ChildItem -LiteralPath $TopDir -Directory -Recurse | Where-Object { $_.Name -eq $DirToFind -and $_.GetFileSystemInfos().Count -eq 0 } | Select-Object -ExpandProperty FullName # 控制台输出+导出CSV Write-Host "找到以下空的Archiv文件夹:" $EmptyDirList $EmptyDirList | Export-Csv -Path $CsvOutputPath -NoTypeInformation -Encoding UTF8 Write-Host "结果已经导出到:$CsvOutputPath" # 执行删除(先预览,确认后删去-WhatIf) if ($EmptyDirList.Count -gt 0) { Write-Host "准备删除这些文件夹..." foreach ($dir in $EmptyDirList) { Remove-Item -LiteralPath $dir -Force -WhatIf } } else { Write-Host "没找到符合条件的空文件夹哦~" }
小说明
- 为啥原代码可能漏检?其实逻辑上没大问题,但先找空文件夹再筛名字会做很多无用判断,而且
-match如果没注意的话可能匹配到非精准名称的文件夹,换成-eq更稳妥。 - 空文件夹检测的可靠性:
$_.GetFileSystemInfos().Count -eq 0会检查文件夹里的所有文件和子文件夹,确保是真的空,比只查文件或只查子文件夹靠谱。
内容的提问来源于stack exchange,提问作者Peppino
相关产品推荐
相关产品推荐

