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 

 

謝謝大家收看本期的吐槽大會,我們下篇不見不散

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