
【原創】for命令從入門到精通簡化版最后由 小程936 于 -1-1 16:44for命令-從入門到精通(小程936原創,跟置頂帖沒有一毛錢關系,我寫這教程的時候根本不知道這個網站)我相信大多數人對于for都是似懂非懂……主要原因就是,大部分教程求懶求快,直接復制for /?的機器翻譯,導致基本沒人看得懂,小部分教程堆砌辭藻,一句話能說完的事喜歡用不明覺厲的專業名稱講上幾千字……本文承諾:絕不使用機器翻譯幫助,不堆砌辭藻,祝大家學習愉快。FOR函數,對一組文件批量執行命令,基本模式如下(ps:教程是給中國人看的,所以那種FOR %variable IN (set) DO command [command-parameters]教程寫法我是絕對不會采用的)
1.文件搜索 for [/D] [/R [路徑]] %%變量 in (集合) do (命令)2.等差數列 for /L %%變量 in (開始,間隔,結束) do (命令)3.文本處理 for /F [選項] %%變量 in (集合) do (命令)注意:[A]表示可選,A|B表示多選,所以[方括號]和|符號是不用寫到命令里的!注意:【在批處理中使用 %%變量 ,在命令行中使用 %變量 ,記住了!】詳細的我們下一節再講。作業:按Win+R鍵運行cmd,輸入以下命令試試(逐行復制,不要告訴我你連復制粘貼都不會),并試圖理解for命令的寫法
1.批量執行 for [/D] [/R [路徑]] %%變量 in (集合) do (命令)/D 只搜索文件夾名[可選],若無該選項即為 只搜索文件名/R [路徑] 搜索子目錄[可選]路徑 搜索指定目錄[可選](這個雞肋參數要求必須開啟 搜索子目錄 才能用,若想指定搜索目錄普遍做法是先用cd /d跳轉目錄)若無該選項即為 搜索當前目錄%%變量 可以是一個字母(不區分大小寫),數字,或符號,用于在命令中使用,代表搜索結果。集合 指定一個或一組文件。可以使用通配符搜索。(允許指定多個搜索條件 用空格分隔 帶空格 的搜索條件用雙引號括住)(當搜索條件不包含通配符時 不搜索直接輸出 因此也可以用來指定文本 用空格分隔 帶空格 文本用雙引號括?。ㄍㄅ浞?表示0個或多個字符,通配符?表示0個或1個字符)命令 指定批量執行的命令。使用%%變量 指定搜索結果。nclick="copycode($('code0'));">復制代碼
- @ echo&cd /d C:/
- for /D %i in (*) do echo %i
- for /L %a in (1,1,5) do (start cmd)
- for /F delims= %p in ('dir /as /b') do (echo %p)
注意:for搜索并不會搜索隱藏文件,因此若要搜索隱藏文件……過會兒再講作業:按Win+R鍵運行cmd,然后自行思索命令怎么寫1.搜索當前目錄,目錄名中包含es的目錄,并顯示出來2.搜索子文件夾Desktop,包含子目錄,并計算出該目錄一共有多少文件。(set /a a+=1會用吧?不會就算了,顯示出來也行)(本題不得使用cd跳轉目錄?。?.分析下列代碼,并嘗試制作一個 [請輸入多個數字,用空格隔開,輸出這些數的乘積] 計算工具nclick="copycode($('code1'));">復制代碼
- @ echo off
- for %%i in (*.bat) do (echo %%i)
- ::這段代碼會顯示當前文件夾(不含子文件夾)下所有的bat文件的文件名
- for %%i in (菜 芽 小 公 公) do echo %%i
- pause>nul
- ::這段代碼會顯示什么?試試看!
2.等差數列 for /L %%變量 in (開始,間隔,結束) do (命令)(開始,間隔,結束)表示從開始到結束的一個數列,間隔為數列差。因此,(1,2,10)將產生序列(1 3 5 7 9),(5,-1,1)將產生序列(5 4 3 2 1)[命令行]連續打開10個cmd窗口。nclick="copycode($('code2'));">復制代碼
- set c=1
- for %%i in (2 3 5 7 11 13 17 19 23 29 31 37) do set /a c*=%%i
[批處理]生成一個100-200的數列,間隔為5nclick="copycode($('code3'));">復制代碼
- for /L %a in (1,1,10) do start cmd
這個命令很簡單啦,沒啥解釋的作業:使用for /L命令制作一個[階乘計算工具](10的階乘=10*9*8*7*……*2*1)上期答案1.nclick="copycode($('code4'));">復制代碼
- for /L %%a in (100 5 200) do echo %%a
2.nclick="copycode($('code5'));">復制代碼
- for /D %i in (*es*) do (echo %i)
3.nclick="copycode($('code6'));">復制代碼
- for /R Desktop %i in (*) do set /a a+=1
答案僅供參考,不要求完全一致。(樓主原創出品,剛剛寫的)上期答案nclick="copycode($('code7'));">復制代碼
- @echo off
- :1
- set /p a=請輸入多個數字,用空格隔開=
- set c=1
- for %%i in (%a%) do set /a c*=%%i
- echo %a%的乘積=%c%
- goto 1
3.文本處理 for /F [選項] %%變量 in (集合) do (命令)我們先說說選項。多個選項用空格分開,整體必須用雙引號括起來。示例:nclick="copycode($('code8'));">復制代碼
- @echo off
- :1
- set /p a=請輸入數字=
- set c=1
- for /L %%i in (1,1,%a%) do set /a c*=%%i
- echo %a%的階乘=%c%
- goto 1
- 答案僅供參考,不要求完全一致。
可以使用的選項eol=! 指定注釋符號。默認未指定。(忽略以!開頭的行)skip=n 忽略第0-n行。默認為0(不忽略)delims= -x 指定列分隔符,可指定多個。(將空格 減號-字母x指定為列分隔符)(默認分隔符為空格 制表符)(所謂制表符,打開記事本,按TAB鍵)tokens=1,7-9* 讀取第幾列。默認為1。若命令為for /F tokens=參數 %%a in (集合) do (命令)當參數為1,7 變量a為第1列的內容,變量b為第7列的內容當參數為7-9變量a為第7列的內容,變量b為第8列的內容,變量c為第9列的內容當參數為9*變量a為第9列的內容,變量b為第9列之后所有列的內容當參數為*變量a為所有列的內容。當參數為1,7-9* 變量a為第1列的內容,變量b為第7列的內容,變量c為第8列的內容,變量d為第9列的內容,變量e為第9列之后所有列的內容??赐赀@些,你已經明白tokens=怎么使用了吧?記住可用的三個符號,-*usebackq 指定新語法。示范:for /F usebackq %%a in (集合) do (命令)(集合) 指定一個或一組文件??梢允褂猛ㄅ浞?。(也可以指定文本或命令。)usebackq 未啟用 (一個或一組文本文檔) (文本) ('命令輸出') (*.txt) (第一行 1,2 1,3 1,4) ('dir /as /b')usebackq 已啟用 (一個或一組文本文檔) ('文本') (`命令輸出`) (*.txt) ('第一行 1,2 1,3 1,4') (`dir /as /b`)雙引號 '單引號' `鍵盤上打不出來的某符號`你可能覺得usebackq是一個可有可無,沒有實際作用的選項?不要忘了,如果文件名中有空格,我們必須用雙引號括起來!顯然這會造成識別為文本……怎么辦?啟用usebackq唄~額,說到這里,可能你還沒弄懂for /F到底是啥……嗯,那就解釋一下。集合可以是 一個或一組文件(文本文檔) 或 引號括起來的文本 或 '命令輸出'(*.txt) (第一行 1,2 1,3 1,4) ('dir /as /b')然后這些文本會逐行作為 %%變量 進行輸出使用上方的選項設置,可以做到……忽略以某符號開始的行 和 忽略開頭的數行 和 指定列分割符 和 只讀取每行中的指定列多的不說,直接貼代碼nclick="copycode($('code9'));">復制代碼
- FOR /F eol=; tokens=2,3* delims=, %%i in (myfile.txt) do @echo %%i %%j %%k
變量擴展大家知道,在cmd中執行for命令,變量用%i表示,而在bat中,變量用%%i表示。(這是為什么呢?學完這課大家就會懂了)1.變量的范圍數字計算[±21 4748 3647 整數],文本[8191個字節](set /p a=<文件 和 ^換行符 可突破該限制,暫不解釋)2.變量的命名不允許使用純數字不建議使用單字母變量命名不區分大小寫3.變量擴展-文本(以下示例均以變量%a%示范,實際變量名可以為任何值)%a:文本1=文本2% 文本1替換為文本2(文本2可留空,如%a:文本1=%)%a:*文本1=文本2% 可使用通配符*零個或多個任意字符?一個任意字符%a:~10% 第10個字之后的內容%a:~-10% 倒數第10個字之后的內容%a:~,5% 開頭之后的5個字%a:~,-5% 倒數第5個字之前的字%a:~10,5% 第10個字之后的5個字%a:~10,-5% 第10個字之后,倒數第5個字之前的字%a:~-10,5% 倒數第10個字之后的5個字%a:~-10,-5% 倒數第10個字之后,倒數第5個字之前的字%a:~列數,位數%,表示保留 指定列 之后的 指定位123456789---列數----987654321- 正數 負數注:文本擴展在for命令中可能不可用示范:set a=%a:~-10,-5%4.變量擴展-路徑(以下示例均以變量%a示范)(此時右邊%可以省略, %~a 和 %~a% 是一樣的)%a 路徑 Temptmp 12345.txt%~a 刪除引號 Temptmp 12345.txt%~fa 完整路徑 D:AppDataLocalTemptmp 12345.txt%~da 分區 D:%~pa 路徑 AppDataLocalTemp%~na 文件名 tmp 12345%~xa 擴展名 .txt%~sa 短文件名 D:AppDataLocalTempTM3A8C~1.TXT%~aa 文件屬性 --a--------%~ta 修改日期 /06/02 16:26%~za 文件大小(字節) 18%~$b:a 在 目錄b 搜索 文件a 找到的第一個文件。如果變量b不存在,或者沒有找到文件a,返回空字符串。需事先給變量b賦值,多個路徑可用分號分隔。命令示例set b=C:WINDOWSsystem32;C:WINDOWS;C:WINDOWSSystem32Wbem可以組合使用來得到多重結果%~dpa 分區和路徑 D:AppDataLocalTemp%~nxa 完整文件名 tmp 12345.txt%~dp$b:a 在 目錄b 搜索 文件a 輸出 文件a 的 分區和路徑%~ftzaa 類似dir命令的輸出(完整路徑 日期 大小 屬性)--a-------- /06/02 16:26 18 D:AppDataLocalTemptmp 12345.txt不組合拆分開也行,比如這樣%~fa% %~ta% %~za% %~aa%注意:路徑擴展僅適用于%0 %1 …%9和for中的單字母變量%%i,若要支持其他變量,考慮使用callnclick="copycode($('code10'));">復制代碼
- @echo off
- echo 第一行! 1,2 1,3 1,4 >test.txt
- echo 第二行! 2,2 2,3 2,4 >>test.txt
- echo 第三行! 3,2 3,3 3,4 >>test.txt
- echo 第四行! 4,2 4,3 4,4 >>test.txt
- echo 在當前文件夾下生成了一個test.txt,內容為:
- for /F delims= %%i in (test.txt) do echo %%i
- echo 這個文件的第一列是:&pause>nul
- for /F %%i in (test.txt) do echo %%i
- echo 這個文件的第二列是:&pause>nul
- for /F tokens=2 %%i in (test.txt) do echo %%i
- echo 這個文件的第三和第四列是:&pause>nul
- for /F tokens=3-4 %%a in (test.txt) do echo %%a %%b
- echo 這個文件的第二行是:&pause>nul
- for /F skip=1 delims= %%i in (test.txt) do echo %%i&goto 1
- :1
- pause&echo 一大波僵尸即將襲來&pause&tasklist
- echo 去掉以上內容的前三行,僅保留第一列 & pause>nul
- for /f skip=3 %%i in ('tasklist') do echo,%%i
- pause>nul
- 作業:仔細理解完 上方代碼,融會貫通,舉一反三。
5.變量擴展-延遲(在批處理開頭加上一行etlocal enabledelayedexpansion即可)nclick="copycode($('code11'));">復制代碼
- @echo off & set a=百度貼吧。百度公司。中國公司
- echo %%0 %0
- echo 文本
- echo %%a%% %a%
- echo %%a:。=-%% %a:。=-%
- echo %%a:百度=%% %a:百度=%
- echo %%a:*公司=123%% %a:*公司=123%
- echo %%a:~5%% %a:~5%
- echo %%a:~-5%% %a:~-5%
- echo %%a:~,3%% %a:~,3%
- echo %%a:~,-3%% %a:~,-3%
- echo %%a:~5,3%% %a:~5,3%
- echo %%a:~5,-3%% %a:~5,-3%
- echo %%a:~-5,3%% %a:~-5,3%
- echo %%a:~-5,-3%% %a:~-5,-3%
- pause & echo 產生一個臨時文件>tmp^ 12345.txt
- rem 使用上方辦法即可創建帶空格的文件
- Call :sub tmp 12345.txt
- rem 以上一條命令表示跳轉到sub標簽并將變量%1設置為tmp 12345.txt
- pause & Del tmp 12345.txt & goto tu
- :sub
- echo 路徑
- echo %%1 %1
- echo %%~1 %~1
- echo %%~f1 %~f1
- echo %%~d1 %~d1
- echo %%~p1 %~p1
- echo %%~n1 %~n1
- echo %%~x1 %~x1
- echo %%~s1 %~s1
- echo %%~a1 %~a1
- echo %%~t1 %~t1
- echo %%~z1 %~z1
- echo %%~dp1 %~dp1
- echo %%~nx1 %~nx1
- echo %%~ftza1 %~ftza1
- echo. & Goto :eof
- :tu
- echo 特殊變量
- echo 當前目錄%%CD%% %CD%
- echo 當前日期%%DATE%% %DATE%
- echo 當前時間%%TIME%% %TIME%
- echo 范圍在0-32767的偽隨機數%%RANDOM%% %RANDOM%
- echo 錯誤返回碼%%ERRORLEVEL%% %ERRORLEVEL%
- echo cmd的版本號%%CMDEXTVERSION%% %CMDEXTVERSION%
- echo 顯示當前打開cmd所用的命令%%CMDCMDLINE%% %CMDCMDLINE%
- echo 當前最高NUMA節點號%%HIGHESTNUMANODENUMBER%% %HIGHESTNUMANODENUMBER%
- pause
nclick="copycode($('code12'));">復制代碼
- @echo off
- set num=10
- set num=100 & echo %num%
- echo %num%
- echo 雖然已經將num的值更改為100,但由于沒有延遲擴展,所以值仍為10,不過在下一個語句num的值就改變了
- pause
更復雜的寫法set q=!tem%c%!set a=!aa:~%bb%,10!set b=!a:%文本1%=%文本2%!注意:延遲擴展與call的沖突nclick="copycode($('code13'));">復制代碼
- @echo off
- SetLocal EnableDelayedExpansion
- set num=10
- set num=100 & echo !num!
- echo 現在兩個num的值一樣了(注意%num%變成了!num!)
- echo %num%
- pause
保留第五行,輸出錯誤結果;刪除第五行,輸出正確結果 歡迎光臨結論:使用call跳轉標簽或文件時,需確保目標無“setlocal enabledelayedexpansion”,否則將產生錯誤若必須保留setlocal enabledelayedexpansion這一行,可參考解決方案nclick="copycode($('code14'));">復制代碼
- @echo off&setlocal enabledelayedexpansion
- call :1
- echo %a%&pause
- :1
- setlocal enabledelayedexpansion&echo 運行一遍,然后刪除本行,再運行一遍。
- set a=歡迎光臨
- exit /b
nclick="copycode($('code15'));">復制代碼
- 方案1:
- @ echo off
- setlocal enabledelayedexpansion
- call :1 1
- echo %a%&pause
- :1
- if not #%*==# goto 2
- setlocal enabledelayedexpansion
- :2
- set a=歡迎光臨
- exit /b
匯總小節nclick="copycode($('code16'));">復制代碼
- 方案2:
- @ echo off
- setlocal enabledelayedexpansion
- call :1
- for /F delims= %%i in (a) do set %%i
- echo %a%&pause
- :1
- setlocal enabledelayedexpansion
- set a=歡迎光臨
- (set)>a
- goto :eof
for [/D] [/R [路徑]] %%變量in (集合) do (命令)文件搜索 文件夾 子文件夾 指定目錄 單字母 搜索/文本 批量 for /L%%變量 in (開始,間隔,結束) do (命令)等差數列 單字母 開始,間隔,結束 批量 for /F [選項] %%變量 in (集合) do (命令)文本處理 選項 單字母 搜索/文本/'命令' 批量 for /F eol=! skip=n delims= -x tokens=1,7-9* usebackq 選項 注釋 行 分隔符 列 新語法(搜索/'文本'/`命令`) %a:文本1=文本2% %a:~10,5% %CD% %DATE% %TIME% %RANDOM% 替換 截取 當前目錄 日期 時間 隨機數高級用法1.文件搜索可以指定多個搜索目標,用空格隔開,比如這樣(for命令會對每個搜索目標都搜索一遍)
當沒有搜索到目標時,輸出搜索目標。因此for也支持 集合 內容為文本nclick="copycode($('code17'));">復制代碼
- for /D %i in (*es* a* Deskto?) do (echo %i)
3.文本處理使用goto跳轉,即可實現只讀取一行。nclick="copycode($('code18'));">復制代碼
- for %%i in (菜 芽 小 公 公) do echo %%i
由于for /f支持讀取 命令輸出,所以for不能搜索隱藏文件的缺點可以借此部分修復。nclick="copycode($('code19'));">復制代碼
- for /F skip=3 delims= %%i in (test.txt) do echo %%i&set a=%%i&goto 1
- :1
- for /F skip=1 tokens=2 delims= %%i in ('net user %username%') do set a=%%i&goto 2
- :2
- echo 中文用戶名:%a: =%
:) :) :) :) :) :) :)結束----------------------------歡迎點右下角的評分按鈕↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓nclick="copycode($('code20'));">復制代碼
- for /f delims= %%i in ('dir /ah /s/b') do attrib %%i -s -h -r

