上週被底盤組的同事抓差去幫他們寫個自動化腳本,我看出來了,電池組的也躍躍欲試→_→
由於微軟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
謝謝大家收看本期的吐槽大會,我們下篇不見不散