您現在的位置是:首頁 > 音樂首頁音樂
嘔心整理Windows平臺批處理指令碼程式設計筆記之for語句
必須是批處理中僅有的語句是什麼意思
Flutter開發工具中的Batch指令碼
在 cmd。exe 命令列視窗中,FOR 語句的標準格式是:
FOR [for-args] %variable in (set) do command [command-parameters]
在 dos 批處理指令碼中,FOR 語句應該是:
FOR [for-args] %%variable in (set) do command [command-parameters]
注意指令碼中變數使用 %% 兩個百分號。FOR 語句的變數名只能是單個字母,並且不分大小寫,因此 %%i 和 %%I 是同一個變數。
舉個簡單例子,下面指令碼將顯示當前目錄下所有的 txt 檔名:
FOR %%i in (*。txt) do @echo %%i
/D 引數
如果要顯示目錄下的含 driver 字尾的資料夾名,則要將 for-args 填充 /d 引數:
FOR /d %%i in (*driver) do @echo %%i
/R 引數
除了 /d 引數,還有 /r 引數,表示遍歷指定目錄下的所有檔案和資料夾,包含子資料夾,格式如下:
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
比如要查詢 C 盤下的 boot。ini 檔案,如果存在的話顯示出來的指令碼如下:
FOR /r c:/ %%i in (boot。ini) do if exist %%i @echo %%i
/L 引數
這個引數用於列舉一個數字序列,比如要遍歷從 1 到 10 的單數序列,可以使用下面指令碼:
FOR /l %%n in (1,2,10) do @echo %%i
序列使用 (start,step,end) 表示,而且 step 可以是負數。
/F 引數
這個引數有三種功能,分別用於遍歷檔案內容,字串或命令輸出結果。其使用方法是:
FOR /f [“options”] %%variable in (file-set) do command [command-params]FOR /f [“options”] %%variable in (“string-set”) do command [command-params]FOR /f [“options”] %%variable in (‘command1’) do command [command-params]
使用 /f 引數的 FOR 語句時,要注意 options 選項的使用:
“eol=c” 表示忽略以 c 開頭的行,比如 “eol=;” 表示忽略分號開頭的註釋行
“skip=n“ 表示忽略檔案開頭的 n 行
“delims=xxx” 指定分隔符號集,預設以空格及 Tab 為分隔符,比如 ”delims=, “ 表示以逗號和空格進行分割
“tokens=x,y,m-n” 用於分配每行中不同欄位賦給的變數,舉一下用法說明:FOR /f ”tokens=2,3*“ %%i in 。。。 將每行中分割的第二個字串賦值給 %%i 變數,第三個字串賦值給 %%j 變數,由於後面加個 * 號,表示接著將第四、五……個字串賦值給 %%k, %%l, 。。。 變數。FOR /F ”tokens=1* delims==“ %%i in (‘command1’) do 。。。 用於分析命令 command1 執行時形如 key=value 的輸出結果,key 儲存在 %%i 變數,value值儲存在 %%j 變數
“usebackq” 用於改變 ` 反括號的用法
當指定了 ”usebackq“ 這個選項時,FOR /f 的語法格式改變如下:
FOR /f [”options“] %%variable in (file-set) do command [command-params]FOR /f [”options“] %%variable in (”file-set“) do command [command-params]FOR /f [”options“] %%variable in (‘string-set’) do command [command-params]FOR /f [”options“] %%varaible in (`command1`) do command [command-params]
注意 (file-set) 和 (”file-set“) 都用於列舉檔案內容,字串列舉則用單引號表示了,而列舉命令輸出則順延使用反括號表示。為什麼呢?因為當我們要列舉含空格的檔名的檔案時,不指定 ”usebackq“ 會被分成兩個檔案,只有使用 “usebackq” 選項並用雙引號括起帶空格的檔名來解決。
以幾個具體例子感受下 FOR /f 語句的功能:
分析檔案內容
FOR /f ”eol=; tokens=2,3* delims=, “ %%i in (myfile。txt) do @echo %i %j %k
假設 myfile。txt 檔案內容如下:
; 這行內容忽略first,10,baidu。comsecond,20,taobao。comthrid,30,jd。com
則指令碼執行時輸出結果為:
first 10 baidu。comsecond 20 taobao。comthrid 30 jd。com
分析字串
FOR /f ”tokens=1,2,3* delims=-, “ %%i in (”aa bb,cc-dd ee“) do @echo %%i %%j %%k %%l
上行指令碼執行時 %%i,%%j,%%k,%%l 分別賦值為 aa, bb, cc, dd, ee 。
分析命令輸出
FOR /f ”tokens=1* delims==“ %% i in (echo key1=value1) do @echo %%i——-%%j
上行指令碼執行輸出 key1——-value1 ,即 %%i 和 %%j 分別賦值 key1 和 value1 。
使用 ”usebackq“ 時分析帶空格的檔名的檔案內容
FOR /f ”usebackq eol=; tokens=1,2 delims==“ %%i in (”c:/program files/mysoft/config。ini“) do @echo %%i——-%%j
do 命令中的變數增強
FOR 語句中的 do 命令中的變數能夠進行擴充,功能如下:
%%~fi 將 %%i 擴充為檔案路徑(含當前檔名)
%%~di 將 %%i 擴充為磁碟碟符
%%~pi 將 %%i 擴充為檔案路徑(不含當前檔名)
%%~ni 將 %%i 擴充為當前檔名
%%~xi 將%%i 擴充為副檔名
%%~si 將 %%i 擴充為短路徑名(相對路徑)
%%~ai 將 %%i 擴充為檔案屬性
%%~ti 將 %%i 擴充為檔案日期及時間
%%~zi 將 %%i 擴充為檔案大小
%%~$PATH:i 將 %%i 擴充為在 PATH 環境變數指定路徑的搜尋到的完成路徑名,如果搜尋失敗,擴充為空字串
%%~dpi 將 %%i 擴充為磁碟碟符加短路徑名
%%~nxi 將 %%i 擴充為檔名加副檔名
%%~fsi 將 %%i 擴充為含短路徑名的完成路徑名
%%~dp$PATH:i 將 %i 擴充為在 PATH 環境裡搜尋到的帶磁碟碟符的檔案路徑名
%%~ftzai 將 %i 擴充為類似 DIR 語句輸出行的字串
注意上面的變數名不區分大小寫,如果是在 cmd 命令列視窗直接執行,則將兩個 %% 符號替換為一個 % 符號。
下面我直接在命令列視窗中測試上面的變數擴充套件功能,拋磚引玉揭示 FOR /f 的用法,## 為我手動新增的註釋,> 後面是我輸出的命令,緊挨其後的是輸出結果:
## 當前路徑 C:/User/volfasa>cdC:/Users/volfasa## 建立檔案內容為”one, two, three“的 test。txt 檔案>echo one, two, three >test。txt## 將值為”test。txt“的變數 %I 進行擴充測試>for /f %I in (”test。txt“) do @echo %~fIC:\Users\volfasa\test。txt>for /f %I in (”test。txt“) do @echo %~dIC:>for /f %I in (”test。txt“) do @echo %~pI\Users\volfasa\>for /f %I in (”test。txt“) do @echo %~nItest>for /f %I in (”test。txt“) do @echo %~xI。txt>for /f %I in (”test。txt“) do @echo %~aI——a————>for /f %I in (”test。txt“) do @echo %~tI2020/02/28 14:39>for /f %I in (”test。txt“) do @echo %~zI18>for /f %I in (”test。txt“) do @echo %~dpIC:\Users\jt12\>for /f %I in (”test。txt“) do @echo %~nxItest。txt>for /f %I in (”test。txt“) do @echo %~fsIC:\Users\jt12\test。txt>for /f %I in (”test。txt“) do @echo %~ftzaI——a———— 2020/02/28 14:39 18 C:\Users\jt12\test。txt
本節完!