和上一篇里的内容一样,本文里的两个批处理脚本也是从故纸堆里挖出来的。
第一个是:
1 2 3 4 5 6 7 8 9 10 |
@echo off setlocal enabledelayedexpansion set /a idx=1 for /f %%file in (filelist.txt) do ( if exist %%file rename %%file File_%idx%.txt set /a idx=%idx%+1 ) endlocal |
关键点在于 set 的 /a 选项,表示给变量赋值时要运算其数值,另外就是 for 的 /f 参数表示会解析 in 后的文件里的每一行;另一个如下:
1 2 3 4 5 6 7 8 9 10 |
@echo off setlocal enabledelayedexpansion set num=1 for %%i in (*.log) do ( ren %%~nxi !num!.log set /a num=!num!+1 ) endlocal |
这个的注意点则是用 ~nx 修饰的 i 变量,帮助文档里是这么说的:
%~dpI – 仅将 %I 扩展到一个驱动器号和路径
%~nxI – 仅将 %I 扩展到一个文件名和扩展名
%~fsI – 仅将 %I 扩展到一个带有短名的完整路径名
%~dp$PATH:I – 搜索列在路径环境变量的目录,并将 %I 扩展到找到的第一个驱动器号和路径
%~ftzaI – 将 %I 扩展到类似输出线路的 DIR
为了方便记忆,我推测前三个的缩写来源是,dp 代表了 [d]rive 和 [p]ath,nx 代表了 [n]ame 和 e[x]tension,而 fs 代表了 [f]ull path with [s]hort name。系统带的中文帮助翻译的相当生硬,所谓“扩展”其实就是“展开”,和 C 语言里处理宏的动作是一样的。