您現在的位置是:首頁 > 音樂首頁音樂

嘔心整理Windows平臺批處理指令碼程式設計筆記之for語句

由 灰飛湮滅Plus 發表于 音樂2021-06-21
簡介ini“) do @echo %%i——-%%jdo 命令中的變數增強FOR 語句中的 do 命令中的變數能夠進行擴充,功能如下:%%~fi 將 %%i 擴充為檔案路徑(含當前檔名)%%~di 將 %%i 擴充為磁碟碟符%%~pi 將 %

必須是批處理中僅有的語句是什麼意思

嘔心整理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

本節完!