Windows批处理系列:set和变量📌函数传参📌if语句📌for循环
在批处理中,通过%1,%2……来传递参数,这个我们早就知道了;%~1的含义我们也知道,无非是自动删除参数中的引号而已。然而,%~这个语句,能够做到的却不止是删除引号而已。
下面新建一个批处理文件,来看看
:: para.bat
@echo I mode: %~1
@echo fI mode: %~f1
@echo dI mode: %~d1
@echo tI mode: %~t1
运行效果如下
>para "para.bat"
I mode: para.bat
fI mode: C:\Users\Laser\Documents\00\0821\para.bat
dI mode: C:
tI mode: 2023/08/21 10:17
其中,%1自动去掉了双引号,这没什么好说的,%1看样子是补齐了para.bat的绝对路径;dI给出了para.bat所在盘符;最后tI则返回了para.bat的创建时间。
这些类似fdt之类的前缀,可以对输入字串进行转换,其转换规则如下
| 标记 | 规则 |
|---|---|
| %~I | 删除任何引号("),扩展 %I |
| %~fI | 将 %I 扩展到一个完全合格的路径名 |
| %~dI | 仅将 %I 扩展到一个驱动器号 |
| %~pI | 仅将 %I 扩展到一个路径 |
| %~nI | 仅将 %I 扩展到一个文件名 |
| %~xI | 仅将 %I 扩展到一个文件扩展名 |
| %~sI | 扩展的路径只含有短名 |
| %~aI | 返回文件I的文件属性 |
| %~tI | 返回文件I的文件的日期/时间 |
| %~zI | 返回文件I的文件大小 |
| %~$PATH:I | 匹配环境变量PATH路径下的文件 |
其中 a,t,z这三种模式要求文件I存在,否则就会返回空串;%~$PATH:I如果没匹配成功,也会返回一个空串。
这些模式可以组合在一起
::multi.bat
@echo fdp mode: %~fdp1
@echo fatz mode: %~fatz1
@echo fdpnxsatz mode: %~fdpnxsatz1
效果如下
>multi multi.bat
fdp mode: C:\Users\Laser\Documents\00\0821\multi.bat
fatz mode: --a-------- 2023/08/21 10:26 86 C:\Users\Laser\Documents\00\0821\multi.bat
fdpnxsatz mode: --a-------- 2023/08/21 10:26 86 C:\Users\Laser\DOCUME~1\00\0821\multi.bat
可见fdp这三个标记同时使用的话,其结果会被合并到一起。
%语法在For循环中也十分便利,下面的代码表示,搜索C盘中以s结尾的文件夹,并返回其修改时间、文件夹大小以及文件夹名称
>for /D %i in (c:\*s) do @echo %~tzfi
返回结果如下
2023/05/03 21:58 0 c:\PerfLogs
2023/08/11 09:48 8192 c:\Program Files
2023/05/03 22:07 4096 c:\Users
2023/08/15 22:39 24576 c:\Windows