上周被底盘组的同事抓差去帮他们写个自动化脚本,我看出来了,电池组的也跃跃欲试→_→
由于微软batch知识点非常的杂,我又是上一周现学现卖,在此我尽量将结构写得清楚一些,希望以后自己还能看得懂这篇博客。。。
PS:【以下内容主要包括 提取文件的名字,批量生成文件夹,文件的复制和删除,文件盒文件夹的改名, 查找/提取文件内容的关键字,替换文件内容】
【考虑到公司保密协定,并不能贴源码】
目录:
- 使用局部变量
- 相对路径的使用
- 将字符串存入指定文件中
- 新建文件夹
- 复制文件
- 删除文件/文件夹
- 查找文件内的特定字符串
- for循环
- 对文件内容分块处理
-------------------------------------------------------------以下为正文---------------------------------------------------------------
1. 使用局部变量
setlocal EnableDelayedExpansion
每次执行语句前都会及时更新当前变量的值,在for循环时尤其有用
2. 相对路径的使用
cd %~dp0\INPUT
当你编写 .bat脚本时, %~dp0 就是你bat文件的当前路径
用上面的命令就能成功进入旁边的INPUT文件夹内。
3. 将字符串存入指定文件中
echo 我是大帅比 > temp.acf
此处.acf后缀可改成.txt等任意扩展名,并且如果该temp文件事先不存在的话,echo命令会自动帮你生成,如果存在的话,temp文件内容会被“我是大帅比”字符串覆盖。
echo 我是大帅比 >> temp.acf
如果你将单括号 > 改为双括号 >> ,echo会将该字符串添加到temp文件的末尾而不是去覆盖它的内容【有的时候是直接添加,有的时候又是换行后再添加,目前懒癌发作,不想研究】
echo: >> temp.acf
如果你想先强制换行,再写自己的字符串,就可以将上面这条和第二条配合使用
请注意下面这个坑:
echo %~dp0EVENTS\%%~ni\%%~ni.adm > temp.acf
如果你想把某个路径存到文件中, %~dp0 后面不能加 \, 否则你就会有两个 \\,这是个bug
4. 新建文件夹
mkdir EVENTS
此语句和下面这个
mkdir %~dp0\EVENTS
语句效果是一样的,如果你想在别的路径下生成EVENTS这个文件夹,自己添加路径即可
由于用copy或者echo命令都会自动生成文件,所以你并不需要去专门知道新建文件的命令
5.复制文件
copy %~dp0\endtime.txt %~dp0\EVENTS\endtime.txt
和Linux里一样,没啥好说的,如果文件不存在会自动帮你生成。 batch没有剪切粘贴命令,有个命令好像还不能用相对路径(忘了,也懒得查),用绝对路径还有个毛的移植性,很蠢
6.删除文件/文件夹
del/q/f %~dp0\EVENTS
del/q/f %~dp0\command.bat
/q means quite,不会再在cmd里面问你一遍输入[Y/N],完全自动化
/f means force, 强制删除,这一点很重要。当时尝试用 rd命令,结果删除不了(貌似是文件被应用程序占用了),但是用 del/f 就可以
7.查找文件内的特定字符串
findstr "ACCGRAV" temp1.acf >> temp.acf
temp1文件中所有带有“ACCGRAV”字符串的行,都会被复制到temp文件中【注意区分大小写】
findstr /v "SIMULATE" temp2.acf >> temp.acf
/v means reverse 所有不带“SIMULATE”字符串的行都会被存到temp文件中
应该也可以用正则表达式,有待研究
8. for循环
for /r %%i in (*.rsp) do (
)
/r means root, for循环会搜索该文件夹和子文件夹
%%i 这个i是形参,上面for循环的意思是它会遍历整个文件夹,对每个.rsp文件执行一次for循环内的命令,这里的%%i是当前这个.rsp文件
for /r %%i in (*.rsp) do (
set filename = %%~ni
set file = %%i
copy %%i %~dp0\EVENTS\%%~ni\RLDA.rsp
copy %~dp0\INPUT\*.adm %~dp0\EVENTS\%%~ni\%%~ni.adm
)
%%~ni 是.rsp文件的名字
%%i 是当前的.rsp文件,你可以把i换成h,j 这只是个形参,不影响【再啰嗦一次】
第一个copy是把当前的.rsp复制到EVENT下面与当前.rsp文件同名的子文件夹里面,并将其重命名为RLDA
第二个copy也差不多,重命名为与当前.rsp文件相同的名字
9. 对文件内容分块处理 【1】
for /f "tokens=2,3 delims=. " %%a in (singleline.txt) do echo %%a %%b >> runtime.txt
/f means file, 与 delims 配合使用。 对指定的某一个文件(貌似只能是txt,待验证)for循环每次处理一行,根据你在delims后面定义的条件来将该行分割成块,每一块为一个token。然后根据你在tokens后面定义的数字来对指定的tokens执行 do 后面的命令
比如上句,会以singleline文件中每行里面的点号 . 为参考将其分块,并将每行的第2,第3块依次存到runtime这个文件中。 %%a 代表第2个token,%%b代表第3个token,a,b都是形参
for /f "tokens=2,3 delims=<space> " %%a in (runtime.txt) do (
echo SIMULATE/STATICS,END=%%a.%%b,STEPS=%%a%%b >> temp.acf
)
另一个例子,以空格为分割符。
也可以配合正则表达式使用
注意,前方有坑:
for /f "tokens=2,3 delims=. " %%a in (singleline.txt) do echo %%a %%b >> runtime.txt
有的时候delims 必须以空格为结束(双引号前必须为空格),不然就不能正常工作,有毒
Reference:
1. https://ss64.com/nt/for_f.html
谢谢大家收看本期的吐槽大会,我们下篇不见不散