如何删除指定目录树内除保留列表标注外的全部文件及文件夹?
实现方案
PowerShell 方案(推荐,处理多层嵌套路径更稳定)
操作步骤
- 新建一个文本文件命名为
keep_list.txt,将你需要保留的所有文件的完整绝对路径写入该文件,每行一个路径,示例:
G:\AD\mods\folder1\doc1.txt G:\AD\mods\folder1\subfolder1\doc1.txt G:\AD\mods\folder2\doc1.txt
- 新建
.ps1后缀的PowerShell脚本,写入以下代码:
# 定义待处理的根目录 $rootPath = "G:\AD\mods" # 定义保留列表文件路径 $keepListPath = "G:\path\to\keep_list.txt" # 读取保留列表,统一转换为绝对路径并存入去重集合 $keepFiles = Get-Content $keepListPath | ForEach-Object { [System.IO.Path]::GetFullPath($_.Trim()) } | Where-Object { $_ } | ToHashSet() # 先删除所有不在保留列表中的文件 Get-ChildItem $rootPath -File -Recurse | ForEach-Object { if (-not $keepFiles.Contains($_.FullName)) { Remove-Item $_.FullName -Force # 测试阶段可以注释上面的删除命令,打开下面的输出命令验证要删除的文件是否正确 # Write-Host "待删除文件:$($_.FullName)" } } # 再删除根目录下所有空文件夹 do { $emptyDirs = Get-ChildItem $rootPath -Directory -Recurse | Where-Object { $_.GetFileSystemInfos().Count -eq 0 } if ($emptyDirs) { $emptyDirs | Remove-Item -Force } } while ($emptyDirs)
- 测试阶段建议先注释删除命令,运行脚本确认待删除的文件符合预期后,再打开删除命令执行。
批处理方案
操作步骤
- 同样准备
keep_list.txt,每行放一个要保留的文件的完整绝对路径。 - 新建
.bat后缀的批处理文件,写入以下代码:
@echo off setlocal enabledelayedexpansion :: 定义待处理的根目录 set "rootPath=G:\AD\mods" :: 定义保留列表文件路径 set "keepListPath=G:\path\to\keep_list.txt" :: 先把保留列表路径全部存入临时变量 for /f "usebackq delims=" %%a in ("%keepListPath%") do ( set "p=%%~fa" set "keep_!p:\=/!"=1 ) :: 遍历所有文件,不在保留列表的删除 for /r "%rootPath%" %%f in (*) do ( set "cur=%%~ff" if not defined keep_!cur:\=/! ( del /f /q "%%f" :: 测试阶段可以注释上面的删除命令,打开下面的输出验证 :: echo 待删除文件:%%f ) ) :: 递归删除空文件夹 for /f "delims=" %%d in ('dir /ad /b /s "%rootPath%" ^| sort /r') do ( rd "%%d" 2>nul ) endlocal
注意事项
- 操作前务必提前备份
G:\AD\mods目录下的所有数据,避免误删造成损失 - 首次运行请先注释删除代码,确认待删除的文件/文件夹符合预期后再执行实际删除操作
内容的提问来源于stack exchange,提问作者Jens Petter Røyseth
相关产品推荐
相关产品推荐

