批处理笔记

批处理笔记

批处理遍历文件夹

1
for /D %i in (*) do

这种写法如果目录里有文件夹则只遍历文件夹。

清空指定文件

目前我直接使用echo命令没有成功过。

间接方法:

把输出为空的命令重定向到待清空文件中,例如:

1
cd.>xxx.txt

将清空当前目录下的xxx.txt。

字符串操作

取子串

1
%str:~s,n%

从str的s位置开始取n个字符。

注意:

  1. 字符串下标从0开始,也就是说,s=0为从第一个字符开始。
  2. s可以为负,此时表示从倒数第 s个字符开始,即下标为lens-s的字符处开始。
  3. n也可以为负,但是此时用法有所不同,为取从s开始到lens+n-1的子串。
  4. 第二条与第三条可以同时使用。

子串替换

1
%str:substr=newstr%

从头开始匹配,将str中所有substr替换成newstr。

注意:

  1. 替换是从头开始匹配,所以如果两个(或多个)符合要求的子串有重叠,只会替换第一个。
  2. newstr可以为空,此时表示删除所有匹配substr的子串。

文件名操作

当一个文件传入批处理脚本作为参数或者用for语句遍历文件时,还有一类特殊操作。

注意:下面的用法仅限于文件变量,普通的变量无法使用(即使它的内容是一个文件的路径也不行)

注:在批处理中,%0参数表示批处理脚本文件自身;

%1,%2等分别表示运行时给批处理脚本传入的参数

说明

以下是for /?命令输出中关于这方面的说明。

%~I - 删除任何引号("),扩展 %I %~fI - 将 %I 扩展到一个完全合格的路径名 %~dI - 仅将 %I 扩展到一个驱动器号 %~pI - 仅将 %I 扩展到一个路径 %~nI - 仅将 %I 扩展到一个文件名 %~xI - 仅将 %I 扩展到一个文件扩展名 %~sI - 扩展的路径只含有短名 %~aI - 将 %I 扩展到文件的文件属性 %~tI - 将 %I 扩展到文件的日期/时间 %zI - 将 %I 扩展到文件的大小 %$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩展 到找到的第一个完全合格的名称。如果环境变量名 未被定义,或者没有找到文件,此组合键会扩展到 空字符串

可以组合修饰符来得到多重结果:

%~dpI - 仅将 %I 扩展到一个驱动器号和路径 %~nxI - 仅将 %I 扩展到一个文件名和扩展名 %~fsI - 仅将 %I 扩展到一个带有短名的完整路径名 %~dp$PATH:I - 搜索列在路径环境变量的目录,并将 %I 扩展 到找到的第一个驱动器号和路径。 %~ftzaI - 将 %I 扩展到类似输出线路的 DIR

在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法 用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名 比较易读,而且避免与不分大小写的组合键混淆。

示例

假设当前目录结构为"E:\cup\cat\test.bat",脚本内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
@echo off
echo %0
echo 去掉引号:%~0
echo 合格路径:%~f0
echo 所在盘符:%~d0
echo 所处目录(去掉盘符):%~p0
echo 文件名(不包括扩展名和目录):%~n0
echo 扩展名(包括.):%~x0
echo 短名:%~s0
echo 文件属性:%~a0
echo 修改时间:%~t0
echo 文件大小:%~z0

pause

输出如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
"E:\cup\cat\test.bat"
合格路径:E:\cup\cat\test.bat
去掉引号:E:\cup\cat\test.bat
所在分区:E:
所处路径:\cup\cat\
文件名:test
扩展名:.bat
短名:E:\cup\cat\test.bat
文件属性:--a--------
修改时间:2018/10/01 14:35
文件大小:228
请按任意键继续. . .
0%