Windows的bat指令碼中for迴圈

來源:互聯網
上載者:User
【刪除目錄下某種格式的檔案 】 for /r  f:\\study %i in (*.o) do del %i
DOS迴圈:bat/批處理for命令詳解之一2010-06-04 22:00格式:FOR [參數] %%變數名 IN (相關檔案或命令)    DO 執行的命令      作用:對一個或一組檔案,字串或命令結果中的每一個對象執行特定命令,達到我們想要的結果。      注意:在批次檔中使用 FOR 命令時,指定變數請使用 %%variable,而不要用 %variable。變數名稱是區分大小寫,所以 %i 不同於 %I.      關於:for命令可以帶參數或不帶參數,帶參數時支援以下參數:/d /l /r /f      下面分別解釋一下         ===      零:無參數時:      ---      FOR %variable IN (set) DO command [command-parameters]      %variable   指定一個單一字母可替換的參數。      (set)       指定一個或一組檔案。可以使用萬用字元。      command     指定對每個檔案執行的命令。      command-parameters      為特定命令指定參數或命令列開關。         TTT樣本:      for %%i in (t*.*) do echo %%i --顯示目前的目錄下與t*.*相匹配的檔案(只顯示檔案名稱,不顯示路徑)      for %%i in (d:\\mydocuments\\*.doc) do @echo %%i --顯示d:\\mydocuments\\目錄下與*.doc相匹配的檔案         ===      一、參數 /d (參數只能顯示目前的目錄下的目錄名字)      ---      格式:FOR /D %variable IN (set) DO command [command-parameters]      這個參數主要用於目錄搜尋,不會搜尋檔案,/D 參數只能顯示目前的目錄下的目錄名字。(TTT特別說明:只會搜尋指定目錄下的目錄,不會搜尋再下一級的目錄。)         TTT樣本:      for /d %%i in (c:\\*) do echo %%i   --顯示c盤根目錄下的所有目錄      for /d %%i in (???) do echo %%i   --顯示目前的目錄下名字只有1-3個字母的目錄         ===      二、參數 /R (搜尋指定路徑及所有子目錄中與set相符合的所有檔案)      ---      格式:FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]      此命令會搜尋指定路徑及所有子目錄中與set相符合的所有檔案,注意是指定路徑及所有子目錄。         1、set中的檔案名稱如果含有萬用字元(?或*),則列舉/R參數指定的目錄及其下面的所用子目錄中與set相符合的所有檔案,無相符檔案的目錄則不列舉。      2、如果set中為具體檔案名稱,不含萬用字元,則枚舉該分類樹(即列舉該目錄及其下面的所有子目錄)(並在後面加上具體的檔案名稱),而不管set中的指定檔案是否存在。      例:for /r c:\\ %%i in (*.exe) do echo %%i --把C盤根目錄,和每個目錄的子目錄下面全部的EXE檔案都列出來了!!!!         TTT樣本:      for /r c:\\ %%i in (boot.ini) do echo %%i --枚舉了c盤所有目錄      for /r d:\\backup %%i in (1) do echo %%i   --枚舉d\\backup目錄      for /r c:\\ %%i in (boot.ini) do if exist %%i echo %%i   --很好的搜尋命令,列舉boot.ini存在的目錄         ===      三、參數 /L (該集表示以增量形式從開始到結束的一個數字序列。可以使用負的 Step)      ---      格式:FOR /L %variable IN (start,step,end) DO command [command-parameters]      該集表示以增量形式從開始到結束的一個數字序列。可以使用負的 Step         TTT樣本:      for /l %%i in (1,1,5) do @echo %%i   --輸出1 2 3 4 5      for /l %%i in (1,2,10) do @echo %%i   --輸出1,3,5,7,9      for /l %%i in (100,-20,1) do @echo %%i   --輸出100,80,60,40,20      for /l %%i in (1,1,5) do start cmd   --開啟5個CMD視窗      for /l %%i in (1,1,5) do md %%i   --建立從1~5共5個檔案夾      for /l %%i in (1,1,5) do rd /q %%i   --刪除從1~5共5個檔案夾    DOS迴圈:bat/批處理for命令詳解之一 (史上雖詳盡的總結和說明~~)轉自:http://www.yoyotao.net/ttt/post/137.htmlhttp://blog.csdn.net/weikaifenglove/archive/2009/10/22/4714253.aspx+++格式:FOR [參數] %%變數名 IN (相關檔案或命令)   DO 執行的命令作用:對一個或一組檔案,字串或命令結果中的每一個對象執行特定命令,達到我們想要的結果。注意:在批次檔中使用 FOR 命令時,指定變數請使用 %%variable,而不要用 %variable。變數名稱是區分大小寫,所以 %i 不同於 %I.關於:for命令可以帶參數或不帶參數,帶參數時支援以下參數:/d /l /r /f下面分別解釋一下===零:無參數時:---FOR %variable IN (set) DO command [command-parameters]%variable  指定一個單一字母可替換的參數。(set)      指定一個或一組檔案。可以使用萬用字元。command    指定對每個檔案執行的命令。command-parameters為特定命令指定參數或命令列開關。TTT樣本:for %%i in (t*.*) do echo %%i --顯示目前的目錄下與t*.*相匹配的檔案(只顯示檔案名稱,不顯示路徑) for %%i in (d:\\mydocuments\\*.doc) do @echo %%i --顯示d:\\mydocuments\\目錄下與*.doc相匹配的檔案===一、參數 /d (參數只能顯示目前的目錄下的目錄名字)---格式:FOR /D %variable IN (set) DO command [command-parameters]這個參數主要用於目錄搜尋,不會搜尋檔案,/D 參數只能顯示目前的目錄下的目錄名字。(TTT特別說明:只會搜尋指定目錄下的目錄,不會搜尋再下一級的目錄。)TTT樣本:for /d %%i in (c:\\*) do echo %%i  --顯示c盤根目錄下的所有目錄for /d %%i in (???) do echo %%i  --顯示目前的目錄下名字只有1-3個字母的目錄===二、參數 /R (搜尋指定路徑及所有子目錄中與set相符合的所有檔案)---格式:FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]此命令會搜尋指定路徑及所有子目錄中與set相符合的所有檔案,注意是指定路徑及所有子目錄。1、set中的檔案名稱如果含有萬用字元(?或*),則列舉/R參數指定的目錄及其下面的所用子目錄中與set相符合的所有檔案,無相符檔案的目錄則不列舉。2、如果set中為具體檔案名稱,不含萬用字元,則枚舉該分類樹(即列舉該目錄及其下面的所有子目錄)(並在後面加上具體的檔案名稱),而不管set中的指定檔案是否存在。例:for /r c:\\ %%i in (*.exe) do echo %%i --把C盤根目錄,和每個目錄的子目錄下面全部的EXE檔案都列出來了!!!!TTT樣本:for /r c:\\ %%i in (boot.ini) do echo %%i --枚舉了c盤所有目錄for /r d:\\backup %%i in (1) do echo %%i  --枚舉d\\backup目錄for /r c:\\ %%i in (boot.ini) do if exist %%i echo %%i  --很好的搜尋命令,列舉boot.ini存在的目錄===三、參數 /L (該集表示以增量形式從開始到結束的一個數字序列。可以使用負的 Step)---格式:FOR /L %variable IN (start,step,end) DO command [command-parameters]該集表示以增量形式從開始到結束的一個數字序列。可以使用負的 StepTTT樣本:for /l %%i in (1,1,5) do @echo %%i  --輸出1 2 3 4 5for /l %%i in (1,2,10) do @echo %%i  --輸出1,3,5,7,9 for /l %%i in (100,-20,1) do @echo %%i  --輸出100,80,60,40,20for /l %%i in (1,1,5) do start cmd  --開啟5個CMD視窗for /l %%i in (1,1,5) do md %%i  --建立從1~5共5個檔案夾for /l %%i in (1,1,5) do rd /q %%i  --刪除從1~5共5個檔案夾 四、參數 /F (使用檔案解析來處理命令輸出、字串及檔案內容。)---這個參數是最難的,參數又多,先簡單的解釋一下:for命令帶這個參數可以分析檔案內容,字串內容或某一命令輸出的結果,並通過設定option得我們想要的結果。以下是某高手的解釋,感覺有點太專業了,自認為不太容易理解,也列一下:[迭代及檔案解析--使用檔案解析來處理命令輸出、字串及檔案內容。使用迭代變數定義要檢查的內容或字串,並使用各種options選項進一步修改解析方式。使用options令牌選項指定哪些令牌應該作為迭代變數傳遞。請注意:在沒有使用令牌選項時,/F 將只檢查第一個令牌。檔案解析過程包括讀取輸出、字串或檔案內容,將其分成獨立的文本行以及再將每行解析成零個或更多個令牌。然後通過設定為令牌的迭代變數值,調用 for 迴圈。預設情況下,/F 傳遞每個檔案每一行的第一個空白分隔字元號。跳過空行。]+++格式:FOR /F [\"options\"] %variable IN (file-set) DO command [command-parameters]FOR /F [\"options\"] %variable IN (\"string\") DO command [command-parameters]FOR /F [\"options\"] %variable IN (\'command\') DO command [command-parameters]或者,如果有 usebackq 選項:FOR /F [\"options\"] %variable IN (file-set) DO command [command-parameters]FOR /F [\"options\"] %variable IN (\"string\") DO command [command-parameters]FOR /F [\"options\"] %variable IN (\'command\') DO command [command-parameters]TTT說明:以上是WinXP系統中的協助內容,你可以注意到,兩者完全相同,這其實是系統的錯誤,第二段“如果有 usebackq 選項:”應該以下的內容:FOR /F [\"options\"] %variable IN (\"file-set\") DO command [command-parameters]FOR /F [\"options\"] %variable IN (\'string\') DO command [command-parameters]FOR /F [\"options\"] %variable IN (`command`) DO command [command-parameters] --(`command`中的引號為反引號,是鍵盤上數字1左面的那個鍵)+++(TTT說明:下面是詳細的解釋,大部分是系統中的協助內容,也有些錯誤(怪不得for命令這麼難學),已經被我糾正了。)1) OPTION關鍵字詳解:eol=c:指一個行注釋字元的結尾(就一個)。例如:eol=; --忽略以分號打頭的那些行;skip=n:指在檔案開始時忽略的行數。例如:skip=2 --忽略2行;delims=xxx:指分隔字元集。這個替換了空格和跳格鍵的預設分隔符號集。例如:[delims=, ] --指定用逗號,空格對字串進行分隔。tokens=x,y,m-n:指每行的哪一個符號被傳遞到每個迭代的 for 本身。這會導致額外變數名稱的分配。m-n格式為一個範圍。通過 nth 符號指定 mth。如果符號字串中的最後一個字元是星號,那麼額外的變數將在最後一個符號解析之後分配並接受行的保留文本。例如:tokens=2,3* --將每行中的第二個和第三個符號傳遞給 for 程式體;tokens=2,3* ... i%  --將會把取到的第二個字串賦給i%,第三個賦給j%,剩下的賦給k%。關於usebackq,不同版本的系統提示不同的協助,不過都有助於理解,所以都摘抄如下:(1),usebackq:使用後引號(鍵盤上數字1左面的那個鍵`)。未使用參數usebackq時:file-set表示檔案,不能加引號,所以不 能含有空格;加雙引號表示字串,即\"string\";加單引號表示執行命令,即\'command\'。使用參數usebackq時:file-set 和\"file-set\"都表示檔案,當檔案路徑或名稱中有空格時,就可以用雙引號括起來;單引號表示字串,即\'string\';後引號表示命令執行,即 `command`。(此段是WinXP系統中的協助)(2),usebackq:指定新文法已在下類情況中使用:在作為命令執行一個後引號的字串;並且一個單引號字元為文字字串命令;並允許在filenameset中使用雙引號擴起檔案名稱。以上兩條結合著看,其實已經可以明白了,我再說明一下:其實這個參數的目的就是為了處理帶有空格的檔案名稱。如果您要處理的檔案名稱和路徑中含有空格,如果直接使用,會提示找不到檔案。如果你用雙引號將檔案名稱和 路徑括起來。這時候將作為字串處理,而不是作為檔案了。為了應對這種情況,所以才增加了這個“usebackq”參數。如果使用了這個參數,對於括弧中 的加雙引號的集合,系統就可以認為是檔案了;真正的字串要加單引號;命令要加反引號。2) file-set 為一個或多個檔案名稱。繼續到 file-set 中的下一個檔案之前,每份檔案都已被開啟、讀取並經過處理。處理包括讀取檔案,將其分成一行行的文字,然後將每行解析成零或更多的符號。然後用已找到的符 號字串變數值調用 For 迴圈。以預設,/F 通過每個檔案的每一行中分開的第一個空白符號。跳過空白行。您可通過指定可選 \"options\"參數替代預設解析操作。這個帶引號的字串包括一個或多個指定不同解析選項的關鍵字。3) %i:專門在 for 語句中得到說明,%j 和 %k 是通過tokens= 選項專門得到說明的。您可以通過 tokens= 一行指定最多 26 個符號,只要不試圖說明一個高於字母 \'z\' 或\'Z\' 的變數。請記住,FOR 變數是單一字母、分大小寫和全域的;而且,同時不能有 52 個以上都在使用中。(TTT補充說明:一般在tokens後只指定第一個參數,如%%i或%%a,在後面使用第二個及兩個以上的 參數,自動按順序往下排即可。如前面指定的是%%a,後面則用%%b代表第二個結果,%%c代表第 三個結果。。。測試了一下tokens後指定多個變數名,沒有測試成功,應該是不可以的。所以token後只能跟要使用的第一個變數名如果使用的變數名超過了%z或%Z,就無法使用了,曾經以為會迴圈過來:如%%z後可以使用%%a或%%A,但經測試,這是不可以的。如:for /f \"tokens=1,2,3* delims=-, \" %%y in (\"aa bb,cc-dd ee\") do echo %%y %%z %%A %%a --只會輸出前兩個字串,後面的兩個變數是無效的。)+++以下是系統提供的範例:FOR /F \"eol=; tokens=2,3* delims=, \" %i in (myfile.txt) do @echo %i %j %k --說明:會分析 myfile.txt 中的每一行,eol=; --忽略以分號打頭的那些行;tokens=2,3* --將每行中的第二個和第三個符號傳遞給 for 程式體;delims= , --用逗號和/或空格定界符號。%i --這個 for 程式體的語句引用 %i 來取得取得的首個字串(本例中為第二個符號),引用 %j 來取得第二個字串(本例中為第三個符號)引用 %k來取得第三個符號後的所有剩餘符號。(TTT說明:上述例子和說明中明顯的錯誤,%i應該換為%%i(協助中有明確的說明:指定變數請使用 %%variable,而不要用 %variable,誤導)+++TTT:下面列我做的幾個例子:1,分析檔案的例子FOR /F \"eol=; tokens=1,2* delims=,- \" %%i in (d:\\test.txt) do echo %%i %%j %%k2,分析字串的例子:for /f \"tokens=1,2,3* delims=-, \" %%i in (\"aa bb,cc-dd ee\") do echo %%i %%j %%k %%l3,分析命令輸出的例子:FOR /F \"tokens=1* delims==\" %%i IN (\'set\') DO @echo [%%i----%%j]如果使用了usebackq參數後,命令如下,結果與上面的完全相同。1,分析檔案的例子FOR /F \"usebackq eol=; tokens=1,2* delims=,- \" %%i in (\"d:\\test.txt\") do echo %%i %%j %%k2,分析字串的例子:for /f \"usebackq tokens=1,2,3* delims=-, \" %%i in (\'aa bb,cc-dd ee\') do echo %%i %%j %%k %%l3,分析命令輸出的例子:(會枚舉當前環境中的環境變數名稱和值。)FOR /F \"usebackq tokens=1* delims==\" %%i IN (`set`) DO @echo [%%i----%%j]結果大家可以試一下,很容易就明白的。FOR命令中的變數 ---FOR 變數參照的替換已被增強。您現在可以使用下列選項文法:~I         - 刪除任何引號(\"),擴充 %I%~fI        - 將 %I 擴充到一個完全合格的路徑名%~dI        - 僅將 %I 擴充到一個磁碟機代號%~pI        - 僅將 %I 擴充到一個路徑%~nI        - 僅將 %I 擴充到一個檔案名稱%~xI        - 僅將 %I 擴充到一個副檔名%~sI        - 擴充的路徑只含有短名%~aI        - 將 %I 擴充到檔案的檔案屬性%~tI        - 將 %I 擴充到檔案的日期/時間%~zI        - 將 %I 擴充到檔案的大小%~$PATH:I   - 尋找列在路徑環境變數的目錄(TTT提示:是環境變數path的目錄),並將 %I 擴充到找到的第一個完全合格的名稱。如果環境變數名未被定義,或者沒有找到檔案,此按鍵組合會擴充到Null 字元串此外,還可以組合修飾符來得到多重結果:%~dpI       - 僅將 %I 擴充到一個磁碟機代號和路徑%~nxI       - 僅將 %I 擴充到一個檔案名稱和副檔名%~fsI       - 僅將 %I 擴充到一個帶有短名的完整路徑名%~dp$PATH:i - 尋找列在路徑環境變數的目錄,並將 %I 擴充到找到的第一個磁碟機代號和路徑。 %~ftzaI     - 將 %I 擴充到類似輸出線路的 DIR在以上例子中,%I 和 PATH 可用其他有效數值代替。%~ 文法用一個有效 FOR 變數名終止。選取類似 %I 的大寫變數名比較易讀,而且避免與不分大小寫按鍵組合混淆。(以上是系統協助的內容)我們可以看到每行都有一個大寫字母\"I\",這個I其實就是我們在FOR帶入的變數,例如:FOR /F \"usebackq eol=; tokens=1,2* delims=,- \" %%x in (\"d:\\test.txt\") do echo %%x %%y %%z這裡我們就要把那個x,y,z改成%~fx,%~fy,%~fz。+++TTT特例:以下是我根據以上說明作的一個綜合的例子,可以直接複製到記事本裡,儲存為bat格式(c盤下任一目錄),運行後,可以直觀的看到擴充後的效果。@echo offecho ---顯示\"dir c:\\boot.ini /b /ah\"for /f \"delims==\" %%i in (\'dir c:\\boot.ini /b /ah\') do echo 不擴充變數 %%ifor /f \"delims==\" %%i in (\'dir c:\\boot.ini /b /ah\') do echo 擴充變數到~fI %%~fi --擴充到一個完全合格的路徑名for /f \"delims==\" %%i in (\'dir c:\\boot.ini /b /ah\') do echo 擴充變數到~dI %%~di --僅將變數擴充到一個磁碟機代號for /f \"delims==\" %%i in (\'dir c:\\boot.ini /b /ah\') do echo 擴充變數到~pI %%~pi --僅將變數擴充到一個路徑for /f \"delims==\" %%i in (\'dir c:\\boot.ini /b /ah\') do echo 擴充變數到~nI %%~ni --僅將變數擴充到一個檔案名稱for /f \"delims==\" %%i in (\'dir c:\\boot.ini /b /ah\') do echo 擴充變數到~xI %%~xi --僅將變數擴充到一個副檔名for /f \"delims==\" %%i in (\'dir c:\\boot.ini /b /ah\') do echo 擴充變數到~sI %%~si --擴充的路徑只含有短名for /f \"delims==\" %%i in (\'dir c:\\boot.ini /b /ah\') do echo 擴充變數到~aI %%~ai --將變數擴充到檔案的檔案屬性for /f \"delims==\" %%i in (\'dir c:\\boot.ini /b /ah\') do echo 擴充變數到~tI %%~ti --將變數擴充到檔案的日期/時間for /f \"delims==\" %%i in (\'dir c:\\boot.ini /b /ah\') do echo 擴充變數到~zI %%~zi --將變數擴充到檔案的大小for /f \"delims==\" %%i in (\'dir c:\\boot.ini /b /ah\') do echo 擴充變數到~$PATH:I %%~$PATH:i --尋找列在路徑環境變數的目錄,並將變數擴充到找到的第一個完全合格的名稱echo ---以下顯示組合修飾符來得到多重結果---:for /f \"delims==\" %%i in (\'dir c:\\boot.ini /b /ah\') do echo 擴充變數到~dpI %%~dpi --僅將變數擴充到一個磁碟機代號和路徑for /f \"delims==\" %%i in (\'dir c:\\boot.ini /b /ah\') do echo 擴充變數到~nxI %%~nxi --僅將變數擴充到一個檔案名稱和副檔名for /f \"delims==\" %%i in (\'dir c:\\boot.ini /b /ah\') do echo 擴充變數到~fsI %%~fsI --僅將變數擴充到一個帶有短名的完整路徑名for /f \"delims==\" %%i in (\'dir c:\\boot.ini /b /ah\') do echo 擴充變數到~dp$PATH:I %%~dp$PATH:i --尋找列在路徑環境變數的目錄,並將變數擴充到找到的第一個磁碟機代號和路徑for /f \"delims==\" %%i in (\'dir c:\\boot.ini /b /ah\') do echo 擴充變數到~ftzaI %%~ftzai --將變數擴充到類似輸出線路的DIRecho.echo ---顯示\"dir C:\\WINDOWS\\system32\\notepad.exe /b\"for /f \"delims==\" %%i in (\'dir C:\\WINDOWS\\system32\\notepad.exe /b\') do echo 不擴充變數 %%ifor /f \"delims==\" %%i in (\'dir C:\\WINDOWS\\system32\\notepad.exe /b\') do echo 擴充變數到~fI %%~fi --擴充到一個完全合格的路徑名for /f \"delims==\" %%i in (\'dir C:\\WINDOWS\\system32\\notepad.exe /b\') do echo 擴充變數到~dI %%~di --僅將變數擴充到一個磁碟機代號for /f \"delims==\" %%i in (\'dir C:\\WINDOWS\\system32\\notepad.exe /b\') do echo 擴充變數到~pI %%~pi --僅將變數擴充到一個路徑for /f \"delims==\" %%i in (\'dir C:\\WINDOWS\\system32\\notepad.exe /b\') do echo 擴充變數到~nI %%~ni --僅將變數擴充到一個檔案名稱for /f \"delims==\" %%i in (\'dir C:\\WINDOWS\\system32\\notepad.exe /b\') do echo 擴充變數到~xI %%~xi --僅將變數擴充到一個副檔名for /f \"delims==\" %%i in (\'dir C:\\WINDOWS\\system32\\notepad.exe /b\') do echo 擴充變數到~sI %%~si --擴充的路徑只含有短名for /f \"delims==\" %%i in (\'dir C:\\WINDOWS\\system32\\notepad.exe /b\') do echo 擴充變數到~aI %%~ai --將變數擴充到檔案的檔案屬性for /f \"delims==\" %%i in (\'dir C:\\WINDOWS\\system32\\notepad.exe /b\') do echo 擴充變數到~tI %%~ti --將變數擴充到檔案的日期/時間for /f \"delims==\" %%i in (\'dir C:\\WINDOWS\\system32\\notepad.exe /b\') do echo 擴充變數到~zI %%~zi --將變數擴充到檔案的大小for /f \"delims==\" %%i in (\'dir C:\\WINDOWS\\system32\\notepad.exe /b\') do echo 擴充變數到~$PATH:I %%~$PATH:i --尋找列在路徑環境變數的目錄,並將變數擴充到找到的第一個完全合格的名稱echo ---以下顯示組合修飾符來得到多重結果---:for /f \"delims==\" %%i in (\'dir C:\\WINDOWS\\system32\\notepad.exe /b\') do echo 擴充變數到~dpI %%~dpi --僅將變數擴充到一個磁碟機代號和路徑for /f \"delims==\" %%i in (\'dir C:\\WINDOWS\\system32\\notepad.exe /b\') do echo 擴充變數到~nxI %%~nxi --僅將變數擴充到一個檔案名稱和副檔名for /f \"delims==\" %%i in (\'dir C:\\WINDOWS\\system32\\notepad.exe /b\') do echo 擴充變數到~fsI %%~fsI --僅將變數擴充到一個帶有短名的完整路徑名for /f \"delims==\" %%i in (\'dir C:\\WINDOWS\\system32\\notepad.exe /b\') do echo 擴充變數到~dp$PATH:I %%~dp$PATH:i --尋找列在路徑環境變數的目錄,並將變數擴充到找到的第一個磁碟機代號和路徑for /f \"delims==\" %%i in (\'dir C:\\WINDOWS\\system32\\notepad.exe /b\') do echo 擴充變數到~ftzaI %%~ftzai --將變數擴充到類似輸出線路的DIRPauseTTT說明:1,以上命令中,%%~fsI無法顯示,估計是系統錯誤,因為%%~fI是擴充到一個完全合格的路徑名,%%~sI只含有短檔案名稱,本身是相互矛盾的,所以出錯。不知是系統的錯誤還是在考我們~~2,以上命令如果儲存在別的盤中,無法顯示正確的磁碟機和路徑。3,如果想要%%~dp$PATH:i正常顯示,要保證環境變數path中確實有這個路徑:C:\\WINDOWS\\system32。下面依次說明一下:+++一、 ~I       - 刪除任何引號(\"),擴充 %I---這個變數的作用就如他的說明,刪除引號!刪除引號規則如下(BAT兄補充!):1、若字串首尾同時存在引號,則刪除首尾的引號;2、若字串尾不存在引號,則刪除字串首的引號;3、如果字串中間存在引號,或者只在尾部存在引號,則不刪除。龍捲風補充:無頭不刪,有頭連尾刪。我們來看這個例子,首先建立臨時檔案temp.txt,內容如下\"1111\"2222\"3333\"\"4444\"44\"55\"55\"55也可建立個BAT檔案代碼如下:@echo offecho ^\"1111>temp.txtecho \"2222\">>temp.txtecho 3333^\">>temp.txtecho \"4444\"44>>temp.txtecho ^\"55\"55\"55>>temp.txtrem 上面建立臨時檔案,注意不成對的引號要加逸出字元^,重新導向符號前不要留空格FOR /F \"delims=\" %%i IN (temp.txt) DO echo   %%~ipausedel temp.txt執行後,我們看CMD的回顯如下:1111           #字串前的引號被刪除了2222           #字串首尾的引號都被刪除了3333\"       #字串前無引號,後面的引號保留4444\"44        #字串前面的引號刪除了,而中間的引號保留55\"55\"55    #字串前面的引號刪除了,而中間的引號保留請按任意鍵繼續. . .結果和之前temp.txt中的內容對比一下,我們會發現第1、2、5行的引號都消失了,這就是刪除引號~i的作用了!+++二、 %~fI        - 將 %I 擴充到一個完全合格的路徑名樣本:把代碼儲存放在隨便哪個地方,我這裡就放案頭吧.FOR /F \"delims==\" %%i IN (\'dir /b\') DO @echo   %%~fipause執行後顯示內容如下C:\\Documents and Settings\\Administrator\\案頭\\test.batC:\\Documents and Settings\\Administrator\\案頭\\test.vbs當我把代碼中的 %%~fi直接改成%%iFOR /F \"delims==\" %%i IN (\'dir /b\') DO @echo   %%ipause執行後就會顯示以下內容:test.battest.vbs通過對比,我們很容易就看出沒有路徑了,這就是\"將 %I 擴充到一個完全合格的路徑名\"的作用,也就是如果%i變數的內容是一個檔案名稱的話,他就會把這個檔案所在的絕對路徑列印出來,而不只單單列印一個檔案名稱,自己動手動實驗下就知道了!+++三、 %~dI        - 僅將 %I 擴充到一個磁碟機代號看例子:代碼如下,我還是放到案頭執行!FOR /F \"delims==\" %%i IN (\'dir /b\') DO @echo   %%~dipause執行後我CMD裡顯示如下C:C:我案頭就兩個檔案test.bat,test.vbs,%%~di作用是,如果變數%%i的內容是一個檔案或者目錄名,他就會把他這檔案或者目錄所在的盤符號列印出來!+++四、 %~pI        - 僅將 %I 擴充到一個路徑這個用法和上面一樣,他只列印路徑不列印檔案名字FOR /F \"delims==\" %%i IN (\'dir /b\') DO @echo   %%~pipause我就不打結果了,大家自己複製代碼看結果吧,下面幾個都是這麼個用法,代碼給出來,大家自己看結果吧!+++五、 %~nI        - 僅將 %I 擴充到一個檔案名稱只列印檔案名字FOR /F \"delims==\" %%i IN (\'dir /b\') DO @echo   %%~nipause+++六、 %~xI        - 僅將 %I 擴充到一個副檔名只列印檔案的副檔名FOR /F \"delims==\" %%i IN (\'dir /b\') DO @echo   %%~xipause+++七、 %~sI        - 擴充的路徑只含有短名列印絕對短檔案名稱FOR /F \"delims==\" %%i IN (\'dir /b\') DO @echo   %%~sipause+++八、 %~aI        - 將 %I 擴充到檔案的檔案屬性列印檔案的屬性FOR /F \"delims==\" %%i IN (\'dir /b\') DO @echo   %%~aipause+++九、 %~tI        - 將 %I 擴充到檔案的日期/時間列印檔案建立的日期FOR /F \"delims==\" %%i IN (\'dir /b\') DO @echo   %%~tipause+++十、 %~zI        - 將 %I 擴充到檔案的大小列印檔案的大小FOR /F \"delims==\" %%i IN (\'dir /b\') DO @echo   %%~zipause龍捲風補充:上面例子中的\"delims==\"可以改為\"delims=\",即不要分隔字元+++十一、 %~$PATH:I - 尋找列在路徑環境變數的目錄,並將 %I 擴充到找到的第一個完全合格的名稱。如果環境變數名未被定義,或者沒有找到檔案,此按鍵組合會擴充到Null 字元串這是最後一個,和上面那些都不一樣,我單獨說說!然後在把這些代碼儲存為批處理,放在案頭。@echo offFOR /F \"delims=\" %%i IN (“notepad.exe”) DO echo   %%~$PATH:ipause龍捲風補充:上面代碼顯示結果為C:\\WINDOWS\\system32\\notepad.exe他的意思就在PATH變數裡指定的路徑裡搜尋notepad.exe檔案,如果有notepad.exe則會把他所在絕對路徑列印出來,沒有就列印一個錯誤!(TTT說明,儲存到案頭上,運行顯示結果為:系統找不到檔案 “notepad.exe”。查看環境變數path中確實有這個路徑,不明原因!後來發現了,原來是中文引號的原因。上面的命令應該寫成:FOR /F \"delims=\" %%i IN (\"notepad.exe\") DO echo   %%~$PATH:i )
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.