批处理脚本
1. 遍历指定文件夹下的文件
1.1 命令解释
命令: for [参数] %%变量名 in (匹配符) do (执行的命令)
切记:每个指令之间必须以空格隔开,in 与 ( 之间有空格,do 与 ( 间也有空格,否则命令会无法成功执行
ps:本节只讲用批处理脚本执行 for 命令遍历文件夹的场景,因此以下分析每个指令意义时,不介绍其他含义
[]:表示此项指令为可选
[参数]:参数取值一共有四种: /d, /r, /l, /f
,加上无参数,所以一共五种场景
- 无参:遍历当前路径的文件夹下的文件,但也可在
(匹配符)
中指定路径 - /d:遍历当前路径的文件夹下的文件夹,但也可在
(匹配符)
中指定路径 - /r [路径]:深度遍历指定路径下的所有文件,子目录中的文件也会被遍历到,如果没指定路径,默认当前路径
- /l :当使用参数 /l 时,需结合
(匹配符)
一起使用,此时()
括号内部的用法规则为:(start, step, end)
,此时的 for 命令作用等同于 java 语言中的 for 语句 - /f :用于解析文件中的内容,本节不做介绍
%%变量名:作用类似于 for(int i = 0; ; )
中的 int i = 0
,有些区别点的就是,批处理的 for 循环遍历每一个子项时,%%变量名
<=> 每个子项,即 &&变量名
已经是指向具体的每个子项了
(匹配符):在 in 指令之后 () 括号里的内容可表示为通配符,用于按照指定的规则过滤文件夹下的文件,如 (*.txt) 表示遍历文件夹内所有以 .txt 结尾的文件
(执行的命令):前面的指令就可以取到文件夹内指定的每个子项了,那么接下去要对每个子项如何操作,就在这里写,类似于 java 的 for 命令后的 {} 大括号的作用
1.2 使用示例
以下示例基于上图中的文件路径,批处理脚本为 test.bat
- 无参:
for %%i in (*) do ( echo %%i )
效果:遍历当前目录下的所有文件
- 无参指定路径:
for %%i in (c:\softwares\VisualBat\*.url) do ( echo %%i )
效果:遍历在(匹配符)
中指定路径下的以 .url 结尾的文件
- 带参数 /d:
for /d %%i in (*) do ( echo %%i )
效果:遍历当前目录下所有的文件夹
- 带参数 /d 指定路径:
for /d %%i in (c:\softwares\VisualBat\*) do ( echo %%i )
效果:遍历指定目录下的所有文件夹,%%i 指向每个子文件夹的绝对路径
- 带参数 /r :
for /r %%i in (*.url) do ( echo %%i )
效果:深度遍历当前路径下所有以 .url 结尾的文件,因为是深度遍历,因此 %%i 指向文件的绝对路径
-
带参数 /r 指定路径:
for /r c:\softwares\VisualBat\ %%i in (*.url) do ( echo %%i )
效果:同上图
-
带参数 /l :
for /l %%i in (1, 1, 5) do ( echo %%i )
效果:等效于 java 中的 for (int i = 1; i <= 5; i++)
语句,起始值,递增或递减,终止值都可自行设置
- 带参数 /d /r:
for /d /r %%i in (*) do ( echo %%i )
效果:参数可结合使用,/d 表示遍历文件夹,/r 表示深度遍历,因此以上命令作用为深度遍历当前目录下的所有文件夹,包括子目录中的文件夹
2. 临时变量的使用
2.1 变量的基本用法
命令:set key=value
切记:key=value
三者之间绝对不能出现空格,不能为了像遵守 java 风格擅自给添加上空格,这与 java 的 int a = 1
声明变量不同,切记
变量使用:%key%
示例:
@echo off
set name=dasuAndroidTv
echo %name%
效果:name 可当做临时变量使用,使用时需用 %% 将变量名括起来使用
局限:不允许在 for 命令中类似上步中声明变量并直接使用,如下:
@echo off
for /l %%i in (0,1,5) do (
set name=dasuAndroidTv echo %name% )
效果:在 for 命令中声明临时变量,并直接通过 %key% 方式使用时会出现上图中的错误:ECHO 处于关闭状态,但如果 set key=value
临时变量的声明是放在 for 命令外部,for 命令内部只是使用的话,是可以的,如下:
@echo off
set name=dasuAndroidTv
for /l %%i in (0,1,5) do ( echo %name% )
效果:在 for 命令外部声明临时变量,for 命令内部只是使用,这种方式是允许的
2.2 变量在 for 命令中的用法
提问:那么如果要在 for 命令中才声明临时变量,并使用的话,该如何做?
for 命令中临时变量的使用:
- 需启用变量延迟功能,命令:
setlocal enabledelayedexpansion
- for 命令中的临时变量使用时用
!key!
感汉号括起来的形式代替%key%
- 理由:不清楚,google 来的解决方案,感兴趣想深入研究的自行搜索
示例:
@echo off
setlocal enabledelayedexpansion
set name=dasu
for /l %%i in (0, 1, 5) do ( set name=dasuAndroidTv echo !name! echo %name% )
效果:说得白一点,在 for 命令中通过 %name% 方式使用的临时变量,取的 name 这个临时变量的值会一直是它在 for 命令外赋值的内容,即使在 for 命令中通过 set 命令对这个变量又重新赋值,也不会生效。
那么,如果需要在 for 命令中通过 set 命令赋值后的临时变量能够马上拿来使用,需要两个步骤,一在文件开头启用变量延迟功能,命令:setlocal enabledelayedexpansion
,二在 for 命令中通过 !name!
方式来使用临时变量。
3. 字符串处理
3.1 截取
命令:%key:~[start,num]%
解释:当 %key%
中出现了 :~
,则表示要对 key 指向的这个字符串做截取操作,截取操作支持以下几种形式:
- 截取指定位置开始的 n 个字符串:
%key:~0,4%
,表示截取从下标 0 开始的之后 4 个字符 - 截取从指定位置开始的整个字符串:
%key:~4%
,表示截取从下标为 4 开始的整个字符串 - 截取通过倒数方式指定开始位置的整个字符串:
%key:~-2%
,表示截取从倒数第 2 个字符开始的整个字符串 - 截取通过倒数方式指定位置开始之后的 n 个字符串:
%key:-4,2%
,表示截取从倒数第 4 个字符开始的 2 个字符 - 正数倒数方式相结合:
%key:~2,-2%
,表示截取从下标 2 开始到倒数第 2 个之间的字符串
示例:
@echo off
rem (rem表示后面是注释的内容,类似于 java //)原始字符串
set name=dasuAndroidTv