※迴圈
help for 看文檔在批次檔裡變數用兩個 %;cmd只要一個 % 即可
變數名有區分大小寫,其他沒有
如果批次檔沒有寫好,會閃一下就結束了
※檔案(不加參數)
@echo off ::列出當前路徑的所有檔案名稱,只有檔名 ::for %%i in (*) do echo %%i for %%i in (*) do ( echo %%i ) echo. echo. ::列出指定路徑下的所有副檔名為txt的檔案名稱,路徑+檔名 for %%j in ("C:\Program Files\Java\jdk1.8.0_121\*.txt") do echo %%j pause
※如有多個指令要操作,可像此例用「( )」包起來
※do 後面不能換行,至少要有「(」
※目錄(/d):directory
@echo off ::列出當前路徑的所有目錄名稱,只有目錄名稱 for /d %%i in (*) do echo %%i echo. echo. ::列出指定路徑的所有目錄名稱為j開頭的,路徑+目錄名 for /d %%j in ("C:\Program Files\Java\jdk1.8.0_121\j*") do echo %%j pause
※
※遞迴(/r):recursive
@echo off ::列出當前路徑的所有檔案名稱,路徑+檔名 for /r %%i in (*) do echo %%i echo. echo. ::列出當前路徑的所有目錄名稱,路徑+目錄名且以\.結尾 for /r %%j in (.) do echo %%j echo. echo. ::列出指定路徑下的所有副檔名為txt的檔案名稱,路徑+檔名 for /r "C:\Program Files\Java\jdk1.8.0_121" %%k in (*.txt) do echo %%k pause
※檔案和目錄都只有操作一層而已,但用遞迴可以從最外層到最裡層拆開
※列出(/L):list
@echo off ::列出-5到100,每次增加5的數字 for /L %%i in (-5,5,100) do echo %%i echo. echo. ::新增xxx1~xxx3的目錄 for /L %%j in (1,1,3) do mkdir xxx%%j && echo 新建xxx%%j目錄成功 pause
※第一和第三個參數是開始和結束,中間是增加或減少,顯示出來的是數字
※L 最好用大寫,避免混淆
※檔案內容(/f)
一行一行的抓取檔案內容,要注意 delims 的預設是空格、換行( )裡有三種 1.檔名 2.命令(用`包起來) 3.字串(用"包起來)
※test.txt
aaa, bbb, ccc, ddd, eee, fff, ggg, hhh, iii, jjj,
※
※test2.txt
kkk, lll, mmm, nnn, ooo
※
※
::基本款,多檔用空格隔開 for /f %%i in (test.txt test2.txt) do echo %%i ::直接寫字串,但我不知道怎麼寫換行 for /f %%i in ("abcde") do echo %%i ::如果檔名有空格,必須用"包起來,但會被誤認為字串,所以前面加上 usebackq 即可 for /f usebackq %%i in (test.txt "test 2.txt") do echo %%i ::使用命令時也一樣,一定會有空格,所以也要加上 usebackq for /f usebackq %%i in (`type test.txt`) do echo %%i ::換行改成用,,這樣就不是預設的空格、換行了 for /f "delims=," %%i in (test.txt test2.txt) do echo %%i ::每個檔案忽略前三行 for /f "skip=3" %%i in (test.txt test2.txt) do echo %%i ::可以混合使用 for /f "delims=,skip=3" %%i in (test.txt test2.txt) do echo %%i ::忽略 f 開頭 for /f "eol=f" %%i in (test.txt test2.txt) do echo %%i ::特殊語法 for /f %%i in (test.txt test2.txt) do echo %%~di%%i
※特殊語法可參考文檔
※tokens
行中的內容※test3.txt
a b c d e f g h i j k l m n o p q r s t
※
::取2到5個(注意預設是以空格換行區分第幾個),2到5有4個變數,直接用即可,不用宣告 for /f "tokens=2-5" %%i in (test3.txt) do echo %%i %%j %%k %%l ::取第2個之後,%%j表示第3個到最後 for /f "tokens=2*" %%i in (test3.txt) do echo %%i %%j ::取2和4,然後7到9,所以有5個變數 for /f "tokens=2,4,7-9" %%i in (test3.txt) do echo %%i %%j %%k %%l %%m
※變數宣告為%%i,注意後面是依序的,如%%i、%%j、%%k…
又如果是宣告為%%a,那後面自然就是%%b、%%c…
※變數不一定要拿來用,也不一定要先印 i 才能印 j,隨自己需求
※if
※@echo off setlocal set a=apple set b=banana if /i "%a%" == "APPLE" ( echo is apple ) else ( echo is not apple ) if not "%b%" == "banana" ( echo is not banana ) else ( echo is other ) endlocal pause
※/i 是忽略大小寫,注意繁中版的文檔寫錯了;not 可判斷相反的情形
※/i 和 not 都不是必要的
※判斷除了上面 2 種以外,還有 6 種
equ:equals,等於,等同此例的 ==
neq:not equals,不等於,等同此例的 not ==
lss:less,小於
leq:less equals,小於等於
gtr:greater,大於
geq:greater equals,大於等於
※exist
@echo off setlocal if exist "x.txt" ( echo o ) else ( echo x ) endlocal pause
※判斷本路徑下有沒有 x.txt 這支檔案或目錄
※迴圈裡判斷檔案
@echo off setlocal for %%i in (*) do ( ::if exist "fileName" ( if "%%i" == "fileName" ( echo o ) else ( echo x ) ) endlocal pause
※如果在迴圈裡判斷,不要用 exist,它只要路徑下有,所有迴圈都會認為是有,除非剛好此路徑下只有一支檔案
※迴圈裡判斷目錄
@echo off setlocal for /d %%i in (*) do ( ::if exist "folderName" ( if "%%i" == "folderName" ( echo o ) else ( echo x ) ) endlocal pause
※同樣的,也不要在裡面判斷目錄,它只要路徑下有這個目錄,所有迴圈都會認為是有,除非剛好此路徑下只有一個目錄
※判斷變數
@echo off setlocal set a=aaa if defined a ( echo have a ) endlocal pause
※使用 defined 判斷有沒有變數
沒有留言:
張貼留言