Windows批处理脚本:如何递归遍历排除特定文件类型、.git及__pycache__目录后执行字符串替换
Windows批处理脚本:如何递归遍历排除特定文件类型、.git及__pycache__目录后执行字符串替换
我帮你调整了批处理脚本,解决了原脚本里无法排除嵌套__pycache__目录的问题,同时优化了条件判断和变量处理逻辑,确保能正确递归处理所有符合要求的文件:
@echo off setlocal EnableDelayedExpansion :: 请替换为实际的替换变量值 set "replace_package={{ADDON_NAME_PACKAGE}}" set "package_name=你的目标包名" set "replace_addon_name={{ADDON_NAME}}" set "addon_short_name=你的目标短名称" set "replace_addon_full={{ADDON_NAME_FULL}}" set "addon_full_name=你的目标完整名称" :: 递归遍历所有文件 for /r %%F in (*) do ( echo 正在检查: %%F :: 排除指定扩展名的文件(不区分大小写) if /i not "%%~xF"==".sh" if /i not "%%~xF"==".png" if /i not "%%~xF"==".bat" ( :: 排除.git目录下的所有文件 set "file_path=%%~dpF" if "!file_path:.git\=!"=="!file_path!" ( :: 排除所有__pycache__目录下的文件(不管嵌套层级) if "!file_path:__pycache__\=!"=="!file_path!" ( :: 检查文件是否包含需要替换的字符串,避免无意义操作 findstr /C:"%replace_package%" /C:"%replace_addon_name%" /C:"%replace_addon_full%" "%%F" >nul 2>&1 if not errorlevel 1 ( echo 正在处理文件: %%F :: 处理引号嵌套和特殊字符问题,先关闭延迟扩展执行sed set "target_file=%%F" setlocal DisableDelayedExpansion sed -i -e "s/%replace_package%/%package_name%/g" -e "s/%replace_addon_name%/%addon_short_name%/g" -e "s/%replace_addon_full%/%addon_full_name%/g" "%target_file%" endlocal ) ) ) ) ) endlocal echo 处理完成!
关键优化点说明:
- 正确遍历文件:去掉了原脚本的
/d参数,for /r默认递归遍历所有文件,符合你处理文件替换的需求 - 排除嵌套目录:通过字符串替换
!file_path:.git\=!和!file_path:__pycache__\=!判断路径是否包含目标目录,不管这些目录嵌套在多少层子目录里,都能准确排除 - 不区分大小写的扩展名判断:加入
/i参数,避免因为扩展名大小写不一致导致漏判 - 优化效率:先用
findstr检查文件是否包含需要替换的字符串,只对有目标内容的文件执行替换,减少不必要的操作 - 特殊字符处理:通过切换延迟变量扩展的状态,避免文件名中的
!等特殊字符被错误解析
备注:内容来源于stack exchange,提问作者Macky's UserStalker Bot
相关产品推荐
相关产品推荐

