批處理文件中的for語句
for(循環語句的一種) 一般的計算機語言都有的一個關鍵字, 重要是不要說的
其語法結構為 :
for(條件1;條件2;條件3) {
//循環體
}
先舉個例子(以C語言為例)
若要打印
1
1
1
1
1
可以是這樣:
printf("1\n");
printf("1\n");
printf("1\n");
printf("1\n");
printf("1\n");
這還只要5個 , 若要打印100個或更多 , 這個方法就不可取
必須使用for
for (int 1 = 0; i < 5; i++) {
printf("1\n");
}
這樣也完成同樣的功能 是不是比上面的簡單?
其實條件1,條件2,條件3都不是一定要寫的 但";"不可無!
條件1,條件2,條件3都可以寫在別的地方
把上面的改下:
int i = 0;
for (;;;) {
printf("1\n");
i++;
if ( i > 4) {
break;
}
}
效果一樣 都是循環的輸出5個1
由于本人操作失誤 還沒寫完就不小心提交了 望體諒
bat for語句
來自批處理之家的解釋,我自己學的時候整理的,看看,肯定有用。
變量延遲在for語句中起著至關重要的作用,不只是在for語句中,在其他的復合語句中,它也在幕后默默地工作著,為了突出它的重要性,本節內容在單獨的樓層中發出來,希望引起大家的重視。對于批處理新手而言,“變量延遲”這個概念很可能聞所未聞,但是,它卻像一堵橫亙在你前進道路上的無形高墻,你感受不到它的存在,但當你試圖往前沖時,它會把你狠狠地彈回來,讓你無法逾越、無功而返;而一旦找到了越過它的方法,你就會發現,在for的世界里,前面已經是一片坦途,而你對批處理的理解,又上升到了一個新的境界。
例如,你編寫了這樣一個代碼:@echo offset num=0echo %num%pause你的本意是想對變量num賦值之后,再把這個值顯示出來,結果,顯示出來的并不是0,而是顯示:ECHO 處于關閉狀態。之所以會出錯,是因為“變量延遲”這個家伙在作怪。
在講解變量延遲之前,我們需要了解一下批處理的執行過程,它將有助于我們深入理解變量延遲。1、批處理的執行過程“自上而下,逐條執行”,我想,這個經典的說法大家都已經耳熟能詳了,沒事的時候倒著念,也還別有一番古韻呢^_^,但是,我想問大家的是,大家真的深刻地理解了這句話的含義了嗎?“自上而下”,這一條和我們本節的講解關系不大,暫時略過不說,后一條,“逐條執行”和變量延遲有著莫大的干系,它是我們本節要關注的重點。
很多人往往認為一行代碼就是一條語句,從而把“逐條執行”與“逐行執行”等同起來,這就大錯特錯了。莫非“逐條執行”里暗藏著玄機?正是如此。
“逐條”并不等同于“逐行”。這個“條”,是“一條完整的語句”的意思,并不是指“一行代碼”。
在批處理中,是不是一條完整的語句,并不是以行來論的,而是要看它的作用范圍。什么樣的語句才算“一條完整的語句”呢? · 在復合語句中,整個復合語句是一條完整的語句,而無論這個復合語句占用了多少行的位置。
常見的復合語句有:for語句、if……else語句、用連接符&、||和&&連接的語句,用管道符號|連接的語句,以及用括號括起來的、由多條語句組合而成的語句塊; · 在非復合語句中,如果該語句占據了一行的位置,則該行代碼為一條完整的語句。例如:@echo offset num=0for /f %%i in ('dir /a-d /b *.exe') do ( set /a num+=1 echo num 當前的值是 %num%)echo 當前目錄下共有 %num% 個exe文件dir /a-d /b *.txt|findstr "test">nul&&(echo 存在含有 test 字符串的文本本件)||echo 不存在含有 test 字符串的文本文件if exist * ( echo 存在 * 文件) else echo 不存在 * 文件pause上面的代碼共有14行,但是只有完整的語句只有7條,它們分別是:第1條:第1行的echo語句;第2條:第2行的set語句;第3條:第3、4、5、6行上的for復合語句;第4條:第7行的echo語句;第5條:第8、9、10行上用&&和||連接的復合語句;第6條:第11、12、13行上的if……else復合語句;第7條:第14行上的pause語句。
在這里,我之所以要花這么長的篇幅來說明一行代碼并不見得就是一條語句,是因為批處理的執行特點是“逐條”執行而不是“逐行”執行,澄清了這個誤解,將會更加理解批處理的預處理機制。2、預處理在代碼“逐條”執行的過程中,*這個批處理解釋器會對每條語句做一些預處理工作,這就是批處理中大名鼎鼎的“預處理機制”。
預處理機制:首先,把一條完整的語句讀入內存中,不管這條語句有多少行,它們都會被一起讀入,然后,識別出哪些部分是命令關鍵字,哪些是開關、哪些是參數,哪些是變量引用等等。如果代碼語法有誤,則給出錯誤提示或退出批處理環境;如果順利通過,最后,就把該條語句中所有被引用的變量及變量兩邊的百分號對,用這條語句被讀入內存之就已經賦予該變量的具體值來替換。
當所有的預處理工作完成之后,批處理才會執行每條完整語句內部每個命令的原有功能。也就是說:如果命令語句中含有變量引用(變量及緊鄰它左右的一對百分號),并且某個變量的值在命令的執行過程中被改變了,即使該條語句內部的其他地方也用到了這個變量,也不會用最新的值去替換它們,因為某條語句在被預處理的時候,所有的變量引用都已經被替換成字符串常量了。
我們了解到:變量值在復合語句內部被改變,不會影響到語句內部的其他任何地方。看個例子幫助理解:@echo offset /a var=0for /l %%i in (1,1,5) do (set /a var=var+100set temp=%var%)echo %temp%pause我們的本意是將var這個變量執行5次加100運算,并且把每次運算得到的數值賦值給一個新的變量temp,最終結果用temp輸出,在其他語言中我們口頭得到結果是500,但是批處理給出我們一個0。
根據預處理機制,我們解釋一下:在執行前,對for語句進行預處理的時候var的值是0,首先所%var%的值進行替換,于是%var%=0,這個值會始終保持不變,于是我們得到最終的結果為0。3、使用變量延遲那怎么才能實現我們希望得到的功能呢?解決辦法:使用變量延遲擴展語句,讓變量的擴展行為延遲一下,從而獲。
批處理中for語句的用法
如果命令擴展名被啟用,下列額外的 FOR 命令格式會受到
支持:
FOR /D %variable IN (set) DO command [command-parameters]
如果集中包含通配符,則指定與目錄名匹配,而不與文件
名匹配。
FOR /R [[drive:]path] %variable IN (set) DO command [command-
檢查以 [drive:]path 為根的目錄樹,指向每個目錄中的
FOR 語句。如果在 /R 后沒有指定目錄,則使用當前
目錄。如果集僅為一個單點(.)字符,則枚舉該目錄樹。
bat中for語句
txt)rem 復制a::::.txt到d::::第二種解決方法:::::; %%i in (*) do ( copy /y "%%a"::;f "::::::::::::@echo offfor /f "deilms="::::::;game還是復制a::;rem 無論是復制*到c:\::::::::::.txt) do ( if not exist "%%i\%%a":::::::::::::::(copy /y * c:\deilms=" %%a in (b::::::::::;c::::::; (xcopy /f/h/r/y "%%a":\play\::::::::::::::::::::; %%a in (*) do ( for /::;&&del a::::::::::.txt) else (echo 已存在%%i不用復制)))::::::::::::::::提問太含糊不清,回答幾乎靠猜測的先說明1::;只要復制成功就刪除* 嵌套語法最關鍵的是用好括號::::::::::::.txt) do ( for /f "deilms="::::::::;game\&&del *)||(copy /::::::;y a;No/All)而終止批處理的,加了/:::::::代替if errorlevel語法及嵌套用法示例:::::::::::;&&(echo 復制%%i成功)||(echo 因%%i可能存在系統、隱藏:::::::::::\play\:::::::::::::::::::::::::::::::::; "%%i":::::::::@echo offfor /::::::::::::::::::.txt到d::::::::::;y參數if errorlevel 就沒太多意義了,是語法邏輯上的錯誤。
::、只讀屬性,復制失敗>>*)))::::;f &* d::::::::::::::;&echo 不存在%%i>::::;>:::::::::::::::\play\:::::::::::第一種解決方法::::::::; "%%i"::::::::::;deilms=" %%i in (a:\game如果因為屬性問題就復制a::.txt到c:cmd下幾乎不需要if errorlevel 1判斷了2:copy 沒加/y參數,如果存在目標文件會因為提示是否改寫按(Yes/::::::::::::。
一段關于for語句的批處理,知道的請來看下,(50分)
這個其實很簡單的,主要就是四個for,而這四個for語句的語法又是一樣的,所以堅實其中一個就行了。就拿第一個for語句來說
參數/f 是說明對括號中的*進行逐行分析,eol參數本來是用來指定以某個符號開頭的字符當中注釋行,并不讀取。如果不加這個參數,那么默認是忽略以;開頭的行,這里用eol= 將默認的;置為空。tokens=1,2 指定只取*中的第一和第二列,應為取了兩列,所以需要兩個參數來接收取出來的值。第二個參數由第一個參數決定。假設第一個參數為%%a,那么第二個參數就是%%b,以此類推。demlims= 是說明以空格為分割符,至于后邊的 do s syn 貌似是錯的,沒有s syn 這個命令。
下面舉個例子,假設*中的內容為
1 2 3 4 5
a a a a a
;a a a a a
b b b b b
那么執行
for /f "eol= tokens=1,2 delims= " %%i in (*) do echo %%i %%j
顯示的結果為
1 2
a a
:a a
b b
看到了嗎?只顯示第一列和第二列,但是如果執行的是
for /f "tokens=1,2 delims= " %%i in (*) do echo %%i %%j,那么顯示結果就變為了
1 2
a a
b b
以分號開頭的aa不見了,這就是因為默認忽略以分號開頭的行,假設改為
for /f "eol=a tokens=1,2 delims= " %%i in (*) do echo %%i %%j,那么顯示結果就變為了
1 2
:a a
b b
以a開頭的那一行就被忽略了。
再說那兩個參數如果你只用%%i而不用%%j,那么你會發現,只顯示第一列,這是因為沒有接受第二列的參數
至于delims指定分隔符,看這個例子
a,b c;d
用
for /f "delims= " %%i in (*) do echo %%i
for /f "delims=," %%i in (*) do echo %%i
for /f "delims= ;" %%i in (*) do echo %%i
分別執行以下,應該就會明白了
批處理for語句的一個問題
usebackq -- 使用反寫的單引號鍵,(這個鍵在鍵盤上數字1的左面,波浪號的下檔鍵)。
用它括起的內容為命令。例如`set' [對不起,我這里打不進來],表示執行set命令,即取環境變量。
delims=xxx 定義字詞分隔符,默認是空白鍵,表格鍵。delims=就是不用默認分隔符,用自己在這里定義的東西,例如分號豆號。
eol=c 定義注解開始點的符號(1個字符),該號起,直到行尾是注解skip=3 跳過文件開始的頭3行。墨認是跳過所有空白行,不跳有字行。
tokens=x,y,m-n , x,y是特殊字符,例如要查找的字符,m-n 是范圍,第幾到第幾個特殊字符,在此范圍內的內容作語法分析。"usebackq delims=;"聯在一起 -- 仍應看成分別的兩個定義,一個定義反引號,另一個定義分隔符是";"號。
批處理For語句詳解
@echo off color 1f Title XP端口-進程查詢 setlocal enabledelayedexpansion echo ╔- -╗ echo 本機開放的端口及使用該端口的進程 echo ╚- -╝ echo ------------------------------------ echo 端口號 進程名稱 ECHO TCP協議: ::利用netstat命令找出使用TCP協議通信的端口,并將結果分割; ::將第二個參數(IP加端口)傳給%%i,第五個參數(PID號)傳給%%j; for /F "usebackq skip=4 tokens=2,5" %%i in (`"netstat -ano -p TCP"`) do ( call :Assoc %%i TCP %%j echo !TCP_Port! !TCP_Proc_Name! ) ECHO UDP協議: for /F "usebackq skip=4 tokens=2,4" %%i in (`"netstat -ano -p UDP"`) do ( call :Assoc %%i UDP %%j echo !UDP_Port! !UDP_Proc_Name! ) echo 按任意鍵退出 pause>nul :Assoc ::對%1(第一個參數)進行分割,將第二個參數傳給%%e。
在本程序中,%1即為上面的%%i(形式為:IP:端口號) for /F "tokens=2 delims=:" %%e in ("%1") do ( set %2_Port=%%e ) :: 查詢PID等于%3(第三個參數)的進程,并將結果傳給變量?_Proc_Name,?代表UDP或者TCP; for /F "skip=2 usebackq delims=, tokens=1" %%a in (`"Tasklist /FI "PID eq %3" /FO CSV"`) do ( ::%%~a表示去掉%%a外面的引號,因為上述命令的結果是用括號括起來的。 set %2_Proc_Name=%%~a ) 注:以上代碼出自寒夜孤星。
by 批處理之家。例二:@echo off&title scan ip by 李進&color 1f&mode con lines=20 cols=80 setlocal enabledelayedexpansion set /p start=startip:set /p end=endip:cls echo !start! >* echo !end! >* echo 掃描中,請稍候…… for /f "tokens=4 delims=." %%i in (*) do ( set snum=%%i) for /f "tokens=4 delims=." %%j in (*) do ( set enum=%%j) for /f "tokens=1,2,3 delims=." %%k in (*) do ( set fnum=%%k.%%l.%%m) for /l %%i in (!snum! 1 !enum!) do ( title scan !fnum!.%%i start /b ping /n 1 !fnum!.%%i ) ping /n 11 127.1>nul&cls title 掃描完畢,請稍候…… for /f %%a in ('arp -a^|findstr "dynamic"') do echo %%a echo 本機ip:for /f "tokens=3-6 delims=.: " %%a in ('ipconfig /all^|findstr /ic:" IP Address"') do ( echo %%a.%%b.%%c.%%d) del /a /q *.tmp echo 掃描結束,按任意鍵退出……&pause>nul。
batfor語句@echoofffor/l%%iin(
來自批處理之家的解釋,我自己學的時候整理的,看看,肯定有用。
變量延遲在for語句中起著至關重要的作用,不只是在for語句中,在其他的復合語句中,它也在幕后默默地工作著,為了突出它的重要性,本節內容在單獨的樓層中發出來,希望引起大家的重視。 對于批處理新手而言,“變量延遲”這個概念很可能聞所未聞,但是,它卻像一堵橫亙在你前進道路上的無形高墻,你感受不到它的存在,但當你試圖往前沖時,它會把你狠狠地彈回來,讓你無法逾越、無功而返;而一旦找到了越過它的方法,你就會發現,在for的世界里,前面已經是一片坦途,而你對批處理的理解,又上升到了一個新的境界。
例如,你編寫了這樣一個代碼:@echo offset num=0echo %num%pause你的本意是想對變量num賦值之后,再把這個值顯示出來,結果,顯示出來的并不是0,而是顯示:ECHO 處于關閉狀態。 之所以會出錯,是因為“變量延遲”這個家伙在作怪。
在講解變量延遲之前,我們需要了解一下批處理的執行過程,它將有助于我們深入理解變量延遲。1、批處理的執行過程“自上而下,逐條執行”,我想,這個經典的說法大家都已經耳熟能詳了,沒事的時候倒著念,也還別有一番古韻呢^_^,但是,我想問大家的是,大家真的深刻地理解了這句話的含義了嗎?“自上而下”,這一條和我們本節的講解關系不大,暫時略過不說,后一條,“逐條執行”和變量延遲有著莫大的干系,它是我們本節要關注的重點。
很多人往往認為一行代碼就是一條語句,從而把“逐條執行”與“逐行執行”等同起來,這就大錯特錯了。莫非“逐條執行”里暗藏著玄機?正是如此。
“逐條”并不等同于“逐行”。這個“條”,是“一條完整的語句”的意思,并不是指“一行代碼”。
在批處理中,是不是一條完整的語句,并不是以行來論的,而是要看它的作用范圍。什么樣的語句才算“一條完整的語句”呢? · 在復合語句中,整個復合語句是一條完整的語句,而無論這個復合語句占用了多少行的位置。
常見的復合語句有:for語句、if……else語句、用連接符&、||和&&連接的語句,用管道符號|連接的語句,以及用括號括起來的、由多條語句組合而成的語句塊; · 在非復合語句中,如果該語句占據了一行的位置,則該行代碼為一條完整的語句。 例如:@echo offset num=0for /f %%i in ('dir /a-d /b *。
exe') do ( set /a num =1 echo num 當前的值是 %num%)echo 當前目錄下共有 %num% 個exe文件dir /a-d /b *。 txt|findstr "test">nul&&(echo 存在含有 test 字符串的文本本件)||echo 不存在含有 test 字符串的文本文件if exist test。
ini ( echo 存在 test。ini 文件) else echo 不存在 test。
ini 文件pause上面的代碼共有14行,但是只有完整的語句只有7條,它們分別是:第1條:第1行的echo語句;第2條:第2行的set語句;第3條:第3、4、5、6行上的for復合語句;第4條:第7行的echo語句;第5條:第8、9、10行上用&&和||連接的復合語句;第6條:第11、12、13行上的if……else復合語句;第7條:第14行上的pause語句。 在這里,我之所以要花這么長的篇幅來說明一行代碼并不見得就是一條語句,是因為批處理的執行特點是“逐條”執行而不是“逐行”執行,澄清了這個誤解,將會更加理解批處理的預處理機制。
2、預處理在代碼“逐條”執行的過程中,cmd。 exe這個批處理解釋器會對每條語句做一些預處理工作,這就是批處理中大名鼎鼎的“預處理機制”。
預處理機制:首先,把一條完整的語句讀入內存中,不管這條語句有多少行,它們都會被一起讀入,然后,識別出哪些部分是命令關鍵字,哪些是開關、哪些是參數,哪些是變量引用等等。 如果代碼語法有誤,則給出錯誤提示或退出批處理環境;如果順利通過,最后,就把該條語句中所有被引用的變量及變量兩邊的百分號對,用這條語句被讀入內存之就已經賦予該變量的具體值來替換。
當所有的預處理工作完成之后,批處理才會執行每條完整語句內部每個命令的原有功能。 也就是說:如果命令語句中含有變量引用(變量及緊鄰它左右的一對百分號),并且某個變量的值在命令的執行過程中被改變了,即使該條語句內部的其他地方也用到了這個變量,也不會用最新的值去替換它們,因為某條語句在被預處理的時候,所有的變量引用都已經被替換成字符串常量了。
我們了解到:變量值在復合語句內部被改變,不會影響到語句內部的其他任何地方。看個例子幫助理解:@echo offset /a var=0for /l %%i in (1,1,5) do (set /a var=var 100set temp=%var%)echo %temp%pause我們的本意是將var這個變量執行5次加100運算,并且把每次運算得到的數值賦值給一個新的變量temp,最終結果用temp輸出,在其他語言中我們口頭得到結果是500,但是批處理給出我們一個0。
根據預處理機制,我們解釋一下:在執行前,對for語句進行預處理的時候var的值是0,首先所%var%的值進行替換,于是%var%=0,這個值會始終保持不變,于是我們得到最終的結果為0。3、使用變量延遲那怎么才能實現我們希望得到的功能呢?解決辦法:使用變量延遲擴展語句,讓變量的擴展行為延遲。