尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

批量删除文件夹名关键字:CMD、PowerShell、Python三方案对比与实践

批量删除文件夹名关键字:CMD、PowerShell、Python三方案对比与实践 接手一个老项目的文件库或者刚下载完一批整理好的素材包时你很可能见过这种场面几十个文件夹的名字里统一带着“【最终版】”、“-官方版”、“-网盘下载”这类关键字。它们不影响文件内容却让目录列表显得凌乱归档时也难以批量识别。你试过手动重命名复制一个文件夹右键、重命名、删除关键字、回车一个文件夹至少 3 步100 个文件夹就是 300 步重复劳动。批量删除多个文件夹名中的关键字看起来是个小需求但真正动手时会发现三件事比“删除”本身更关键第一规则是否足够精确会不会误伤不该改的目录第二误操作之后能不能恢复重命名是就地操作没有自动撤销第三放在不同电脑上能不能跑起来中文编码、系统权限、工具依赖都可能让脚本失效。这篇文章会围绕这三点展开提供三套可以直接复制的方案Windows 批处理、PowerShell、Python 脚本。读完你不仅能立刻用上还能知道每种方案适合什么场景、哪些坑是新手最容易踩的。1. 什么时候需要批量删除文件夹名中的关键字先说清楚需求。批量删除文件夹名关键字并不是日常高频操作但一旦遇到数据量往往很大手动处理的成本会指数级上升。场景一整理从网上下载的资源包。很多下载站、网盘转存工具会给文件夹名追加推广词或说明文字比如“PDF合集【已验证】”、“软件工具包-网盘下载”、“电子书库-官方原版”。这类文件夹名里的“【已验证】”“-网盘下载”对内容本身没有意义归档时反而干扰检索。你希望把它们统一去掉让目录变成干净的“PDF合集”、“软件工具包”、“电子书库”。场景二工程输出目录规范化。自动化测试、构建脚本、数据导出任务常常生成带时间戳或构建号的文件夹例如“report_20240115_1430”、“build_v1.2.3”、“backup_20231201”。如果需求要求归档目录不带这些动态后缀保留统一的业务名称就需要批量清理。这类目录数量多、命名规律接近非常适合脚本处理。场景三跨系统迁移带来的命名不兼容。从旧的 CMS、网盘、NAS 导出的目录可能统一带固定前缀“【旧系统】资料库_项目A”迁移到新系统后新系统的命名规范又要求去掉这个前缀。如果不批量处理就只能捏着鼻子手动改几百个目录名。这三个场景有一个共同点规则高度统一变化只是“去掉某个固定关键字”。这种情况下脚本的价值不是“省一次右键”而是用几分钟完成原本几小时的手工工作。需要说明的是这类操作并不适合 AI 或复杂自动化工具介入普通脚本就能稳定完成要求的只是“先确认规则、再执行重命名”。2. 批量重命名的核心思路与三种方案选型不管是 CMD、PowerShell 还是 Python批量重命名文件夹名的底层逻辑完全一样都是四步定位目录明确要处理哪个根目录下的文件夹。筛选匹配判断文件夹名中是否包含指定关键字。构造新名字将关键字替换为空字符串得到新名称。执行重命名调用系统重命名接口完成操作。四个步骤中最容易出问题的不是“执行重命名”而是“筛选匹配”和“构造新名字”。筛选条件太宽就会误伤关键字含特殊字符构造新名字时就会出错。这也是下面三种方案各自要处理的核心差异点。方案是否需要安装正则支持跨平台适合场景CMD 批处理否Windows 自带不支持只能固定字符串替换仅 Windows临时清理、单次操作、要求零依赖PowerShellWindows 自带支持-replace 使用正则Windows 全系也可跨平台运行规则复杂、需要正则匹配、系统管理员环境Python需要 Python 环境支持string.replace 与 re 模块Windows / Linux / macOS长期维护、需要日志、后续要做自动化流水线选型判断很简单。如果你的需求是“把某个固定关键字删掉跑完就完事”CMD 批处理最合适因为任何 Windows 电脑都能直接双击运行不需要考虑执行策略和第三方依赖。如果需求复杂一些比如要同时删掉几个关键字、要按某种模式匹配PowerShell 更合适它的-replace支持正则能处理很多“看起来差不多但又不完全一样”的目录名。如果这个脚本未来要嵌入更大的工具链、要跨平台执行、要保留完整操作日志那就直接用 Python标准库就能完成不依赖第三方包。我的建议是不要一上来就选最复杂的工具。先评估数据量、规则特点、脚本复用频率再做决定。很多人一碰到“批量”两个字就急着写 Python但实际上 Windows 自带能力已经能覆盖 80% 的临时需求。3. 环境准备与前置检查本文演示环境是 Windows 10 / Windows 11CMD、PowerShell 为系统自带Python 版本需要 3.6 及以上本文脚本只使用os标准库。如果你所在环境版本较新请以实际项目为准本文重点演示通用思路。先准备一个测试目录结构方便验证脚本效果。新建D:\TestDir里面放几个待处理文件夹mkdir D:\TestDir mkdir D:\TestDir\项目文档【最终版】 mkdir D:\TestDir\源代码【最终版】 mkdir D:\TestDir\设计稿【最终版】 mkdir D:\TestDir\素材包-网盘下载 mkdir D:\TestDir\安装包-官方版 mkdir D:\TestDir\普通目录A mkdir D:\TestDir\普通目录B注意CMD 中目录名含空格或特殊符号时路径要用双引号包裹否则mkdir会把它拆成多个参数。运行前还要做一次前置检查这一步比敲代码更重要确认关键字足够精确。比如“最终版”这个关键字会不会把“最终版权说明”这种合法目录也改了如果会就要把关键字加长比如改成“【最终版】”。备份目录清单。重命名没有自动撤销处理前先导出一份目录列表万一误操作可以对照原列表手动恢复。先在测试目录验证。生产环境的数据量再大也应该先在一个只包含几条测试目录的路径上跑通脚本确认输出符合预期后再改成真实路径执行。备份目录清单可以用 PowerShell 一行命令完成Get-ChildItem D:\TestDir -Directory | Select-Object Name | Export-Csv D:\backup_dir_list.csv -NoTypeInformation -Encoding UTF8这个命令会把D:\TestDir下所有文件夹名称导出到 CSV 文件。后续如果发现问题可以根据这份清单逐个核对。4. 方案一CMD 批处理实现零依赖双击就能跑CMD 批处理的运行原理是用for /d遍历指定目录下的所有文件夹把文件夹名存进变量通过变量字符串替换生成新名字最后用ren命令完成重命名。新建一个文本文件命名为delete_keyword.bat写入以下内容echo off setlocal enabledelayedexpansion rem 基础配置按需修改 set KEYWORD【最终版】 set TARGET_DIRD:\TestDir rem 遍历并处理 for /d %%d in (%TARGET_DIR%\*) do ( set folderName%%~nxd set newName!folderName:%KEYWORD%! if not !folderName!!newName! ( ren %%d !newName! if !errorlevel! equ 0 ( echo 已重命名: !folderName! --^ !newName! ) else ( echo 重命名失败: !folderName! ) ) ) echo 处理完成。 pause这段脚本有 5 个关键点也是新手最常踩的坑。第一setlocal enabledelayedexpansion开启延迟变量展开。这是必须的。在 CMD 的for循环中如果直接用%folderName%读取变量拿到的是循环开始前的旧值结果会完全错乱。改成!folderName!才能读取到当前循环里的最新值。第二%%~nxd用于获取文件夹的完整名称。在for /d遍历目录时%%d保存的是完整路径比如D:\TestDir\项目文档【最终版】而%%~nxd只保留最后的文件夹名也就是项目文档【最终版】。这里要注意如果文件夹名带点号比如v1.2.3%%~nxd仍能返回完整名称但某些旧版 Windows 上的行为可能有细微差异遇到带点目录名时要先做一次小规模测试。第三!folderName:%KEYWORD%!是 CMD 的变量字符串替换语法含义是把folderName中所有KEYWORD替换为空字符串。替换效果等同于“删除关键字”。第四if not !folderName!!newName!判断新旧名称是否不同。只有包含关键字的文件夹才会进入重命名逻辑普通目录会被自动跳过这样执行日志更干净。第五ren %%d !newName!的第一个参数是当前文件夹的完整路径第二个参数必须是纯文件夹名不能带路径。ren的常见错误就是第二个参数写成完整路径导致“参数格式不正确”。运行方式有两种在文件资源管理器中双击delete_keyword.bat或者在 CMD 窗口中执行cd /d D:\ delete_keyword.bat这里必须强调编码问题。批处理文件包含中文关键字时必须保存为 ANSI 或 GBK 编码不能保存为 UTF-8。Windows 自带记事本默认在旧系统上是 ANSI但在较新系统上默认可能是 UTF-8这会直接导致中文关键字变乱码、脚本匹配不到任何目录。解决办法是用记事本打开文件后选择“文件 - 另存为”编码选择“ANSI”。如果一次要删除多个关键字可以在循环里连续做多次替换。修改方法是在set newName...后面追加set newName!folderName:%KEYWORD1%! set newName!newName:%KEYWORD2%! set newName!newName:%KEYWORD3%!前面先定义KEYWORD1、KEYWORD2、KEYWORD3后面依次替换。这种写法只适合关键字数量少的情况如果超过四五个建议直接用下面的 PowerShell 方案。CMD 方案的局限性也很明显不支持正则关键字必须是精确字符串特殊字符如%、!、混入变量名时会导致替换和展开结果异常没有日志文件只有屏幕输出。它适合“临时跑一次跑完就扔”的场景。5. 方案二PowerShell 实现支持正则适合复杂规则PowerShell 的核心思路和 CMD 完全一样但语法更简洁而且可以用正则处理“看起来差不多”的目录名。基础版本使用Get-ChildItem获取目录列表用Where-Object筛选名称包含关键字的文件夹用Rename-Item完成重命名。先看基础脚本rename_folder.ps1# 批量删除文件夹名关键字 - 基础脚本 $keyword 【最终版】 $targetDir D:\TestDir Get-ChildItem -Path $targetDir -Directory | Where-Object { $_.Name -like *$keyword* } | ForEach-Object { $newName $_.Name.Replace($keyword, ) Rename-Item -Path $_.FullName -NewName $newName Write-Host 已重命名: $($_.Name) - $newName }逐行拆解一下。Get-ChildItem -Path $targetDir -Directory只列出目标目录下的文件夹不包含文件这一步很关键避免误操作文件。Where-Object { $_.Name -like *$keyword* }用通配符匹配判断名称中是否包含关键字$_表示管道中当前传入的每一个目录对象。$_.Name.Replace($keyword, )是普通字符串替换把关键字替换为空字符串得到新名称。Rename-Item -Path $_.FullName -NewName $newName执行重命名FullName是完整路径NewName只要提供新文件夹名就够了。如果你需要一次删除多个关键字或者按模式删除可以改用正则版本$targetDir D:\TestDir $patterns (【最终版】, -官方版, -网盘下载) Get-ChildItem -Path $targetDir -Directory | ForEach-Object { $newName $_.Name foreach ($pattern in $patterns) { $newName $newName -replace [regex]::Escape($pattern), } if ($newName -ne $_.Name) { Rename-Item -Path $_.FullName -NewName $newName Write-Host 已重命名: $($_.Name) - $newName } }这个版本有三个重要细节。第一-replace操作符右侧是正则表达式如果关键字本身包含[、(、*这类特殊字符会被正则引擎解释成特殊语法导致匹配不到或匹配错。所以代码里用[regex]::Escape($pattern)把关键字转义成普通字符串这一步不能省。第二foreach ($pattern in $patterns)循环逐个删除关键字先把$newName初始化为原始目录名每轮替换掉一个关键字循环结束后得到最终名称。第三if ($newName -ne $_.Name)同样是为了跳过不含任何关键字的目录避免执行无意义的Rename-Item。PowerShell 还有两个开箱即用的安全特性值得利用。一是-WhatIf参数执行Rename-Item时加上它不会真的重命名只会输出“如果执行会改成什么”适合先做干跑预览Rename-Item -Path $_.FullName -NewName $newName -WhatIf二是执行策略。默认情况下部分 Windows 环境会阻止运行.ps1脚本提示“禁止运行脚本”。解决方式不需要改系统全局策略推荐使用 Process 级别临时放开Set-ExecutionPolicy -Scope Process Bypass或者在 CMD 中直接带参数执行脚本powershell -NoProfile -ExecutionPolicy Bypass -File .\rename_folder.ps1这里要提一个 PowerShll 特有的中文编码坑脚本文件含中文时建议保存为 UTF-8 with BOM。Windows PowerShell 5.1 默认按系统 ANSI 编码读取没有 BOM 的 UTF-8 文件可能导致中文字符串变成乱码。如果打开脚本时中文显示不正常优先检查编码格式。PowerShell 方案的优点是逻辑清晰、表达能力强支持直接调用 .NET API适合系统管理员或经常需要写 Windows 自动化脚本的人。6. 方案三Python 脚本实现跨平台、逻辑最灵活Python 方案适合三种情况脚本要嵌入更大的自动化流程、脚本需要在 Windows 和 Linux 之间复用、或者你需要完整的日志文件来追踪操作记录。环境要求只是 Python 3.6 及以上不需要安装任何第三方库只使用标准库os。先看最基础的版本rename_folders.pyimport os keyword 【最终版】 target_dir rD:\TestDir for folder_name in os.listdir(target_dir): folder_path os.path.join(target_dir, folder_name) if os.path.isdir(folder_path) and keyword in folder_name: new_name folder_name.replace(keyword, ) new_path os.path.join(target_dir, new_name) if os.path.exists(new_path): print(f跳过目标名称已存在 - {new_name}) continue try: os.rename(folder_path, new_path) print(f已重命名: {folder_name} - {new_name}) except OSError as e: print(f重命名失败: {folder_name} - {e})这段代码有几个 Python 特有的细节。os.listdir会同时返回文件夹和文件所以用os.path.isdir过滤掉文件避免对文件执行重命名。keyword in folder_name是 Python 的字符串包含判断等价于前面 PowerShell 的-like。os.rename(folder_path, new_path)在 Windows 上如果目标路径已存在会抛异常所以先用os.path.exists做检查再用try...except捕获可能出现的权限错误和占用错误。更实用的生产版本是多关键字加日志记录。下面的rename_folders_log.py把处理过程写入本地日志文件方便事后审计import os import time keywords [【最终版】, -官方版, -网盘下载] target_dir rD:\TestDir log_file rename_log.txt def contains_keyword(name: str) - bool: return any(kw in name for kw in keywords) def remove_keywords(name: str) - str: for kw in keywords: name name.replace(kw, ) return name with open(log_file, a, encodingutf-8) as log: for folder_name in os.listdir(target_dir): folder_path os.path.join(target_dir, folder_name) if not os.path.isdir(folder_path): continue if not contains_keyword(folder_name): continue new_name remove_keywords(folder_name) new_path os.path.join(target_dir, new_name) if os.path.exists(new_path): msg f[SKIP] 目标存在: {folder_name} - {new_name} print(msg) log.write(f{time.strftime(%Y-%m-%d %H:%M:%S)} {msg}\n) continue try: os.rename(folder_path, new_path) msg f[OK] {folder_name} - {new_name} except OSError as e: msg f[ERROR] {folder_name}: {e} print(msg) log.write(f{time.strftime(%Y-%m-%d %H:%M:%S)} {msg}\n) print(全部处理结束日志请查看 rename_log.txt)运行时在 CMD 或 PowerShell 中执行python rename_folders_log.py预期会输出[OK] 项目文档【最终版】 - 项目文档 [OK] 源代码【最终版】 - 源代码 [OK] 设计稿【最终版】 - 设计稿 [OK] 素材包-网盘下载 - 素材包 [OK] 安装包-官方版 - 安装包 全部处理结束日志请查看 rename_log.txt同时当前目录下会生成rename_log.txt记录每一次操作的准确时间、状态和名称变化。Python 方案最大的优势在于把逻辑和配置分离。以后只需要修改脚本开头的keywords列表和target_dir变量就能复用到任何新需求的批量重命名任务。它也是三种方案里唯一能在非 Windows 系统上直接运行的。7. 运行结果与效果验证无论选择哪种方案运行后的验证方式都是一样的。运行当前目录列表Get-ChildItem D:\TestDir -Directory | Select-Object Name处理前应该能看到 7 个目录项目文档【最终版】、源代码【最终版】、设计稿【最终版】、素材包-网盘下载、安装包-官方版、普通目录A、普通目录B。处理之后如果脚本是正确的目录列表应该变成项目文档、源代码、设计稿、素材包、安装包、普通目录A、普通目录B。这里可以对比一个关键点普通目录A和普通目录B必须原封不动保留。如果这两个目录也被改了名字说明关键字设置得太宽泛规则命中了你没有预期的目录。这时候要立刻停下手里的操作回到备份清单backup_dir_list.csv检查必要时手动恢复。验证命令dir D:\TestDir预期输出中不再出现任何包含“【最终版】”、“-官方版”、“-网盘下载”的文件夹名。如果运行失败第一排查点不是代码而是执行环境。CMD 脚本先看中文是否乱码PowerShell 先看执行策略和编码Python 先确认路径存在、关键字非空。代码只是可能性之一环境问题在批量重命名这类脚本里占比最高。建议按“环境 → 路径 → 关键字 → 脚本逻辑”的顺序排查不要一上来就怀疑代码写错。8. 常见问题与排查思路把我在实际使用中遇到的典型问题整理成下表基本覆盖了上述三种方案 90% 的报错问题现象可能原因排查方式解决方案CMD 脚本中文关键字变成乱码bat 文件保存成了 UTF-8CMD 按 ANSI 读取用记事本打开脚本检查中文是否正常另存为 ANSI / GBK 编码CMD 脚本运行后没有任何输出路径含空格或for /d参数被拆分暂时用简单路径测试或在脚本中加echo %%d打印路径路径和变量统一加双引号PowerShell 提示“禁止运行脚本”系统执行策略限制运行Get-ExecutionPolicy查看当前策略使用Set-ExecutionPolicy -Scope Process Bypass临时放行Rename-Item 报错“已存在”新名称与目录里现有文件夹冲突执行前检查目标路径是否已存在代码中先用Test-Path判断跳过冲突项Python 脚本提示找不到目录使用了相对路径当前工作目录不对打印os.path.exists(target_dir)验证改用绝对路径并加上raw string前缀rD:\...文件夹被占用导致重命名失败资源管理器、编辑器等程序正打开该目录查看报错信息中是哪个路径被占用关闭相关程序必要时以管理员身份运行脚本所有目录都被跳过没有改名关键字本身不存在或大小写不匹配先打印所有目录名和关键字做核对CMD 中可用/i忽略大小写Python 中统一lower()比较误改了一批不该改的目录关键字太宽泛或筛选条件不精确对照备份清单确认被改目录清单恢复备份下次先做干跑预览再执行真实操作还有一类问题比较隐蔽当脚本循环处理目录时如果某个重命名恰好让后续遍历条件失效可能会漏处理目录。不过在本文的脚本中Get-ChildItem和os.listdir会在开始时取得目录快照后续重命名不改变已经拿到的列表所以不会出现“边遍历边丢失项”的问题。这一点也是推荐用快照式遍历而不是动态查询的原因。9. 最佳实践与工程建议批量重命名文件夹名的操作虽然不复杂但一旦在生产环境执行还是要有一套固定的工程流程。第一步把需求写成明确规则。不是“把这些关键字删掉”而是“把文件夹名中出现的【最终版】、-官方版、-网盘下载整体删除其他字符保持原样”。规则越明确写代码时越不容易出错。第二步脚本参数化。不管用哪种方案都建议把目录路径和关键字放在脚本最前面的配置区域用注释标明用途。这样下次使用只需要改配置不用改逻辑。第三步坚持干跑预览。PowerShell 有-WhatIfPython 可以把os.rename换成printCMD 可以在ren前面临时加echo。干跑输出应该和真实执行几乎一致确认无误后再撤掉预览。第四步保留处理前清单。前文已经给出导出命令这一步建议养成习惯尤其是生产数据。虽然重命名不像删除文件那样不可恢复但在大批量目录中一旦错改手动还原依然非常痛苦。第五步是安全边界。不要对系统目录、正在被服务占用的目录、共享盘上的业务目录做未经确认的批量重命名。涉及权限的操作先确认进程使用的最小权限不要用管理员身份运行与操作无关的脚本这样能避免很多误操作风险。最后回到选型问题。我的建议是一句话单次临时清理用 CMD规则复杂用 PowerShell需要长期维护或跨平台就用 Python。别因为是“批量操作”就直接上复杂方案。工具本身不是目的把目录整利索、把规则确认好、保证操作可回滚才是这类任务真正要解决的事。把文中脚本按需改一改放到你的工具目录里下次再遇到满屏“【最终版】”的文件夹时双击或一行命令就能收工。
返回列表