Windows batch脚本自动化

上周被底盘组的同事抓差去帮他们写个自动化脚本,我看出来了,电池组的也跃跃欲试→_→

由于微软batch知识点非常的杂,我又是上一周现学现卖,在此我尽量将结构写得清楚一些,希望以后自己还能看得懂这篇博客。。。

PS:【以下内容主要包括 提取文件的名字,批量生成文件夹,文件的复制和删除,文件盒文件夹的改名, 查找/提取文件内容的关键字,替换文件内容】

     【考虑到公司保密协定,并不能贴源码】

 

目录:

  1. 使用局部变量
  2. 相对路径的使用
  3. 将字符串存入指定文件中
  4. 新建文件夹
  5. 复制文件
  6. 删除文件/文件夹
  7. 查找文件内的特定字符串
  8. for循环
  9. 对文件内容分块处理

-------------------------------------------------------------以下为正文---------------------------------------------------------------

 

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 

 

谢谢大家收看本期的吐槽大会,我们下篇不见不散

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章