批处理For循环实现当前路径及子文件夹多命令执行问题
解决批处理循环遗漏当前目录的问题
你的问题很典型——当前的for /f命令通过dir /s /b /o:n /ad只遍历了所有子目录,自然会漏掉当前工作路径的处理。这里有两种简单的修复方案,你可以根据需求选择:
方案1:先处理当前目录,再遍历子目录
这种方式逻辑最直观,先单独处理当前路径下的文件,再循环处理所有子文件夹:
@echo off setlocal enabledelayedexpansion :: 第一步:处理当前目录 pushd . :: 遍历当前目录下的my-file.*文件 for %%i in (my-file.*) do ( set "EXTENSION=%%~xi" :: 在这里执行你的操作,比如删除、压缩等 echo 处理当前目录的文件:%%i,扩展名是!EXTENSION! :: 示例:del "%%i" :: 示例:7z a "current-archive%%~xi.zip" "%%i" ) popd :: 第二步:遍历所有子目录处理 for /f "delims=" %%a in ('dir /s /b /o:n /ad') do ( pushd "%%a" for %%i in (my-file.*) do ( set "EXTENSION=%%~xi" echo 处理子目录 %%a 中的文件:%%i,扩展名是!EXTENSION! :: 同样执行你的操作 ) popd ) endlocal
我用了pushd和popd代替cd /d,这样能确保处理完子目录后自动回到原路径,避免路径切换混乱。另外加了setlocal enabledelayedexpansion,在循环里用!EXTENSION!才能正确获取每次循环的变量值;把操作放在for %%i循环里,能逐个处理目录下的所有my-file.*文件,而不是只保留最后一个文件的扩展名。
方案2:单循环同时覆盖当前目录和子目录
如果你想把逻辑合并到一个循环里,可以通过echo .把当前目录加入到遍历列表中:
@echo off setlocal enabledelayedexpansion :: 遍历当前目录 + 所有子目录 for /f "delims=" %%a in ('echo . ^& dir /s /b /o:n /ad') do ( pushd "%%a" for %%i in (my-file.*) do ( set "EXTENSION=%%~xi" echo 处理路径 %%a 中的文件:%%i,扩展名是!EXTENSION! :: 执行你的del、压缩命令 ) popd ) endlocal
这里echo .会输出当前目录的符号,和dir输出的子目录列表合并,这样循环就会先处理当前目录,再依次处理所有子目录,逻辑更紧凑。
内容的提问来源于stack exchange,提问作者Filippo
相关产品推荐
相关产品推荐

