批处理命令 For循环命令具体解释!
FOR這條命令基本上都被用來處理文本,但還有其它一些好用的功能!
看看他的基本格式(這里我引用的是批處理中的格式,直接在命令行僅僅須要一個(gè)%號(hào))
FOR 參數(shù) %%變量名 IN (相關(guān)文件或命令) DO 運(yùn)行的命令
參數(shù):FOR有4個(gè)參數(shù) /d /l /r /f 他們的作用我在以下用樣例解釋
%%變量名 :這個(gè)變量名能夠是小寫a-z或者大寫A-Z,他們區(qū)分大寫和小寫,FOR會(huì)把每一個(gè)讀取到的值給他;
IN:命令的格式,照寫就是了;
(相關(guān)文件或命令) :FOR要把什么東西讀取然后賦值給變量,看以下的樣例
do:命令的格式,照寫就是了!
運(yùn)行的命令:對(duì)每一個(gè)變量的值要運(yùn)行什么操作就寫在這.
能夠在CMD輸入for /?看系統(tǒng)提供的幫助!對(duì)照一下
FOR %%variable IN (set) DO command [command-parameters]
?? %%variable?? 指定一個(gè)單一字母可替換的參數(shù)。
?? (set) ?? 指定一個(gè)或一組文件。能夠使用通配符。
?? command 指定對(duì)每一個(gè)文件運(yùn)行的命令。
?? command-parameters
?? ?? ?? 為特定命令指定參數(shù)或命令行開關(guān)。
如今開始講每一個(gè)參數(shù)的意思
/d
僅為文件夾
假設(shè) Set (也就是我上面寫的 "相關(guān)文件或命令") 包括通配符(* 和 ?),將對(duì)與 Set 相匹配的每一個(gè)目
錄(而不是指定文件夾中的文件組)運(yùn)行指定的 Command。
系統(tǒng)幫助的格式:FOR /D %%variable IN (set) DO command
他主要用于文件夾搜索,不會(huì)搜索文件,看這種樣例
@echo off
for /d %%i in (*) do @echo %%i
pause
把他保存放在C盤根文件夾運(yùn)行,就會(huì)把C盤文件夾下的所有文件夾名字打印出來,而文件名稱字一個(gè)也不顯示!
在來一個(gè),比方我們要把當(dāng)前路徑下文件夾的名字僅僅有1-3個(gè)字母的打出來
@echo off
for /d %%i in (???) do @echo %%i
pause
這種話假設(shè)你當(dāng)前文件夾下有文件夾名字僅僅有1-3個(gè)字母的,就會(huì)顯示出來,沒有就不顯示了
思考題目:
@echo off
for /d %%i in (window?) do @echo %%i
pause
保存到C盤下運(yùn)行,會(huì)顯示什么呢?自己看吧!
/D參數(shù)僅僅能顯示當(dāng)前文件夾下的文件夾名字,這個(gè)大家要注意!
/R
遞歸
進(jìn)入根文件夾樹 [Drive:]Path,在樹的每一個(gè)文件夾中運(yùn)行 for 語句。假設(shè)在 /R 后沒有指定文件夾,則覺得是
當(dāng)前文件夾。假設(shè) Set 僅僅是一個(gè)句點(diǎn) (.),則僅僅枚舉文件夾樹。
系統(tǒng)幫助的格式:FOR /R [[drive:]path] %%variable IN (set) DO command
上面我們知道,/D僅僅能顯示當(dāng)前路徑下的文件夾名字,那么如今這個(gè)/R也是和文件夾有關(guān),他能干嘛呢?放心他比
/D強(qiáng)大多了!
他能夠把當(dāng)前或者你指定路徑下的文件名稱字所有讀取,注意是文件名稱字,有什么用看樣例!
@echo off
for /r c:/ %%i in (*.exe) do @echo %%i
pause
咋們把這個(gè)BAT保存到D盤隨便哪里然后運(yùn)行,我會(huì)就會(huì)看到,他把C盤根文件夾,和每一個(gè)文件夾的子文件夾以下所有
的EXE文件都列出來了,這里的c:/就是文件夾了。
再來一個(gè)
@echo off
for /r %%i in (*.exe) do @echo %%i
pause
參數(shù)不一樣了,這個(gè)命令前面沒加那個(gè)C:/也就是搜索路徑,這樣他就會(huì)以當(dāng)前文件夾為搜索路徑,比方你這
個(gè)BAT你把他防災(zāi)d:/test文件夾下運(yùn)行,那么他就會(huì)把D:/test文件夾和他以下的子文件夾的所有EXE文件列出
來!!!
/L
迭代數(shù)值范圍
使用迭代變量設(shè)置起始值 (Start#),然后逐步運(yùn)行一組范圍的值,直到該值超過所設(shè)置的終止值 (End#)
。/L 將通過對(duì) Start# 與 End# 進(jìn)行比較來運(yùn)行迭代變量。假設(shè) Start# 小于 End#,就會(huì)運(yùn)行該命令。
假設(shè)迭代變量超過 End#,則命令解釋程序退出此循環(huán)。還能夠使用負(fù)的 Step# 以遞減數(shù)值的方式逐步執(zhí)
行此范圍內(nèi)的值。比如,(1,1,5) 生成序列 1 2 3 4 5,而 (5,-1,1) 則生成序列 (5 4 3 2 1)。語法是:
系統(tǒng)幫助的格式:for /L %% Variable in (Start#,Step#,End#) do Command
比如:
@echo off
for /l %%i in (1,1,5) do @echo %%i
pause
保存運(yùn)行看效果,他會(huì)打印從1 2 3 4 5?? 這樣5個(gè)數(shù)字
(1,1,5)這個(gè)參數(shù)也就是表示從1開始每次加1直到5終止!
再看這個(gè)樣例
@echo off
for /l %%i in (1,1,5) do start cmd
pause
運(yùn)行后是不是嚇了一跳,怎么多了5個(gè)CMD窗體,呵呵!假設(shè)把那個(gè) (1,1,5)改成 (1,1,65535)會(huì)有什么結(jié)果,
我先告訴大家,會(huì)打開65535個(gè)CMD窗體....這么多你不死機(jī)算你強(qiáng)!
當(dāng)然我們也能夠把那個(gè)start cmd改成md %%i 這樣就會(huì)建立指定個(gè)文件夾了!!!名字為1-65535
看完這個(gè)被我賦予破壞性質(zhì)的參數(shù)后,我們來看最后一個(gè)參數(shù)
/f
含有/F的for具體說明
含有/F的for有非常大的用處,在批處理中使用的最多,使用方法例如以下:
格式:
FOR /F ["options"] %%i IN (file) DO command
FOR /F ["options"] %%i IN ("string") DO command
FOR /F ["options"] %%i IN ('command') DO command
這個(gè)可能是最經(jīng)常使用的,也是最強(qiáng)的命令,主要用來處理文件和一些命令的輸出結(jié)果。
file代表一個(gè)或多個(gè)文件
string 代表字符串
command代表命令
["options"] 可選
對(duì)于FOR /F %%i IN (file) DO command
file為文件名稱,依照官方的說法是,for會(huì)依次將file中的文件打開,而且在進(jìn)行到下一個(gè)文件之前將每一個(gè)文件讀取到內(nèi)存,依照每一行分成一個(gè)一個(gè)的元素,忽略空白的行,看個(gè)樣例。
假如文件a.txt中有例如以下內(nèi)容:
第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列
你想顯示a.txt中的內(nèi)容,會(huì)用什么命令呢?當(dāng)然是type,type a.txt
for也能夠完畢相同的命令:
for /f %%i in (a.txt) do echo %%i
還是先從括號(hào)運(yùn)行,由于含有參數(shù)/f,所以for會(huì)先打開a.txt,然后讀出a.txt里面的所有內(nèi)容,把它作為一個(gè)集合,而且以每一行作為一個(gè)元素,所以會(huì)產(chǎn)生這種集合,
{“第1行第1列 第1行第2列 第1行第3列”, //第一個(gè)元素
“第2行第1列 第2行第2列 第2行第3列”, //第二個(gè)元素
“第3行第1列 第3行第2列 第3行第3列”} //第三個(gè)元素
集合中僅僅有3個(gè)元素,相同用%%i依次取代每一個(gè)元素,然后運(yùn)行do后面的命令。
具體過程:
用%%i取代“第1行第1列 第1行第2列 第1行第3列”,運(yùn)行do后面的echo %%i,顯示“第1行第1列 第1行第2列 第1行第3列”,
用%%i取代“第2行第1列 第2行第2列 第2行第3列”,運(yùn)行echo %%i,顯示“第2行第1列 第2行第2列 第2行第3列”,
依次,直到每一個(gè)元素都取代完為止。
為了加強(qiáng)理解/f的作用,請(qǐng)運(yùn)行一下兩個(gè)命令,對(duì)照就可以明確:
for /f %%i in (a.txt) do echo %%i //這個(gè)會(huì)顯示a.txt里面的內(nèi)容,由于/f的作用,會(huì)讀出a.txt中
的內(nèi)容。
for %%i in (a.txt) do echo %%i //而這個(gè)僅僅會(huì)顯示a.txt這個(gè)名字,并不會(huì)讀取當(dāng)中的內(nèi)容。
通過上面的學(xué)習(xí),我們發(fā)現(xiàn)for /f會(huì)默認(rèn)以每一行來作為一個(gè)元素,可是假設(shè)我們還想把每一行再分解更小的內(nèi)容,該怎么辦呢?不用操心,for命令還為我們提供了更具體的參數(shù),使我們將每一行分為更小的元素成為可能。
它們就是:delims和tokens
delims 用來告訴for每一行應(yīng)該拿什么作為分隔符,默認(rèn)的分隔符是空格和tab鍵
比方,還是上面的文件,我們運(yùn)行以下的命令:
for /f "delims= " %%i in (a.txt) do echo %%i
顯示的結(jié)果是:
第1行第1列
第2行第1列
第3行第1列
為什么是這種呢。由于這里有了delims這個(gè)參數(shù),=后面有一個(gè)空格,意思是再將每一個(gè)元素以空格切割,默認(rèn)是僅僅取切割之后的第一個(gè)元素。
運(yùn)行過程是:
將第一個(gè)元素“第1行第1列 第1行第2列 第1行第3列”分成三個(gè)元素:“第1行第1列” “第1行第2列” “第1行第3列”,它默認(rèn)僅僅取第一個(gè),即“第1行第1列”,然后運(yùn)行do后面的命令,依次類推。
可是這樣還是有局限的,假設(shè)我們想要每一行的第二列元素,那又怎樣呢?
這時(shí)候,tokens跳出來說,我能做到。
它的作用就是當(dāng)你通過delims將每一行分為更小的元素時(shí),由它來控制要取哪一個(gè)或哪幾個(gè)。
還是上面的樣例,運(yùn)行例如以下命令:
for /f "tokens=2 delims= " %%i in (a.txt) do echo %%i
運(yùn)行結(jié)果:
第1行第2列
第2行第2列
第3行第2列
假設(shè)要顯示第三列,那就換成tokens=3。
同一時(shí)候tokens支持通配符*,以及限定范圍。
假設(shè)要顯示第二列和第三列,則換成tokens=2,3或tokens=2-3,假設(shè)還有很多其它的則為:tokens=2-10之類的。
此時(shí)的命令為:
for /f "tokens=2,3 delims= " %%i in (a.txt) do echo %%i %%j
怎么多出一個(gè)%%j?
這是由于你的tokens后面要取每一行的兩列,用%%i來替換第二列,用%%j來替換第三列。
而且必須是依照英文字母順序排列的,%%j不能換成%%k,由于i后面是j
運(yùn)行結(jié)果為:
第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列
對(duì)以通配符*,就是把這一行所有或者這一行的剩余部分當(dāng)作一個(gè)元素了。
比方:
for /f "tokens=* delims= " %%i in (a.txt) do echo %%i
運(yùn)行結(jié)果為:
第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列
事實(shí)上就跟for /f %%i in (a.txt) do echo %%i的運(yùn)行結(jié)果是一樣的。
再如:
for /f "tokens=2,* delims= " %%i in (a.txt) do echo %%i %%j
運(yùn)行結(jié)果為:
第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列
用%%i取代第二列,用%%j取代剩余的所有
最后還有skip合eol,這倆個(gè)簡單,skip就是要忽略文件的前多少行,而eol用來指定當(dāng)一行以什么符號(hào)開始時(shí),就忽略它。
比方:
for /f "skip=2 tokens=*" %%i in (a.txt) do echo %%i
結(jié)果為:
第3行第1列 第3行第2列 第3行第3列
用skip來告訴for跳過前兩行。
假設(shè)不加tokens=*的話,運(yùn)行結(jié)果為:
第3行第1列
不知道怎么回事。
再如,當(dāng)a.txt內(nèi)容變成:
.第1行第1列 第1行第2列 第1行第3列
.第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列
運(yùn)行for /f "eol=. tokens=*" %%i in (a.txt) do echo %%i結(jié)果是:
第3行第1列 第3行第2列 第3行第3列
用eol來告訴for忽略以“.”開頭的行。
相同也必須加tokens=*,否則僅僅會(huì)顯示“第3行第1列 ======================================================
終極dos批處理循環(huán)命令具體解釋
格式:FOR [參數(shù)] %%變量名 IN (相關(guān)文件或命令)?? DO 運(yùn)行的命令
作用:對(duì)一個(gè)或一組文件,字符串或命令結(jié)果中的每個(gè)對(duì)象運(yùn)行特定命令,達(dá)到我們想要的結(jié)果。
注意:在批處理文件里使用 FOR 命令時(shí),指定變量請(qǐng)使用 %%variable,而不要用 %variable。變量名稱是區(qū)分大寫和小寫的,所以 %i 不同于 %I.
關(guān)于:for命令能夠帶參數(shù)或不帶參數(shù),帶參數(shù)時(shí)支持以下參數(shù):/d /l /r /f
以下分別解釋一下
===
零:無參數(shù)時(shí):
---
FOR %variable IN (set) DO command [command-parameters]
%variable 指定一個(gè)單一字母可替換的參數(shù)。
(set)????? 指定一個(gè)或一組文件。能夠使用通配符。
command??? 指定對(duì)每一個(gè)文件運(yùn)行的命令。
command-parameters
為特定命令指定參數(shù)或命令行開關(guān)。
TTT演示樣例:
for %%i in (t*.*) do echo %%i --顯示當(dāng)前文件夾下與t*.*相匹配的文件(僅僅顯示文件名稱,不顯示路徑)
for %%i in (d:/mydocuments/*.doc) do @echo %%i --顯示d:/mydocuments/文件夾下與*.doc相匹配的文件
===
一、參數(shù) /d (參數(shù)僅僅能顯示當(dāng)前文件夾下的文件夾名字)
---
格式:FOR /D %variable IN (set) DO command [command-parameters]
這個(gè)參數(shù)主要用于文件夾搜索,不會(huì)搜索文件,/D 參數(shù)僅僅能顯示當(dāng)前文件夾下的文件夾名字。(TTT特別說明:僅僅會(huì)搜索指定文件夾下的文件夾,不會(huì)搜索再下一級(jí)的文件夾。)
TTT演示樣例:
for /d %%i in (c:/*) do echo %%i --顯示c盤根文件夾下的全部文件夾
for /d %%i in (???) do echo %%i --顯示當(dāng)前文件夾下名字僅僅有1-3個(gè)字母的文件夾
===
二、參數(shù) /R (搜索指定路徑及全部子文件夾中與set相符合的全部文件)
---
格式:FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
此命令會(huì)搜索指定路徑及全部子文件夾中與set相符合的全部文件,注意是指定路徑及全部子文件夾。
1、set中的文件名稱假設(shè)含有通配符(?或*),則列舉/R參數(shù)指定的文件夾及其以下的所用子文件夾中與set相符合的全部文件,無相符文件的文件夾則不列舉。
2、假設(shè)set中為詳細(xì)文件名稱,不含通配符,則枚舉該文件夾樹(即列舉該文件夾及其以下的全部子文件夾)(并在后面加上詳細(xì)的文件名稱),而無論set中的指定文件是否存在。
例:for /r c:/ %%i in (*.exe) do echo %%i --把C盤根文件夾,和每一個(gè)文件夾的子文件夾以下全部的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存在的文件夾
===
三、參數(shù) /L (該集表示以增量形式從開始到結(jié)束的一個(gè)數(shù)字序列。能夠使用負(fù)的 Step)
---
格式:FOR /L %variable IN (start,step,end) DO command [command-parameters]
該集表示以增量形式從開始到結(jié)束的一個(gè)數(shù)字序列。能夠使用負(fù)的 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個(gè)CMD窗體
for /l %%i in (1,1,5) do md %%i --建立從1~5共5個(gè)目錄
for /l %%i in (1,1,5) do rd /q %%i --刪除從1~5共5個(gè)目錄
四、參數(shù) /F (使用文件解析來處理命令輸出、字符串及文件內(nèi)容。)
---
這個(gè)參數(shù)是最難的,參數(shù)又多,先簡單的解釋一下:for命令帶這個(gè)參數(shù)能夠分析文件內(nèi)容,字符串內(nèi)容或某一命令輸出的結(jié)果,并通過設(shè)置option得我們想要的結(jié)果。
下面是某高手的解釋,感覺有點(diǎn)太專業(yè)了,自覺得不太easy理解,也列一下:
[迭代及文件解析--使用文件解析來處理命令輸出、字符串及文件內(nèi)容。使用迭代變量定義要檢查的內(nèi)容或字符串,并使用各種options選項(xiàng)進(jìn)一步改動(dòng)解析方式。使用options令牌選項(xiàng)指定哪些令牌應(yīng)該作為迭代變量傳遞。
請(qǐng)注意:在沒有使用令牌選項(xiàng)時(shí),/F 將僅僅檢查第一個(gè)令牌。文件解析過程包含讀取輸出、字符串或文件內(nèi)容,將其分成獨(dú)立的文本行以及再將每行解析成零個(gè)或很多其它個(gè)令牌。然后通過設(shè)置為令牌的迭代變量值,調(diào)用 for 循環(huán)。
默認(rèn)情況下,/F 傳遞每一個(gè)文件每一行的第一個(gè)空白分隔符號(hào)。跳過空行。]
+++
格式:
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]
或者,假設(shè)有 usebackq 選項(xiàng):
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系統(tǒng)中的幫助內(nèi)容,你能夠注意到,兩者全然同樣,這事實(shí)上是系統(tǒng)的錯(cuò)誤,第二段“假設(shè)有 usebackq 選項(xiàng):”應(yīng)該下面的內(nèi)容:
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`中的引號(hào)為反引號(hào),是鍵盤上數(shù)字1左面的那個(gè)鍵)
+++
(TTT說明:以下是具體的解釋,大部分是系統(tǒng)中的幫助內(nèi)容,也有些錯(cuò)誤(怪不得for命令這么難學(xué)),已經(jīng)被我糾正了。)
1) OPTIONkeyword具體解釋:
eol=c:指一個(gè)行凝視字符的結(jié)尾(就一個(gè))。比如:eol=; --忽略以分號(hào)打頭的那些行;
skip=n:指在文件開始時(shí)忽略的行數(shù)。比如:skip=2 --忽略2行;
delims=xxx:指分隔符集。這個(gè)替換了空格和跳格鍵的默認(rèn)分隔符集。比如:[delims=, ] --指定用逗號(hào),空格對(duì)字符串進(jìn)行分隔。
tokens=x,y,m-n:指每行的哪一個(gè)符號(hào)被傳遞到每一個(gè)迭代的 for 本身。這會(huì)導(dǎo)致額外變量名稱的分配。m-n格式為一個(gè)范圍。通過 nth 符號(hào)指定 mth。假設(shè)符號(hào)字符串中的最后一個(gè)字符是星號(hào),那么額外的變量將在最后一個(gè)符號(hào)解析之后分配并接受行的保留文本。比如:tokens=2,3* --將每行中的第二個(gè)和第三個(gè)符號(hào)傳遞給 for 程序體;tokens=2,3* ... i% --將會(huì)把取到的第二個(gè)字符串賦給i%,第三個(gè)賦給j%,剩下的賦給k%。
關(guān)于usebackq,不同版本號(hào)的系統(tǒng)提示不同的幫助,只是都有助于理解,所以都摘抄例如以下:
(1),usebackq:使用后引號(hào)(鍵盤上數(shù)字1左面的那個(gè)鍵`)。未使用參數(shù)usebackq時(shí):file-set表示文件,不能加引號(hào),所以不能含有空格;加雙引號(hào)表示字符串,即"string";加單引號(hào)表示運(yùn)行命令,即'command'。使用參數(shù)usebackq時(shí):file-set和"file-set"都表示文件,當(dāng)文件路徑或名稱中有空格時(shí),就能夠用雙引號(hào)括起來;單引號(hào)表示字符串,即'string';后引號(hào)表示命令運(yùn)行,即`command`。(此段是WinXP系統(tǒng)中的幫助)
(2),usebackq:指定新語法已在下類情況中使用:在作為命令運(yùn)行一個(gè)后引號(hào)的字符串;而且一個(gè)單引號(hào)字符為文字字符串命令;并同意在filenameset中使用雙引號(hào)擴(kuò)起文件名稱稱。
以上兩條結(jié)合著看,事實(shí)上已經(jīng)能夠明確了,我再說明一下:
事實(shí)上這個(gè)參數(shù)的目的就是為了處理帶有空格的文件名稱。假設(shè)您要處理的文件名稱和路徑中含有空格,假設(shè)直接使用,會(huì)提示找不到文件。假設(shè)你用雙引號(hào)將文件名稱和路徑括起來。這時(shí)候?qū)⒆鳛樽址幚?#xff0c;而不是作為文件了。為了應(yīng)對(duì)這樣的情況,所以才添加了這個(gè)“usebackq”參數(shù)。假設(shè)使用了這個(gè)參數(shù),對(duì)于括號(hào)里的加雙引號(hào)的集合,系統(tǒng)就能夠覺得是文件了;真正的字符串要加單引號(hào);命令要加反引號(hào)。
2) file-set 為一個(gè)或多個(gè)文件名稱。繼續(xù)到 file-set 中的下一個(gè)文件之前,每份文件都已被打開、讀取并經(jīng)過處理。處理包含讀取文件,將其分成一行行的文字,然后將每行解析成零或很多其它的符號(hào)。然后用已找到的符號(hào)字符串變量值調(diào)用 For 循環(huán)。以默認(rèn)方式,/F 通過每一個(gè)文件的每一行中分開的第一個(gè)空白符號(hào)。跳過空白行。您可通過指定可選 "options"參數(shù)替代默認(rèn)解析操作。這個(gè)帶引號(hào)的字符串包含一個(gè)或多個(gè)指定不同解析選項(xiàng)的keyword。
3) %i:專門在 for 語句中得到說明,%j 和 %k 是通過tokens= 選項(xiàng)專門得到說明的。您能夠通過 tokens= 一行指定最多 26 個(gè)符號(hào),僅僅要不試圖說明一個(gè)高于字母 'z' 或'Z' 的變量。請(qǐng)記住,FOR 變量是單一字母、分大寫和小寫和全局的;并且,同一時(shí)候不能有 52 個(gè)以上都在使用中。
(TTT補(bǔ)充說明:
一般在tokens后僅僅指定第一個(gè)參數(shù),如%%i或%%a,在后面使用第二個(gè)及兩個(gè)以上的參數(shù),自己主動(dòng)按順序往下排就可以。如前面指定的是%%a,后面則用%%b代表第二個(gè)結(jié)果,%%c代表第 三個(gè)結(jié)果。。。測(cè)試了一下tokens后指定多個(gè)變量名,沒有測(cè)試成功,應(yīng)該是不能夠的。所以token后僅僅能跟要使用的第一個(gè)變量名
假設(shè)使用的變量名超過了%z或%Z,就無法使用了,以前以為會(huì)循環(huán)過來:如%%z后能夠使用%%a或%%A,但經(jīng)測(cè)試,這是不能夠的。
如:for /f "tokens=1,2,3* delims=-, " %%y in ("aa bb,cc-dd ee") do echo %%y %%z %%A %%a --僅僅會(huì)輸出前兩個(gè)字符串,后面的兩個(gè)變量是無效的。)
+++
下面是系統(tǒng)提供的范例:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k --
說明:會(huì)分析 myfile.txt 中的每一行,
eol=; --忽略以分號(hào)打頭的那些行;
tokens=2,3* --將每行中的第二個(gè)和第三個(gè)符號(hào)傳遞給 for 程序體;
delims= , --用逗號(hào)和/或空格定界符號(hào)。
%i --這個(gè) for 程序體的語句引用 %i 來取得取得的首個(gè)字符串(本例中為第二個(gè)符號(hào)),引用 %j 來取得第二個(gè)字符串(本例中為第三個(gè)符號(hào))引用 %k來取得第三個(gè)符號(hào)后的全部剩余符號(hào)。
(TTT說明:上述樣例和說明中明顯的錯(cuò)誤,%i應(yīng)該換為%%i(幫助中有明白的說明:指定變量請(qǐng)使用 %%variable,而不要用 %variable,誤導(dǎo))
+++
TTT:以下列我做的幾個(gè)樣例:
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]
假設(shè)使用了usebackq參數(shù)后,命令例如以下,結(jié)果與上面的全然同樣。
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,分析命令輸出的樣例:(會(huì)枚舉當(dāng)前環(huán)境中的環(huán)境變量名稱和值。)
FOR /F "usebackq tokens=1* delims==" %%i IN (`set`) DO @echo [%%i----%%j]
結(jié)果大家能夠試一下,非常easy就明確的。
===
FOR命令中的變量
---
FOR 變量參照的替換已被增強(qiáng)。您如今能夠使用下列選項(xiàng)語法:
~I???????? - 刪除不論什么引號(hào)("),擴(kuò)充 %I
%~fI??????? - 將 %I 擴(kuò)充到一個(gè)全然合格的路徑名
%~dI??????? - 僅將 %I 擴(kuò)充到一個(gè)驅(qū)動(dòng)器號(hào)
%~pI??????? - 僅將 %I 擴(kuò)充到一個(gè)路徑
%~nI??????? - 僅將 %I 擴(kuò)充到一個(gè)文件名稱
%~xI??????? - 僅將 %I 擴(kuò)充到一個(gè)文件擴(kuò)展名
%~sI??????? - 擴(kuò)充的路徑僅僅含有短名
%~aI??????? - 將 %I 擴(kuò)充到文件的文件屬性
%~tI??????? - 將 %I 擴(kuò)充到文件的日期/時(shí)間
%~zI??????? - 將 %I 擴(kuò)充到文件的大小
%~$PATH:I?? - 查找列在路徑環(huán)境變量的文件夾(TTT提示:是環(huán)境變量path的文件夾),并將 %I 擴(kuò)充到找到的第一個(gè)全然合格的名稱。假設(shè)環(huán)境變量名未被定義,或者沒有找到文件,此組合鍵會(huì)擴(kuò)充到空字符串
此外,還能夠組合修飾符來得到多重結(jié)果:
%~dpI?????? - 僅將 %I 擴(kuò)充到一個(gè)驅(qū)動(dòng)器號(hào)和路徑
%~nxI?????? - 僅將 %I 擴(kuò)充到一個(gè)文件名稱和擴(kuò)展名
%~fsI?????? - 僅將 %I 擴(kuò)充到一個(gè)帶有短名的完整路徑名
%~dp$PATH:i - 查找列在路徑環(huán)境變量的文件夾,并將 %I 擴(kuò)充到找到的第一個(gè)驅(qū)動(dòng)器號(hào)和路徑。
%~ftzaI???? - 將 %I 擴(kuò)充到相似輸出線路的 DIR
在以上樣例中,%I 和 PATH 可用其它有效數(shù)值取代。%~ 語法用一個(gè)有效的 FOR 變量名終止。選取相似 %I 的大寫變量名比較易讀,并且避免與不分大寫和小寫的組合鍵混淆。
(以上是系統(tǒng)幫助的內(nèi)容)
我們能夠看到每行都有一個(gè)大寫字母"I",這個(gè)I事實(shí)上就是我們?cè)贔OR帶入的變量,比如:
FOR /F "usebackq eol=; tokens=1,2* delims=,- " %%x in ("d:/test.txt") do echo %%x %%y %%z
這里我們就要把那個(gè)x,y,z改成%~fx,%~fy,%~fz。
+++
TTT特例:下面是我依據(jù)以上說明作的一個(gè)綜合的樣例,能夠直接拷貝到記事本里,保存為bat格式(c盤下任一文件夾),執(zhí)行后,能夠直觀的看到擴(kuò)展后的效果。
@echo off
echo ---顯示"dir c:/boot.ini /b /ah"
for /f "delims==" %%i in ('dir c:/boot.ini /b /ah') do echo 不擴(kuò)展變量 %%i
for /f "delims==" %%i in ('dir c:/boot.ini /b /ah') do echo 擴(kuò)展變量到~fI %%~fi --擴(kuò)充到一個(gè)全然合格的路徑名
for /f "delims==" %%i in ('dir c:/boot.ini /b /ah') do echo 擴(kuò)展變量到~dI %%~di --僅將變量擴(kuò)充到一個(gè)驅(qū)動(dòng)器號(hào)
for /f "delims==" %%i in ('dir c:/boot.ini /b /ah') do echo 擴(kuò)展變量到~pI %%~pi --僅將變量擴(kuò)充到一個(gè)路徑
for /f "delims==" %%i in ('dir c:/boot.ini /b /ah') do echo 擴(kuò)展變量到~nI %%~ni --僅將變量擴(kuò)充到一個(gè)文件名稱
for /f "delims==" %%i in ('dir c:/boot.ini /b /ah') do echo 擴(kuò)展變量到~xI %%~xi --僅將變量擴(kuò)充到一個(gè)文件擴(kuò)展名
for /f "delims==" %%i in ('dir c:/boot.ini /b /ah') do echo 擴(kuò)展變量到~sI %%~si --擴(kuò)充的路徑僅僅含有短名
for /f "delims==" %%i in ('dir c:/boot.ini /b /ah') do echo 擴(kuò)展變量到~aI %%~ai --將變量擴(kuò)充到文件的文件屬性
for /f "delims==" %%i in ('dir c:/boot.ini /b /ah') do echo 擴(kuò)展變量到~tI %%~ti --將變量擴(kuò)充到文件的日期/時(shí)間
for /f "delims==" %%i in ('dir c:/boot.ini /b /ah') do echo 擴(kuò)展變量到~zI %%~zi --將變量擴(kuò)充到文件的大小
for /f "delims==" %%i in ('dir c:/boot.ini /b /ah') do echo 擴(kuò)展變量到~$PATH:I %%~$PATH:i --查找列在路徑環(huán)境變量的文件夾,并將變量擴(kuò)充到找到的第一個(gè)全然合格的名稱
echo ---下面顯示組合修飾符來得到多重結(jié)果---:
for /f "delims==" %%i in ('dir c:/boot.ini /b /ah') do echo 擴(kuò)展變量到~dpI %%~dpi --僅將變量擴(kuò)充到一個(gè)驅(qū)動(dòng)器號(hào)和路徑
for /f "delims==" %%i in ('dir c:/boot.ini /b /ah') do echo 擴(kuò)展變量到~nxI %%~nxi --僅將變量擴(kuò)充到一個(gè)文件名稱和擴(kuò)展名
for /f "delims==" %%i in ('dir c:/boot.ini /b /ah') do echo 擴(kuò)展變量到~fsI %%~fsI --僅將變量擴(kuò)充到一個(gè)帶有短名的完整路徑名
for /f "delims==" %%i in ('dir c:/boot.ini /b /ah') do echo 擴(kuò)展變量到~dp$PATH:I %%~dp$PATH:i --查找列在路徑環(huán)境變量的文件夾,并將變量擴(kuò)充到找到的第一個(gè)驅(qū)動(dòng)器號(hào)和路徑
for /f "delims==" %%i in ('dir c:/boot.ini /b /ah') do echo 擴(kuò)展變量到~ftzaI %%~ftzai --將變量擴(kuò)充到相似輸出線路的DIR
echo.
echo ---顯示"dir C:/WINDOWS/system32/notepad.exe /b"
for /f "delims==" %%i in ('dir C:/WINDOWS/system32/notepad.exe /b') do echo 不擴(kuò)展變量 %%i
for /f "delims==" %%i in ('dir C:/WINDOWS/system32/notepad.exe /b') do echo 擴(kuò)展變量到~fI %%~fi --擴(kuò)充到一個(gè)全然合格的路徑名
for /f "delims==" %%i in ('dir C:/WINDOWS/system32/notepad.exe /b') do echo 擴(kuò)展變量到~dI %%~di --僅將變量擴(kuò)充到一個(gè)驅(qū)動(dòng)器號(hào)
for /f "delims==" %%i in ('dir C:/WINDOWS/system32/notepad.exe /b') do echo 擴(kuò)展變量到~pI %%~pi --僅將變量擴(kuò)充到一個(gè)路徑
for /f "delims==" %%i in ('dir C:/WINDOWS/system32/notepad.exe /b') do echo 擴(kuò)展變量到~nI %%~ni --僅將變量擴(kuò)充到一個(gè)文件名稱
for /f "delims==" %%i in ('dir C:/WINDOWS/system32/notepad.exe /b') do echo 擴(kuò)展變量到~xI %%~xi --僅將變量擴(kuò)充到一個(gè)文件擴(kuò)展名
for /f "delims==" %%i in ('dir C:/WINDOWS/system32/notepad.exe /b') do echo 擴(kuò)展變量到~sI %%~si --擴(kuò)充的路徑僅僅含有短名
for /f "delims==" %%i in ('dir C:/WINDOWS/system32/notepad.exe /b') do echo 擴(kuò)展變量到~aI %%~ai --將變量擴(kuò)充到文件的文件屬性
for /f "delims==" %%i in ('dir C:/WINDOWS/system32/notepad.exe /b') do echo 擴(kuò)展變量到~tI %%~ti --將變量擴(kuò)充到文件的日期/時(shí)間
for /f "delims==" %%i in ('dir C:/WINDOWS/system32/notepad.exe /b') do echo 擴(kuò)展變量到~zI %%~zi --將變量擴(kuò)充到文件的大小
for /f "delims==" %%i in ('dir C:/WINDOWS/system32/notepad.exe /b') do echo 擴(kuò)展變量到~$PATH:I %%~$PATH:i --查找列在路徑環(huán)境變量的文件夾,并將變量擴(kuò)充到找到的第一個(gè)全然合格的名稱
echo ---下面顯示組合修飾符來得到多重結(jié)果---:
for /f "delims==" %%i in ('dir C:/WINDOWS/system32/notepad.exe /b') do echo 擴(kuò)展變量到~dpI %%~dpi --僅將變量擴(kuò)充到一個(gè)驅(qū)動(dòng)器號(hào)和路徑
for /f "delims==" %%i in ('dir C:/WINDOWS/system32/notepad.exe /b') do echo 擴(kuò)展變量到~nxI %%~nxi --僅將變量擴(kuò)充到一個(gè)文件名稱和擴(kuò)展名
for /f "delims==" %%i in ('dir C:/WINDOWS/system32/notepad.exe /b') do echo 擴(kuò)展變量到~fsI %%~fsI --僅將變量擴(kuò)充到一個(gè)帶有短名的完整路徑名
for /f "delims==" %%i in ('dir C:/WINDOWS/system32/notepad.exe /b') do echo 擴(kuò)展變量到~dp$PATH:I %%~dp$PATH:i --查找列在路徑環(huán)境變量的文件夾,并將變量擴(kuò)充到找到的第一個(gè)驅(qū)動(dòng)器號(hào)和路徑
for /f "delims==" %%i in ('dir C:/WINDOWS/system32/notepad.exe /b') do echo 擴(kuò)展變量到~ftzaI %%~ftzai --將變量擴(kuò)充到相似輸出線路的DIR
Pause
TTT說明:
1,以上命令中,%%~fsI無法顯示,預(yù)計(jì)是系統(tǒng)錯(cuò)誤,由于%%~fI是擴(kuò)充到一個(gè)全然合格的路徑名,%%~sI僅僅含有短文件名稱,本身是相互矛盾的,所以出錯(cuò)。不知是系統(tǒng)的錯(cuò)誤還是在考我們~~
2,以上命令假設(shè)保存在別的盤中,無法顯示正確的驅(qū)動(dòng)器和路徑。
3,假設(shè)想要%%~dp$PATH:i正常顯示,要保證環(huán)境變量path中確實(shí)有這個(gè)路徑:C:/WINDOWS/system32。
以下依次說明一下:
+++
一、 ~I?????? - 刪除不論什么引號(hào)("),擴(kuò)展 %I
---
這個(gè)變量的作用就如他的說明,刪除引號(hào)!
刪除引號(hào)規(guī)則例如以下(BAT兄補(bǔ)充!):
1、若字符串首尾同一時(shí)候存在引號(hào),則刪除首尾的引號(hào);
2、若字符串尾不存在引號(hào),則刪除字符串首的引號(hào);
3、假設(shè)字符串中間存在引號(hào),或者僅僅在尾部存在引號(hào),則不刪除。
龍卷風(fēng)補(bǔ)充:無頭不刪,有頭連尾刪。
我們來看這個(gè)樣例,首先建立暫時(shí)文件temp.txt,內(nèi)容例如以下
"1111
"2222"
3333"
"4444"44
"55"55"55
也可建立個(gè)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 上面建立暫時(shí)文件,注意不成對(duì)的引號(hào)要加轉(zhuǎn)義字符^,重定向符號(hào)前不要留空格
FOR /F "delims=" %%i IN (temp.txt) DO echo?? %%~i
pause
del temp.txt
運(yùn)行后,我們看CMD的回顯例如以下:
1111?????????? #字符串前的引號(hào)被刪除了
2222?????????? #字符串首尾的引號(hào)都被刪除了
3333"?????? #字符串前無引號(hào),后面的引號(hào)保留
4444"44??????? #字符串前面的引號(hào)刪除了,而中間的引號(hào)保留
55"55"55??? #字符串前面的引號(hào)刪除了,而中間的引號(hào)保留
請(qǐng)按隨意鍵繼續(xù). . .
結(jié)果和之前temp.txt中的內(nèi)容對(duì)照一下,我們會(huì)發(fā)現(xiàn)第1、2、5行的引號(hào)都消失了,這就是刪除引號(hào)~i的作用了!
+++
二、 %~fI??????? - 將 %I 擴(kuò)展到一個(gè)全然合格的路徑名
演示樣例:
把代碼保存放在隨便哪個(gè)地方,我這里就放桌面吧.
FOR /F "delims==" %%i IN ('dir /b') DO @echo?? %%~fi
pause
運(yùn)行后顯示內(nèi)容例如以下
C:/Documents and Settings/Administrator/桌面/test.bat
C:/Documents and Settings/Administrator/桌面/test.vbs
當(dāng)我把代碼中的 %%~fi直接改成%%i
FOR /F "delims==" %%i IN ('dir /b') DO @echo?? %%i
pause
運(yùn)行后就會(huì)顯示下面內(nèi)容:
test.bat
test.vbs
通過對(duì)照,我們非常easy就看出沒有路徑了,這就是"將 %I 擴(kuò)展到一個(gè)全然合格的路徑名"的作用,也就是假設(shè)%i變量的內(nèi)容是一個(gè)文件名稱的話,他就會(huì)把這個(gè)文件所在的絕對(duì)路徑打印出來,而不僅僅單單打印一個(gè)文件名稱,自己動(dòng)手動(dòng)實(shí)驗(yàn)下就知道了!
+++
三、 %~dI??????? - 僅將 %I 擴(kuò)展到一個(gè)驅(qū)動(dòng)器號(hào)
看樣例:
代碼例如以下,我還是放到桌面運(yùn)行!
FOR /F "delims==" %%i IN ('dir /b') DO @echo?? %%~di
pause
運(yùn)行后我CMD里顯演示樣例如以下
C:
C:
我桌面就兩個(gè)文件test.bat,test.vbs,%%~di作用是,假設(shè)變量%%i的內(nèi)容是一個(gè)文件或者文件夾名,他就會(huì)把他這文件或者文件夾所在的盤符號(hào)打印出來!
+++
四、 %~pI??????? - 僅將 %I 擴(kuò)展到一個(gè)路徑
這個(gè)使用方法和上面一樣,他僅僅打印路徑不打印文件名稱字
FOR /F "delims==" %%i IN ('dir /b') DO @echo?? %%~pi
pause
我就不打結(jié)果了,大家自己復(fù)制代碼看結(jié)果吧,以下幾個(gè)都是這么個(gè)使用方法,代碼給出來,大家自己看結(jié)果吧!
+++
五、 %~nI??????? - 僅將 %I 擴(kuò)展到一個(gè)文件名稱
僅僅打印文件名稱字
FOR /F "delims==" %%i IN ('dir /b') DO @echo?? %%~ni
pause
+++
六、 %~xI??????? - 僅將 %I 擴(kuò)展到一個(gè)文件擴(kuò)展名
僅僅打印文件的擴(kuò)展名
FOR /F "delims==" %%i IN ('dir /b') DO @echo?? %%~xi
pause
+++
七、 %~sI??????? - 擴(kuò)展的路徑僅僅含有短名
打印絕對(duì)短文件名稱
FOR /F "delims==" %%i IN ('dir /b') DO @echo?? %%~si
pause
+++
八、 %~aI??????? - 將 %I 擴(kuò)展到文件的文件屬性
打印文件的屬性
FOR /F "delims==" %%i IN ('dir /b') DO @echo?? %%~ai
pause
+++
九、 %~tI??????? - 將 %I 擴(kuò)展到文件的日期/時(shí)間
打印文件建立的日期
FOR /F "delims==" %%i IN ('dir /b') DO @echo?? %%~ti
pause
+++
十、 %~zI??????? - 將 %I 擴(kuò)展到文件的大小
打印文件的大小
FOR /F "delims==" %%i IN ('dir /b') DO @echo?? %%~zi
pause
龍卷風(fēng)補(bǔ)充:上面樣例中的"delims=="能夠改為"delims=",即不要分隔符
+++
十一、 %~$PATH:I - 查找列在路徑環(huán)境變量的文件夾,并將 %I 擴(kuò)展到找到的第一個(gè)全然合格的名稱。假設(shè)環(huán)境變量名未被定義,或者沒有找到文件,此組合鍵會(huì)擴(kuò)展到空字符串
這是最后一個(gè),和上面那些都不一樣,我單獨(dú)說說!
然后在把這些代碼保存為批處理,放在桌面。
@echo off
FOR /F "delims=" %%i IN (“notepad.exe”) DO echo?? %%~$PATH:i
pause
龍卷風(fēng)補(bǔ)充:上面代碼顯示結(jié)果為C:/WINDOWS/system32/notepad.exe
他的意思就在PATH變量里指定的路徑里搜索notepad.exe文件,假設(shè)有notepad.exe則會(huì)把他所在絕對(duì)路徑打印出來,沒有就打印一個(gè)錯(cuò)誤!
(TTT說明,保存到桌面上,執(zhí)行顯示結(jié)果為:系統(tǒng)找不到文件 “notepad.exe”。查看環(huán)境變量path中確實(shí)有這個(gè)路徑,不明原因!后來發(fā)現(xiàn)了,原來是中文引號(hào)的原因。
上面的命令應(yīng)該寫成:
FOR /F "delims=" %%i IN ("notepad.exe") DO echo?? %%~$PATH:i
)
最后發(fā)一個(gè)用批處理做一五子棋游戲:
@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!?? 五 棋 子 人 機(jī) 對(duì) 戰(zhàn)
set li7=!li7!??????? 批 處 理
set li10=!li10!????? 電 腦 水 平 中 等
set li31=!li31! 由 netbenton 編寫完畢
set li33=!li33! 棋盤設(shè)計(jì)參照了 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
::設(shè)置電腦IQ
set idea=@@@@#.1 #@@@@.5 @#@@@.4 @@@#@.2 @@#@@.3 vs0 $$$$#.1 #$$$$.5 $$#$$.3 $#$$$.4 $$$#$.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 #$$#$#.3-W-6-1 #$#$$#.4-W-1-6 ##$$$#.5-W-1-6 #$$$##.2-W-1-6 vs5 ##@@##.2-5-W-6-1 #@#@#.3-w-1-5 ##$$$.W-4-5 $$$##.W-2-1 $$##$.W-2-3 $##$$.W-3-4 $#$$#.W-4-1 $#$#$.W-4-2 #$$#$.W-2-5 ##$$#.W-4-W-1-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 ###$$.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. 已經(jīng)和棋了
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=輸入點(diǎn)不存在 &goto :men
)
if "!he%poh%:~%var%,1!" neq "#" set error=該點(diǎn)已經(jīng)有子 &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=電腦最后下在:
:getok
set 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-1
if !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%+=1
set 悔= !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%) 勝出 ?? <nul
pause
endlocal&goto :restart
:悔
if not defined 悔 goto :eof
if "!悔:~6,1!" equ "" goto :eof
for %%a in (!悔:~^,6!) do (set str=%%a
set/a poh=!str:~-1!,pos=!str:~,1!
set/a piph=poh+pos-1,niph=19+pos-poh,liph=poh*2-1,lips=pos*2+1
if !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%-=1
set 悔=!悔:~6!
set error=你悔棋,耍賴皮!
if not defined 悔 goto :eof
set/a poh=!悔:~2,1!,pos=!悔:~1,1!,liph=poh*2-1,lips=pos*2+1
set say=say !z%pos%!!z%poh%!(%poh%)
goto :eof
:quit
taskkill /fi "WINDOWTITLE eq 批處理五子棋*" /im cmd.exe
轉(zhuǎn)載于:https://www.cnblogs.com/mengfanrong/p/4299451.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的批处理命令 For循环命令具体解释!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java final keyword
- 下一篇: xStream转换XML、JSON