終極dos批處理循環命令詳解
格式:FOR [參數] %%變量名 IN (相關文件或命令) DO 執行的命令
做用:對一個或一組文件,字符串或命令結果中的每個對象執行特定命令,達到咱們想要的結果。
注意:在批處理文件中使用 FOR 命令時,指定變量請使用 %%variable,而不要用 %variable。變量名稱是區分大小寫的,因此 %i 不一樣於 %I.
關於:for命令能夠帶參數或不帶參數,帶參數時支持如下參數:/d /l /r /f
下面分別解釋一下dom
===
零:無參數時:
---
FOR %variable IN (set) DO command [command-parameters]
%variable 指定一個單一字母可替換的參數。
(set) 指定一個或一組文件。可使用通配符。
command 指定對每一個文件執行的命令。
command-parameters
爲特定命令指定參數或命令行開關。ide
TTT示例:
for %%i in (t*.*) do echo %%i --顯示當前目錄下與t*.*相匹配的文件(只顯示文件名,不顯示路徑)
for %%i in (d:\mydocuments\*.doc) do @echo %%i --顯示d:\mydocuments\目錄下與*.doc相匹配的文件
===
1、參數 /d (參數只能顯示當前目錄下的目錄名字)
---
格式:FOR /D %variable IN (set) DO command [command-parameters]
這個參數主要用於目錄搜索,不會搜索文件,/D 參數只能顯示當前目錄下的目錄名字。(TTT特別說明:只會搜索指定目錄下的目錄,不會搜索再下一級的目錄。)oop
TTT示例:
for /d %%i in (c:\*) do echo %%i --顯示c盤根目錄下的全部目錄
for /d %%i in (???) do echo %%i --顯示當前目錄下名字只有1-3個字母的目錄測試
===
2、參數 /R (搜索指定路徑及全部子目錄中與set相符合的全部文件)
---
格式:FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
此命令會搜索指定路徑及全部子目錄中與set相符合的全部文件,注意是指定路徑及全部子目錄。ui
一、set中的文件名若是含有通配符(?或*),則列舉/R參數指定的目錄及其下面的所用子目錄中與set相符合的全部文件,無相符文件的目錄則不列舉。
二、若是set中爲具體文件名,不含通配符,則枚舉該目錄樹(即列舉該目錄及其下面的全部子目錄)(並在後面加上具體的文件名),而無論set中的指定文件是否存在。
例:for /r c:\ %%i in (*.exe) do echo %%i --把C盤根目錄,和每一個目錄的子目錄下面所有的EXE文件都列出來了!!!!idea
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存在的目錄spa
===
3、參數 /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個文件夾設計
4、參數 /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]rest
或者,若是有 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 %%k
2,分析字符串的例子:
for /f "tokens=1,2,3* delims=-, " %%i in ("aa bb,cc-dd ee") do echo %%i %%j %%k %%l
3,分析命令輸出的例子:
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 %%k
2,分析字符串的例子:
for /f "usebackq tokens=1,2,3* delims=-, " %%i in ('aa bb,cc-dd ee') do echo %%i %%j %%k %%l
3,分析命令輸出的例子:(會枚舉當前環境中的環境變量名稱和值。)
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 擴充到找到的第一個徹底合格的名稱。若是環境變量名未被定義,或者沒有找到文件,此組合鍵會擴充到空字符串
此外,還能夠組合修飾符來獲得多重結果:
%~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 off
echo ---顯示"dir c:\boot.ini /b /ah"
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 不擴展變量 %%i
for /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 --將變量擴充到相似輸出線路的DIR
echo.
echo ---顯示"dir C:\WINDOWS\system32\notepad.exe /b"
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 不擴展變量 %%i
for /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 --將變量擴充到相似輸出線路的DIR
Pause
TTT說明:
1,以上命令中,%%~fsI沒法顯示,估計是系統錯誤,由於%%~fI是擴充到一個徹底合格的路徑名,%%~sI只含有短文件名,自己是相互矛盾的,因此出錯。不知是系統的錯誤仍是在考咱們~~
2,以上命令若是保存在別的盤中,沒法顯示正確的驅動器和路徑。
3,若是想要%%~dp$PATH:i正常顯示,要保證環境變量path中確實有這個路徑:C:\WINDOWS\system32。
下面依次說明一下:
+++
1、 ~I - 刪除任何引號("),擴展 %I
---
這個變量的做用就如他的說明,刪除引號!
刪除引號規則以下(BAT兄補充!):
一、若字符串首尾同時存在引號,則刪除首尾的引號;
二、若字符串尾不存在引號,則刪除字符串首的引號;
三、若是字符串中間存在引號,或者只在尾部存在引號,則不刪除。
龍捲風補充:無頭不刪,有頭連尾刪。
咱們來看這個例子,首先創建臨時文件temp.txt,內容以下
"1111
"2222"
3333"
"4444"44
"55"55"55
也可創建個BAT文件代碼以下:
@echo off
echo ^"1111>temp.txt
echo "2222">>temp.txt
echo 3333^">>temp.txt
echo "4444"44>>temp.txt
echo ^"55"55"55>>temp.txt
rem 上面創建臨時文件,注意不成對的引號要加轉義字符^,重定向符號前不要留空格
FOR /F "delims=" %%i IN (temp.txt) DO echo %%~i
pause
del temp.txt
執行後,咱們看CMD的回顯以下:
1111 #字符串前的引號被刪除了
2222 #字符串首尾的引號都被刪除了
3333" #字符串前無引號,後面的引號保留
4444"44 #字符串前面的引號刪除了,而中間的引號保留
55"55"55 #字符串前面的引號刪除了,而中間的引號保留
請按任意鍵繼續. . .
結果和以前temp.txt中的內容對比一下,咱們會發現第一、二、5行的引號都消失了,這就是刪除引號~i的做用了!
+++
2、 %~fI - 將 %I 擴展到一個徹底合格的路徑名
示例:
把代碼保存放在隨便哪一個地方,我這裏就放桌面吧.
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~fi
pause
執行後顯示內容以下
C:\Documents and Settings\Administrator\桌面\test.bat
C:\Documents and Settings\Administrator\桌面\test.vbs
當我把代碼中的 %%~fi直接改爲%%i
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%i
pause
執行後就會顯示如下內容:
test.bat
test.vbs
經過對比,咱們很容易就看出沒有路徑了,這就是"將 %I 擴展到一個徹底合格的路徑名"的做用,也就是若是%i變量的內容是一個文件名的話,他就會把這個文件所在的絕對路徑打印出來,而不僅單單打印一個文件名,本身動手動實驗下就知道了!
+++
3、 %~dI - 僅將 %I 擴展到一個驅動器號
看例子:
代碼以下,我仍是放到桌面執行!
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~di
pause
執行後我CMD裏顯示以下
C:
C:
我桌面就兩個文件test.bat,test.vbs,%%~di做用是,若是變量%%i的內容是一個文件或者目錄名,他就會把他這文件或者目錄所在的盤符號打印出來!
+++
4、 %~pI - 僅將 %I 擴展到一個路徑
這個用法和上面同樣,他只打印路徑不打印文件名字
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~pi
pause
我就不打結果了,你們本身複製代碼看結果吧,下面幾個都是這麼個用法,代碼給出來,你們本身看結果吧!
+++
5、 %~nI - 僅將 %I 擴展到一個文件名
只打印文件名字
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ni
pause
+++
6、 %~xI - 僅將 %I 擴展到一個文件擴展名
只打印文件的擴展名
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~xi
pause
+++
7、 %~sI - 擴展的路徑只含有短名
打印絕對短文件名
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~si
pause
+++
8、 %~aI - 將 %I 擴展到文件的文件屬性
打印文件的屬性
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ai
pause
+++
9、 %~tI - 將 %I 擴展到文件的日期/時間
打印文件創建的日期
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ti
pause
+++
10、 %~zI - 將 %I 擴展到文件的大小
打印文件的大小
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~zi
pause
龍捲風補充:上面例子中的"delims=="能夠改成"delims=",即不要分隔符
+++
11、 %~$PATH:I - 查找列在路徑環境變量的目錄,並將 %I 擴展到找到的第一個徹底合格的名稱。若是環境變量名未被定義,或者沒有找到文件,此組合鍵會擴展到空字符串
這是最後一個,和上面那些都不同,我單獨說說!
而後在把這些代碼保存爲批處理,放在桌面。
@echo off
FOR /F "delims=" %%i IN (「notepad.exe」) DO echo %%~$PATH:i
pause
龍捲風補充:上面代碼顯示結果爲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
)
最後發一個用批處理作一五子棋遊戲:
@echo off&setlocal enabledelayedexpansion
mode con: lines=43 cols=110
set li39= A B C D E F G H I J K L M N O P Q R S
set li0= ┌─────────────────────────────────────┐
set li1=A│┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐│A
set var=1
for %%a in (!li39:~5^,-1!) do (set/a var+=2&set li!var!=%%a│├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤│%%a)
for /l %%a in (2,2,36) do (set li%%a= ││ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ││)
set li37=S│└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘│S
set li38= └─────────────────────────────────────┘
set str=a b c d e f g h i j k l m n o p q r s
for %%a in (%str%) do (set/a .+=1,%%a=.&set z!.!=%%a)
set li5=!li5! 五 棋 子 人 機 對 戰
set li7=!li7! 批 處 理
set li10=!li10! 電 腦 水 平 中 等
set li31=!li31! 由 netbenton 編寫完成
set li33=!li33! 棋盤設計參照了 batman
title 批處理五子棋
set str=###################
set .=0
for /l %%a in (1,1,19) do (
set he%%a=!str!&set sh%%a=!str!
for /l %%b in (1,1,19) do set [%%a.%%b=0
)
set .=33
for /l %%a in (5,1,19) do (
set pi%%a=!str:~,%%a!&set ni%%a=!str:~,%%a!
set pi!.!=!str:~,%%a!&set ni!.!=!str:~,%%a!
set/a .-=1
)
set ●=○&set ○=●
set zhi=●
set say=say
::設置電腦IQ
set idea=@@@@#.1 #@@@@.5 @#@@@.4 @@@#@.2 @@#@@.3 vs0
#.1 #
.5
.3 $#
$#$.2 vs1#@@@##.2 ##@@@#.5 #@@#@#.3 #@#@@#.4 vs2 #@##@@#.4-5 #@@##@#.4-3 #@#@@.3-5 @#@@#.4-1 #@@@##.2-W-1##@@@#.5-W-6 vs3
set idea=!idea! ##@@@.4-W-5 @@@##.2-W-1 @##@@#.4-5 #@##@@.3-4 #@#@#@.4-2 @#@#@#.3-5 vs4 #
#.4-W-1-6 ##
#$#.5-W-1-6 #
$##.2-W-1-6 vs5 ##@@##.2-5-W-6-1 #@#@#.3-w-1-5 ##
$##.W-2-1
.W-3-4 $#
#$.W-2-5 ##
##.W-2-W-1-5 #$#$#.W-3-W-1-5 #$##$#.W-3-4
set idea=!idea! vs7 #$$$#.1-5 @@###.4-3 ###@@.3-4 ###@###.3-5-W-2-6-W-1-7 vs8 ###$###.3-5 vs9 @####.4 ####@.2 #$###.3 ###$#.3
set idea=!idea! ###@#.3 #@###.3 $####.3 ####$.3
.3 $#$##.2 ##$#$.4 #$##$.3 $##$#.3 $###$.3 vs10
set iqam=1000000000
:restart
(
setlocal enabledelayedexpansion
for /l %%a in (0,1,39) do (echo !li%%a!)
set li39=!li39! reboot從新開始,exit退出。
set li37=!li37! back 悔棋
set /p var=選擇誰先下[ W,玩家 D,電腦 Q,退出 ]:
if /i "!var!" equ "Q" goto :quit
if /i "!var!" equ "D" (set onez=○&set towz=●&set hou=☆) else (set onez=●&set towz=○&set hou=★)
set a!onez!=電腦&set a!towz!=玩家
)
(
set ttr=!idea=%onez%!&set ttr=!ttr=%towz%!
set idea=
for %%a in (!ttr!) do (
for /f "tokens=1,2 delims=." %%b in ("%%a") do (set %%b=%%c&set idea=!idea! %%b)
)
set ttr=
set li27=!li27! !onez! !a%onez%!
set li25=!li25! !towz! !a%towz%!
set/a pos=10,poh=10&goto :getok
)
:loop
(if %zhi% equ %onez% goto :men
set .=
setlocal enabledelayedexpansion
for %%a in (!idea!) do (
set str=%%a
if "!str:~,2!" neq "vs" (
for %%b in (he sh) do (
set all=!%%b1!!%%b2!!%%b3!!%%b4!!%%b5!!%%b6!!%%b7!!%%b8!!%%b9!!%%b10!!%%b11!!%%b12!!%%b13!!%%b14!!%%b15!!%%b16!!%%b17!!%%b18!!%%b19!
if "!all:%%a=!" neq "!all!" (
for /l %%c in (1,1,19) do (
if "!%%b%%c:%%a=!" neq "!%%b%%c!" set/a .+=1&set put!.!=%%b %%c.%%a.!iqam!
)
) )
for %%b in (pi ni) do (
set all=!%%b5!!%%b6!!%%b7!!%%b8!!%%b9!!%%b10!!%%b11!!%%b12!!%%b13!!%%b14!!%%b15!!%%b16!!%%b17!!%%b18!!%%b19!!%%b20!!%%b21!!%%b22!!%%b23!!%%b24!!%%b25!!%%b26!!%%b27!!%%b28!!%%b29!!%%b30!!%%b31!!%%b32!!%%b33!
if "!all:%%a=!" neq "!all!" (
for /l %%c in (5,1,33) do (
if "!%%b%%c:%%a=!" neq "!%%b%%c!" set/a .+=1&set put!.!=%%b %%c.%%a.!iqam!
)
) )
) else (
set/a "iqam=(iqam+1)/8"
if %%a equ vs8 if defined . goto :get
if %%a equ vs9 if defined . goto :get
)
))
if defined . (goto :get)
echo. 已經和棋了
pause
endlocal&goto :restart
:men
(
set/a .=lips-1&for /f "tokens=1-3" %%b in ("li!liph! !lips! !.!") do (set %%b=!%%b:~0,%%d!%hou%!%%b:~%%c!)
set li38=!li38![%悔:~,24%]
cls
for /l %%a in (0,1,39) do (echo !li%%a!)
for /f "tokens=1-3" %%b in ("li!liph! !lips! !.!") do (set %%b=!%%b:~0,%%d!%zhi%!%%b:~%%c!)
set li38=%li38%
set /p user=!say:say=%error%! [列前,行後]:
if "!user!" equ "reboot" endlocal&goto :restart
if "!user!" equ "exit" goto :quit
if "!user!" equ "back" call :悔&goto :men
set/a pos=!user:~0,1!,poh=!user:~1,2!,var=pos-1 2>nul
if not defined [!poh!.!pos! set error=輸入點不存在 &goto :men
)
if "!he%poh%:~%var%,1!" neq "#" set error=該點已經有子 &goto men
goto :getok
:get
set `=
::取最佳的走法
for /l %%z in (!.!,-1,1) do (
for /f "tokens=1,2,3 delims=." %%1 in ("!put%%z!") do (
for /f "tokens=1-4" %%a in ("%%1 %%2") do (
set iqm=%%3
set vara=!%%a%%b:*%%c=!srqponmlkjihgfedcba0
for %%4 in (!%%2:-^=;!) do (
if "%%4" equ "W" (set/a iqm=iqm/5*3) else (
set/a var=!vara:~19,1!+%%4
if "%%a" equ "he" (set/a poh=%%b,pos=20-var)
if "%%a" equ "sh" (set/a poh=20-var,pos=%%b)
if %%b lss 19 (set/a var=%%b-var+1) else (set/a var=38-%%b-var+1)
if "%%a" equ "pi" (if %%b lss 19 (set/a pos=var,poh=%%b-var+1) else (set/a poh=20-var,pos=%%b-19+var))
if "%%a" equ "ni" (if %%b lss 19 (set/a pos=var,poh=19-%%b+var) else (set/a poh=var,pos=%%b-19+var))
if not defined R!pos!R!poh!R set /a `+=1&set ram!`!=R!pos!R!poh!R
set/a R!pos!R!poh!R+=iqm
)
)
)
)
)
set rmk=0
for /l %%a in (1,1,!`!) do (
for %%b in (!ram%%a!) do (
for %%c in (!%%b!) do (
if %%c gtr !rmk! set/a rmk=%%c,.=0
if %%c equ !rmk! set rmz!.!=%%b&set/a .+=1
)
) )
set/a .=!random!%%.
for /f "tokens=1,2 delims=R" %%a in ("!rmz%.%!") do (set/a pos=%%a,poh=%%b)
rem start set r^&echo !.!^&pause^&exit
endlocal&set/a pos=%pos%,poh=%poh%set say=say !z%pos%!!z%poh%!(%poh%)&set error=電腦最後下在::getokset zhi=!%zhi%!&set win=!zhi!!zhi!!zhi!!zhi!!zhi!(set/a piph=poh+pos-1,lips=pos*2+1,niph=19+pos-poh,liph=poh*2-1if !piph! lss 19 (set/a pips=pos) else (set/a pips=20-poh)if !niph! lss 19 (set/a nips=pos) else (set/a nips=poh)for %%a in ("li!liph! !lips!" "he!poh! !pos!" "sh!pos! !poh!" "pi!piph! !pips!" "ni!niph! !nips!") do ( for /f "tokens=1,2" %%b in (%%a) do ( set/a .=%%c-1 for %%d in (!.!) do (set %%b=!%%b:~0,%%d!%zhi%!%%b:~%%c!) if "!%%b:%win%=!" neq "!%%b!" set win=y )))(set/a asc%zhi%+=1set 悔= !z%pos%!!z%poh%!!悔!if !win! neq y goto :loop)for /l %%a in (0,1,39) do (echo !li%%a!)set/p= !a%zhi%! %zhi%子 第!asc%zhi%!手 !z%pos%!!z%poh%!(%poh%) 勝出 <nulpauseendlocal&goto :restart:悔if not defined 悔 goto :eofif "!悔:~6,1!" equ "" goto :eoffor %%a in (!悔:~^,6!) do (set str=%%aset/a poh=!str:~-1!,pos=!str:~,1!set/a piph=poh+pos-1,niph=19+pos-poh,liph=poh*2-1,lips=pos*2+1if !piph! lss 19 (set/a pips=pos) else (set/a pips=20-poh)if !niph! lss 19 (set/a nips=pos) else (set/a nips=poh)for %%a in ( "he!poh! !pos!" "sh!pos! !poh!" "pi!piph! !pips!" "ni!niph! !nips!") do ( for /f "tokens=1,2" %%b in (%%a) do ( set/a .=%%c-1 for %%d in (!.!) do (set %%b=!%%b:~0,%%d!#!%%b:~%%c!) ))for /f "tokens=1,2" %%b in ("li!liph! !lips!") do ( set/a .=%%c-1 for %%d in (!.!) do (set %%b=!%%b:~0,%%d!┼!%%b:~%%c!)))set/a asc%zhi%-=1set 悔=!悔:~6!set error=你悔棋,耍賴皮!if not defined 悔 goto :eofset/a poh=!悔:~2,1!,pos=!悔:~1,1!,liph=poh*2-1,lips=pos*2+1set say=say !z%pos%!!z%poh%!(%poh%)goto :eof:quittaskkill /fi "WINDOWTITLE eq 批處理五子棋*" /im cmd.exe