说明

本文收集一些常用的bat搭配其它工具遍历文件,进行一些开发的辅助性操作或辅助性开发

for循环index参数说明

当我们编写for循环遍历文件时,遍历参数%%i的可变形式如下:

  • %%~i - 删除引号("),扩充 %%i
  • %%~fi - 将 %%i 扩充到一个完全合格的路径名
  • %%~di - 仅将 %%i 扩充到一个驱动器号
  • %%~pi - 仅将 %%i 扩充到一个路径
  • %%~ni - 仅将 %%i 扩充到一个文件名
  • %%~xi - 仅将 %%i 扩充到一个文件扩展名
  • %%~si - 扩充的路径指含有短名
  • %%~ai - 将 %%i 扩充到文件属性
  • %%~ti - 将 %%i 扩充到文件的日期/时间
  • %%~zi - 将 %%i 扩充到文件的大小
    与路径相关的变式,可以是多种组合:
  • %%~dpi 显示盘符与路径,即父路径
  • %%~dpni 显示盘符、路径与文件名,不显示后缀
  • %%~dpnxi 显示盘符、路径与文件名,显示后缀

dir的匹配符

  • * 包含文件和文件夹
  • *.* 仅包含文件

实例

基本遍历

递归遍历文件

可使用for /ffor /r两种形式
for /f形式需要遍历其它目录时,可在前后添加pushd/pop进行,或在dir中的匹配符前输入目录路径

for /f %%i in ('dir /s /b *') do (echo %%i
)

for /r形式需要遍历其它目录时,只需将根目录参数%cd%替换成对应的目录路径或遍历即可

for /r %cd% %%i in (*) do (echo %%i
)
遍历一级文件夹下的文件

此时%%i只输出文件名。dir中的参数/a-d是将文件夹排除在外。

for /f %%i in ('dir /b /a-d *') do (echo %%i
)
遍历多种类型的文件

如同时递归bat、cpp、sh、lua这四种类型的文件:

for /f %%i in ('dir /s /b f:\batch_files\*.bat, f:\cpp_files\*.cpp, f:\bash_files\*.sh, f:\lua_files\*.lua') do ( echo %%i
)
递归遍历文件夹

使用/ad表明只遍历文件夹

for /f %%i in ('dir /s /b /ad *') do (echo %%i
)
遍历一级文件夹

使用for /d可直接遍历当前运行目录下的一级文件夹

for /d %%i in (*) do (echo %%i
)

使用for /f形式:

for /f %%i in ('dir /b /ad *') do (echo %%i
)
使用常量遍历

较简单的一种方法,则是写定部分特定路径,使用,空格分隔这些路径,直接通过for循环进行遍历。
这种方法可以经常使用。

@echo off
@REM 记得开启延迟变量
setlocal EnableDelayedExpansion
set aDirPaths=
set "aDirPaths=!aDirPaths!,ui\aiicons"
set "aDirPaths=!aDirPaths!,ui\items"
set "aDirPaths=!aDirPaths!,ui\rideicons"
set "aDirPaths=!aDirPaths!,ui\roleicons"
for %%i in (!aDirPaths!) do (echo %%i
)

文件操作

获取相对路径

替换符=前的变量仅能用%%包含。替换符前可写常量

@echo off
@REM 记得开启延迟变量
setlocal EnableDelayedExpansion
for /r %cd% %%i in (*.*) do (set szPath=%%iset szRelPath=!szPath:%cd%\=!echo !szRelPath!
)
拼接文件名

将文件名拼接到一个变量中,然后输出到控制台,获取拼接结果。
如下,遍历bat使用";"拼接。
在拼接操作中,需将set关键词后的所有代码使用双引号包含。

同理,可以扩展到拼接绝对路径、相对路径,仅拼接文件、仅拼接文件夹等

@echo off
setlocal EnableDelayedExpansion
for /f %%i in ('dir /s /b *.*') do (set "a=!a!;%%~nxi"
)
@REM 去掉第一个;
set a=!a:~1!
echo !a!
获取文件时间
@echo off
setlocal EnableDelayedExpansion
for /r %cd% %%i in (*) do (for %%a in (%%i) do set fileDate=%%~taecho %%i !fileDate!
)

组合操作

分布式调用

查找工程中存在的tolua.bat,并调用

for /f %%i in ('dir /s /b tolua.bat') do (pushd %%~dpicall tolua.batpopd
)

搭配第三方工具

TexturePacker将png转换成ktx

递归遍历png文件,使用TexturePacker进行ktx和pvr的转换

@echo off
setlocal EnableDelayedExpansion
@REM 配置第三方工具TexturePacker的路径
set PATH_TEXTURE_PACKER=D:\TexturePacker\bin\TexturePacker.exe
set "szParams=!szParams! --format xml"
set "szParams=!szParams! --max-size 2048"
set "szParams=!szParams! --shape-padding 2"
set "szParams=!szParams! --border-padding 2"
set "szParams=!szParams! --disable-rotation"
set "szParams=!szParams! --algorithm MaxRects"
set "szParams=!szParams! --no-trim"
set "szParams=!szParams! --dither-fs-alpha"
set "aKtxParams=!szParams! --opt RGBA8888"
@REM 遍历当前目录存在的文件夹,调用自定义函数进行转换
for /d %%i in (*) do (echo %%icall :function_transform_texture_set "%%i"
)
goto :end
@REM -----------------------------------------------------------------------
@REM 将png转换成ktx的功能封装成一个函数
:function_transform_texture_set
if "%~1" == "" goto :eof
if exist %~1.png del /q %~1.png
if exist %~1.xml del /q %~1.xml
@REM 检查空文件夹
set szCmdOutput=
for /f "delims=" %%a in ('dir /a /b %~1') do (set "szCmdOutput=%%a"
)
if "!szCmdOutput!" == "" (echo %~1 is emptyrd /q %~1del /q %~1.ktxdel /q %~1_alpha.ktxgoto :eof
)
@REM ktx
%PATH_TEXTURE_PACKER%  %~1 !aKtxParams! --sheet %~1.png --data %~1.xml
goto :eof
@REM -----------------------------------------------------------------------
:end
批量进行svn mv操作

批量进行svn mv操作,能保留svn的提交记录。
如下,将editor下所有的头文件和cpp文件,迁移到ui文件夹下

@echo off
setlocal EnableDelayedExpansion
for /f %%i in ('dir /b ui\*.*') do (set szSrcPurePath=editor\%%~niset szDstPurePath=ui\%%~niif exist "!szSrcPurePath!.h" svn mv !szSrcPurePath!.h !szDstPurePath!.hif exist "!szSrcPurePath!.cpp" svn mv !szSrcPurePath!.cpp !szDstPurePath!.cpp
)
对多个仓库进行svn cleanup

如某台打包机,配置了多个不同的仓库,而且有进行经常性的拉去代码和编译工作。在硬盘有可能出现不足时,可在jenkins上配置一份svn cleanup清理缓存,来定期减少仓库的总大小

@echo off
setlocal EnableDelayedExpansion
set aEnvPaths=
set "aEnvPaths=!aEnvPaths! C:\env1develop"
set "aEnvPaths=!aEnvPaths! C:\env1debug"
set "aEnvPaths=!aEnvPaths! C:\env1release"
set aEnvPaths=!aEnvPaths:~1!
for %%p in (!aEnvPaths!) do (svn cleanup %%p --include-externalssvn cleanup %%p --vacuum-pristines --include-externals
)

辅助编写代码

编写xml文件

例如,递归遍历将多个文件夹中的png文件,用相对路径写入Qt的qrc配置文件中

注意:qrc实际为xml文件,语法上存在大量的"<“、”>“符号,写入文件时,需要添加”^"进行转义

@echo off
setlocal EnableDelayedExpansion
@REM 设置需要遍历的所有文件夹
set aDirPaths=
set "aDirPaths=!aDirPaths!,ui\aiicons"
set "aDirPaths=!aDirPaths!,ui\items"
set "aDirPaths=!aDirPaths!,ui\rideicons"
set "aDirPaths=!aDirPaths!,ui\roleicons"
set aDirPaths=!aDirPaths:~1!
set fileOutput=res.qrc
if exist "!fileOutput!" del /q "!fileOutput!"
@REM 第一次写入文件使用">",写入xml的标签头
(echo ^<RCC^>echo     ^<qresource prefix="/res"^>
) > "!fileOutput!"
@REM 遍历文件写入
for %%p in (!aDirPaths!) do (set szDirPath=%%p@REM 将Windows的文件分隔符"\"替换成正斜杠"/"set szQrcPrefix=!szDirPath:\=/!for /f %%i in ('dir /b !szDirPath!\*.png') do (@REM 写入配置,并增加tab以适配格式echo         ^<file^>!szQrcPrefix!/%%i^</file^> >> "!fileOutput!")
)
@REM 写入xml的标签尾
(  echo     ^</qresource^>echo ^</RCC^>
) >> "!fileOutput!"
编写markdown中的无序列表

递归遍历文件,编写所需要跳转的文件映射在markdown中的无序列表。运行后,从控制台复制输出结果到markdown中。

@echo off
setlocal EnableDelayedExpansion
for /r %%i in (*.lua) do (set szPath=%%iset szRelPath=!szPath:%cd%\=!echo * [%%~nxi]^(./!szRelPath!^)
)
生成WinMerger文件

对两个目录结构相同的大型工程目录,需要大量对比某些文件夹,但又不需要在全部比较时,可以编写个遍历脚本来批量生成,统一保存成WinMerge文件后,方便日后直接双击打开,无需再麻烦地拖动文件夹来对比。

@echo off
setlocal EnableDelayedExpansion
set OUTPUT_PATH=F:\WinMergeProjectsOfMiniWorld
@REM 指定两个工程的路径
set aEnvPaths=
set "aEnvPaths=!aEnvPaths!,C:\trunk\env1ed"
set "aEnvPaths=!aEnvPaths!,F:\trunk\env1oversea"
set aEnvPaths=!aEnvPaths:~1!
@REM 指定需要WinMerge的部分文件夹
set aSubPaths=
set "aSubPaths=!aSubPaths!,bin"
set "aSubPaths=!aSubPaths!,bin\res"
set "aSubPaths=!aSubPaths!,bin\res\ui"
set "aSubPaths=!aSubPaths!,source\client"
set "aSubPaths=!aSubPaths!,source\server"
set aSubPaths=!aSubPaths:~1!
if not exist %OUTPUT_PATH% mkdir %OUTPUT_PATH%
for %%i in (!aEnvPaths!) do (for %%j in (!aEnvPaths!) do (for %%k in (!aSubPaths!) do (set szEnvLeft=set szEnvRight=call :function_getFolderNameFromPath szEnvLeft "%%i"call :function_getFolderNameFromPath szEnvRight "%%j"set szLeftPath=%%i\%%kset szRightPath=%%j\%%kset szFolderName=call :function_getFolderNameFromPath szFolderName "!szLeftPath!"set "szOutputPath=%OUTPUT_PATH%\!szFolderName! !szEnvLeft! - !szEnvRight!.WinMerge"@REM echo szLeftPath = !szLeftPath!@REM echo szFolderName = !szFolderName!call :localFunction_createWinMergeProject "!szOutputPath!" "!szLeftPath!" "!szRightPath!"))
)
@REM -----------------------------------------------------------------------
@REM 从路径中获取文件名
:function_getFolderNameFromPath
set "szPath=%~2"
if "!szPath!" == "" (echo [ERROR] path emptygoto :eof
)
if not exist "!szPath!" (echo [ERROR] not exist: !szPath!goto :eof
)
pushd "!szPath!"
for /f "delims=" %%i in ('cd') do (set szFolderName=%%~nxi
)
popd
set "%~1=!szFolderName!"
goto :eof
@REM -----------------------------------------------------------------------
@REM 创建WinMerge文件
:localFunction_createWinMergeProject
set "szOutputPath=%~1"
set "szLeftPath=%~2"
set "szRightPath=%~3"
set "szFileType=%~4"
if "!szOutputPath!" == "" (echo [ERROR] output path emptygoto :eof
)
if "!szLeftPath!" == "" (echo [ERROR] left path emptygoto :eof
)
if "!szRightPath!" == "" (echo [ERROR] right path emptygoto :eof
)
if "!szLeftPath!" == "!szRightPath!" (@REM echo [ERROR] both paths equalgoto :eof
)
if not exist "!szLeftPath!" (@REM echo [ERROR] not exist: !szLeftPath!goto :eof
)
if not exist "!szRightPath!" (@REM echo [ERROR] not exist: !szRightPath!goto :eof
)
if "!szFileType!" == "" (set szFileType=*.*
)
if exist "!szOutputPath!" del /q "!szOutputPath!"(echo ^<?xml version="1.0" encoding="UTF-8"?^>echo ^<project^>echo   ^<paths^>echo         ^<left^>!szLeftPath!^</left^>echo       ^<right^>!szRightPath!^</right^>echo        ^<filter^>!szFileType!^</filter^>echo       ^<subfolders^>1^</subfolders^>echo      ^<left-readonly^>0^</left-readonly^>echo        ^<right-readonly^>0^</right-readonly^>echo  ^</paths^>echo ^</project^>
) >!szOutputPath!
goto :eof
@REM -----------------------------------------------------------------------

相对于其它语言的代码,有关遍历文件的都可以自己配置来添加常量数组、常量字符串数组、代码等不同功能的文本

VSCode使用一键输入代码进行快速编写

使用VSCode时,可以通过配置Snippets来完成一键输入的效果,提高编写效率。
下方贴出基本遍历的配置代码,供大家方便复制使用:

{"for_f_iterate_files_recursively" : {"scope": "bat","prefix": "forffr","body": ["for /f %%i in ('dir /s /b *') do (","  echo %%i",")",],"description": "递归遍历文件"},"for_r_iterate_files_recursively" : {"scope": "bat","prefix": "forrfr","body": ["for /r %cd% %%i in (*) do (","  echo %%i",")",],"description": "递归遍历文件"},"for_f_iterate_files" : {"scope": "bat","prefix": "forff","body": ["for /f %%i in ('dir /b *') do (","  echo %%i",")",],"description": "遍历一级文件"},"for_f_iterate_dirs_recursively" : {"scope": "bat","prefix": "forfdr","body": ["for /f %%i in ('dir /s /b /ad *') do (","  echo %%i",")",],"description": "递归遍历文件夹"},"for_d_iterate_dirs" : {"scope": "bat","prefix": "ford","body": ["for /d %%i in (*) do (","  echo %%i",")",],"description": "遍历一级文件夹"},"for_d_iterate_dirs" : {"scope": "bat","prefix": "forfd","body": ["for /f %%i in ('dir /b /ad *') do (","  echo %%i",")",],"description": "遍历一级文件夹"},
}

像其它如Sublime的工具,也可以自行配置来方便编写

batch搭配工具遍历文件使用示例相关推荐

  1. linux 遍历文件及文件夹,linux文件夹操作及递归遍历文件夹(示例代码)

    文件夹相关函数介绍 //mkdir 函数创建文件夹 #include #include int mkdir(const char *pathname, mode_t mode); //rmdir 删除 ...

  2. php遍历文件夹下文件内容_php遍历文件夹下所有文件的代码示例

    本篇文章给大家带来的内容是关于php遍历文件夹下所有文件的代码示例,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 不论是面试还是正常工作需要都会用到遍历文件夹下的所有文件,今天就记录 ...

  3. python遍历文件_python遍历目录文件脚本的示例

    例子 自己写的一个Python遍历文件脚本,对查到的文件进行特定的处理.没啥技术含量,但是也记录一下吧. 代码如下 复制代码 #!/usr/bin/python # -*- coding: utf-8 ...

  4. 2019-8-20 [Linux] 6.Shell的基本操作 查看 改变 列出 阅读开头/结尾 循环查看 阅读工具less 查找文件内容 文本分析工具AWK 文本编辑工具SED文件find 帮助man

    文章目录 6.linuxShell的基本操作 6.1 查看目录和文件 6.1.1 显示当前目录:pwd 6.1.2 改变目录:cd 6.1.3 列出目录内容:ls 1) 查看列表信息 以及详细信息 2 ...

  5. php file del 方法,php怎么遍历文件删除指定字符

    php遍历文件删除指定字符的实现方法:首先创建一个PHP示例文件:然后通过"function del($getstr){-}"方法删除指定目录下所有指定文件中指定字符串即可. 本文 ...

  6. 遍历文件夹(含子文件夹)方法

    做法基本上有2大类: ① 经典Dir ② FSO 即 Scripting. File System Object 的[文件系统对象]脚本方法. 一开始可能Dir方法较为普遍,但随着水平的提高,应用FS ...

  7. xml遍历文件夹vector_怎么统计指定文件夹下含有.xml格式的文件数目

    如何统计指定文件夹下含有.xml格式的文件数目?如题 ------解决思路----------------------Directory.GetFiles(@"路径", " ...

  8. java遍历文件夹下的_Java遍历文件夹下的所以文件

    利用Java递归遍历文件夹下的所以文件,然后对文件进行其他的操作.如:对文件进行重命名,对某一类文件进行重编码.可以对某一工程下的全部.java文件进行转码成utf-8等 代码如下,这里只对文件进行重 ...

  9. C#使用WIN32API来高效率的遍历文件和目录(转)

    我们有时需要遍历某个目录下的文件和子目录,可以使用System.IO.DirectoryInfo.GetDirectories或 GetFiles来获得目录下的所有的文件和子目录,当这个目录下的内容比 ...

最新文章

  1. 开源!开源!我写的Anto.exe C#代码自动生成工具.欢迎下载。。
  2. Java NIO Selector 详解
  3. 在CentOS_Linux版虚拟机中安装VMTools工具
  4. python批量下载文件只有1kb_Python 实现批量从不同的Linux服务器下载文件
  5. ubuntu apache php mysql phpmyadmin_Ubuntu下Apache+PHP+MySQL+phpMyAdmin的快速安装步骤
  6. ASP.NET Core快速入门(第4章:ASP.NET Core HTTP介绍)--学习笔记
  7. 【学习生活杂谈】学习记录
  8. python 动态相册_Python编程:制作电子相册
  9. 张高兴的 Windows 10 IoT 开发笔记:RTC 时钟模块 DS3231
  10. ZooKeeper搭建实验
  11. paip.输入法编程---带ord gudin去重复-
  12. 【测试沉思录】3. 如何测试微信公众号?
  13. C语言——超市商品管理系统
  14. springboot整合postgresql
  15. 服务器数据存储在哪个位置,数据存储在云服务器什么地方
  16. linux环境下安装cwp的地震专业软件su
  17. android xlog崩溃日志,腾讯Xlog接入指南与踩过的坑
  18. 2021抖音数据报告
  19. 获取Windows 10上文件资源管理器的帮助
  20. 关于压缩感知的第一篇论文解析压缩感知研究新思路

热门文章

  1. kafka | 消费者组到底是什么?
  2. STM32学习笔记(3) TIM基本定时器
  3. 2023年天津市大学软件学院专升本专业课报名缴费考试的通知
  4. PP-YOLO超越YOLOv4-目标检测的进步
  5. 微信小程序---评论功能实现
  6. Speedoffice(word)文档如何操作上标和下标?
  7. s3c2440实时时钟中断
  8. 2353409-99-9,DBCO-PEG9-amine,DBCO-PEG9-NH2,二苯并环辛炔-九聚乙二醇-氨基供应
  9. Android常用知识点总汇
  10. 快应用官方IDE使用说明