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(條件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語句
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語句的用法
如果命令擴展名被啟用,下列額外的 FOR 命令格式會受到
支持:
FOR /D %variable IN (set) DO command [command-parameters]
如果集中包含通配符,則指定與目錄名匹配,而不與文件
名匹配。
FOR /R [[drive:]path] %variable IN (set) DO command [command-
檢查以 [drive:]path 為根的目錄樹,指向每個目錄中的
FOR 語句。如果在 /R 后沒有指定目錄,則使用當前
目錄。如果集僅為一個單點(.)字符,則枚舉該目錄樹。
求批處理for命令的完整講解
For命令
For命令的作用是對一組文件中的每一個文件執行指定的命令。該命令可用在批處理文件中,也可命令提示符下調用。
1.參數
For在批處理程序中的使用格式如下:
FOR%%變量 IN(集合) DO命令[命令參數]
FOR 在命令提示符下的格式如下:
FOR %變量 IN(集合) DO命令[命令參數]
* %%變量或%變量代表一個可替換的變量。For命令將用指定的一組文件中的每一個文本字符串來代替%%變量(或%變量),直到該命令處理完所有的文件位為止。用%%變量來執行一批處理程序中的For命令;用%變量來執行命令提示符下的For命令。
*(集合)指定一個或者多個要用特定命令對其進行處理的文件或文件文本字符串。圓括號不得省略。
2.實例
用Type命令來顯示當前目錄下擴展名為.DOC或.TXT的所有文件的內容,為了做到這一點要使用可替代變量%F,并在命令提示符下輸入下面的命令:
For %f in (*.doc*.txt)do type %f
在此例中,當前目錄下擴展名為.DOC 或.TXT的每一個文件將替代%f變量,知道顯示出每一個文件的內容為止。若把每一個%f都替換成%%f,則此命令可用于一批處理文件;否則,系統將忽略次變量而顯示錯誤。
3.注意
IN和DO不是參數,但For命令中要求必須有這兩個關鍵字。如果省略勒這兩個關鍵字,MS-DOS將會翻臉不認人的提示錯誤信息。
除了數字0~9之外,可把任何字符用作變量,以避免與批處理參數%0到%9混淆。對簡單的批處理程序來說,用%%F這樣一個單一字符就足夠勒。在復雜的批處理程序中,伱可把多個值用于變量,以區分不同的可替換變量。然而,在同一行命令上不能嵌套多個For命令。
(~ o ~)~zZ呼呼,看懂勒沒有,還沒看懂的話到HI上面問莪,莪繼續教伱。
- -
不過寫成這樣都看不懂的話。莪也實在是沒辦法教勒。
- -|
批處理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。