2017年12月15日 星期五

Windows 批次檔-迴圈、if

※迴圈

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 判斷有沒有變數

沒有留言:

張貼留言