天天看點

Bat 常用用法

1. bat 檔案編碼

    使用 ANSI 編碼格式,其他格式會報錯或者中文不識别。

2. bat 注釋

    單行:兩個英文冒号 或 rem(隻有置于行首才有效)

    多行:使用 goto 語句跳過

3. echo 輸出

    echo hello world

    echo %a%

    輸出不存在的變量:ECHO 處于關閉狀态。

4. @echo off

    執行 bat 語句時不列印

5. bat 變量

    1)設定變量 set var=AAA

    注意:等号兩邊不留白格(空格也會指派給變量);AAA 不同于 "AAA";

    2)使用變量:用百分号包起來 %var%

    3)使用 set 設定的變量在目前打開的指令行視窗有效,直到目前指令行視窗關閉

set a=AAA
set a1= AAA
set b="AAA"
set c=AA BB
echo %a%
echo %a1%
echo %b%
echo %c%
           

----執行結果:

AAA

 AAA

"AAA"

AA BB

6. 切換盤符/目錄操作

    e:

    cd subDir

    cd ..

    cd \

7. 執行其他指令:

    注:執行失敗不會阻塞後面的語句

    1.start:繼續執行後邊語句,不阻塞

    2.call 調用并阻塞,等待執行完成後再執行後邊語句

    3.預設不寫為 call

    4.擷取上一條指令執行結果:%ERRORLEVEL%

rem 調用其他bat
call other.bat
rem 其他程式
svn update
test.py
notepad test.txt
start test.exe
rem 擷取執行上一條指令執行結果
set result=%ERRORLEVEL%
if %result% equ 0 (
    echo sucess!
) else (
    echo error!
)
           

---------------------------文法相關-------------------------------

1. 擷取啟動參數

指令行啟動bat:test.bat 1 2 3

test.bat 内容:

set p0=%0
set p1=%1
set p2=%2
set p3=%3
echo 第0個參數:%p0%
echo 第1個參數:%p1%
echo 第2個參數:%p2%
echo 第3個參數:%p3%
echo %p3%
           

----執行結果:

第0個參數:test

第1個參數:1

第2個參數:2

第3個參數:

ECHO 處于關閉狀态。(不會阻斷執行後面的yuj)

2. 邏輯判斷

1)大小比較:數字字元串都可以比較,下面符号大小寫都可以

注意:為空的變量比較會報錯,可以兩邊都加雙引号

EQU - 等于

NEQ - 不等于

LSS - 小于

LEQ - 小于或等于

GTR - 大于

GEQ - 大于或等于

2)判斷相同用:==

注意:為空的變量比較會報錯,可以兩邊都加雙引号

set var1=a
set var2=b
if %var1% EQU a echo var1 EQU a
if %var2% lss %var1% echo var2 less var1
if %var2% GTR %var1% echo var2 GTR var1
if "%var3%"=="" (
    echo var3 是空。
)
if %var1%==a (
    echo var1==a
) else (
    echo a not equal a
)
rem 不加引号報錯:此時不應有 (。
if "%var3%"=="a" (
    echo var3==a
) else (
    echo var3!=a
)
           

----輸出結果:

var1 EQU a

var2 GTR var1

var3 是空。

var1==a

var3!=a

3. 接受輸入

    set /p var=

4. goto 語句

:input
echo 輸入參數(r,t):
set /p p=
if %p%==r goto or
if %p%==t goto ot
goto input

:or
echo there is or
:ot
echo there is ot
           

----輸出:

輸入參數(r,t):

o

輸入參數(r,t):

r

there is or

there is ot

5. 擷取路徑

c:
rem:有切換目錄,%cd% 會變化
echo 目前cmd路徑:%cd%
echo 目前bat所在目錄:%~dp0
echo bat完整路徑:%~f0
echo bat所在根目錄:%~d0
echo bat所在路徑(去掉根盤符):%~p0
echo bat檔案名(包含擴充名):%~nx0
echo bat檔案名(不含擴充名):%~n0
echo bat擴充名:%~x0
echo bat檔案屬性:%~a0
echo bat修改時間:%~t0
echo 檔案大小(位元組數):%~z0
echo bat多個資訊:%~ftza0
F:
           

----執行結果:

目前cmd路徑:C:\Windows\System32

目前bat所在目錄:F:\ddt2_tag\GenerateTool\

bat完整路徑:F:\ddt2_tag\GenerateTool\test.bat

bat所在根目錄:F:

bat所在路徑(去掉根盤符):\ddt2_tag\GenerateTool\

bat檔案名(包含擴充名):test.bat

bat檔案名(不含擴充名):test

bat擴充名:.bat

bat檔案屬性:--a------

bat修改時間:2020/07/08 15:08

檔案大小(位元組數):2623

bat多個資訊:--a------ 2020/07/08 15:08 2623 F:\ddt2_tag\GenerateTool\test.bat

6. 檔案/檔案夾相關操作

rem 删除檔案
del mytest/test.txt
rem 删除目錄及其包含目錄及檔案;/s:删除子目錄及包含檔案;/q:不詢問,直接删除
rd /s /q mytest
rem 建立檔案夾
md mytest
rem 建立檔案
echo aa >> mytest/test.txt
echo bb >> mytest/test.txt
rem 上面生成test.txt 并有兩行内容:aa bb
rem 判斷是否存在檔案、檔案夾
if exist dir echo exist dir
if exist file echo exist file
rem 拷貝 /s(複制目錄和子目錄,除了空的) /e(複制目錄和子目錄,包括空的) /y(詢問覆寫等自動選是);xcopy檔案時會詢問是檔案還是目錄,copy不會。
xcopy test\* test1 /e /y
copy aa.txt bb.txt
rem 打開檔案夾浏覽
explorer mytest
rem 修改檔案名:
ren aa.txt bb.txt
rem ren 修改包含子目錄的目錄失敗:拒絕通路。
rem 通配符:
rem 将a開頭的改為b開頭
ren a*.txt b*.txt
rem 将b開頭并檔案名為2個字元測改為a開頭
ren b?.txt a?.txt
rem 移動檔案夾:移動目錄(目錄不為空)
move dir1/dir11 dir2/dir22
           

7. 循環目錄

set dir=F:\ddt2_tag\GenerateTool\mytest
rem dir 參數:/s 包含子目錄,/b 隻顯示檔案夾和檔案,/a-d 隻顯示檔案,/ad 隻顯示檔案夾
for /f "delims=" %%i in ('dir /b /a-d /s %dir%') do echo %%~fi
rem 并讀取檔案内容:
for /f "delims=" %%i in ('dir /b /a-d /s %dir%') do (
    echo %%~fi
    for /f "delims=" %%I in (%%~fi) do (
        echo %%I
    )
)
           

8. for /f 相關用法

作用:讀取/處理 字元串,檔案,指令

參數:

    [email protected]  -指定一個行注釋字元,遇到@開頭的行就忽略掉。

    skip=n      - 指定在檔案開始時忽略的行數。

    delims=xx  - 指定分隔符(可多個)。預設是空格和TAB。

    tokens=x,y,m-n  - 指定擷取delims分割後的列内容

    usebackq        - 1.把單引号字元串作為指令;2.允許雙引号擴起檔案名稱。

rem 字元串
for /f %%I IN ("checkversion.bat") DO (
	echo %%I
)
rem 檔案
for /f %%I IN (checkversion.bat) DO (
	echo %%I
)
rem 指令行
for /f %%I IN ('set config') DO (
	echo %%I
)
rem 指令行:`` 和 usebackq 結合使用才有效
for /f "usebackq" %%I IN (`set config`) DO (
	echo %%I
)
rem 檔案而不是字元串:usebackq 和 ""
for /f "usebackq" %%I IN ("test.xtx") DO (
	echo %%I
)
rem 參數 eol: 忽略 @ 開頭的行 (隻能一個字元)
for /f "[email protected]" %%I in (test.txt) do (
	echo %%I
)
rem 參數 skip: 忽略開始行數
for /f "skip=5" %%I in (test.txt) do (
	echo %%I
)
rem 參數 delims:指定分隔符。預設是空格和TAB。
rem 預設情況:隻能取到分開後的第一個
for /f %%I in (test.txt) do (
	echo %%I
)
rem 取前3個元素
for /f "tokens=1-3" %%I in (test.txt) do (
	echo %%I %%J %%K
)
rem 不分割(把預設分割也去掉)
for /f "delims=" %%I in (test.txt) do (
	echo %%I
)
rem 指定分割,取的分割後的個數
for /f "tokens=1-3 delims=," %%I in (test.txt) do (
	echo %%I %%J %%K
)
rem 取指定取得元素
for /f "tokens=1,3,4 delims= " %%I IN ("11 22 33 44 55 66") DO (
	echo 1=%%I, 2=%%J, 3=%%K
)
echo.
rem ------------------------
rem 示例
rem tokens 使用星号(*),後面的不分割了
for /f "tokens=1,* delims= " %%I IN ("11 22 33 44 55 66") DO (
	echo 1=%%I, 2=%%J
)
rem 注:tokens=2,* 同 tokens=2*
rem 以分号分割:
set str="11"22"33"44"55"66"77"
echo %str%
for /f tokens^=2^,5^ delims^=^" %%I IN (%str%) DO (
	echo 1=%%I, 2=%%J
)
           

----示例輸出:

1=11, 2=22 33 44 55 66

"11"22"33"44"55"66"77"

1=22, 2=55

9. 配置數組

set config[1].name=name1
set config[1].score=100
set config[2].name=name1
set config[2].score=100
set cur_index=1
for /f "tokens=1-3 delims==." %%I in ('set config[%cur_index%]') do (
	echo %%J = %%K
)
           

---- 輸出

name = name1

score = 100

10. 數學計算

set a=10
set /a b=a+10
set /a d=a-5
set /a e=a*5
rem 隻能取到商,無小數
set /a c=a/4
echo %b%, %d%, %e%, %c%
           

---輸出結果:

20, 5, 50, 2

11. 字元串處理

分割字元串用: for /f

截取字元串:

set str=0123456789abcdefghijklmnopq
echo 完整字元串: %str%
echo 截取前3個字元:%str:~0,3%
echo 截取後3個字元:%str:~-3%
echo 截取第3個到倒數第2個之間:%str:~2,-1%
echo 截取第3個後的5個長度:%str:~3,5%
echo 截取第3個到第五個:%str:~2,5%
echo 截取從倒數第8個,長度5:%str:~-8,5%
rem 是否包含字元串:
echo %str%| findstr 12345 >nul && (
	echo find 12345
)
           

----輸出:

完整字元串: 0123456789abcdefghijklmnopq

截取前3個字元:012

截取後3個字元:opq

截取第3個到倒數第2個之間:23456789abcdefghijklmnop

截取第3個後的5個長度:34567

截取第3個到第五個:23456

截取從倒數第8個,長度5:jklmn

find 12345

替換,拼接:

rem 替換字元串
set str=AA123456AABB
set str1=%str:AA=CC%

rem 拼接:
set str1=AA
set str2=BB
set str=%str1%%str2%
echo %str%
           

12. 時間

echo %time%
echo %date%
           

----輸出結果:

16:18:52.77

2020/07/08 周三

13. 是否包含

set a=r
for %%I in (r,t) do (
    if %a%==%%I (
        echo find !!!!!!!!!!!
        goto forEnd
    )
)
:forEnd
           

14. 讀取檔案指定内容,下載下傳網絡資源

@echo off
set file=test.txt
rem 讀取文本 test.txt 取得第一個 url= 的行,把的值取出來
for /f "tokens=1,2 delims==" %%a in (%file%) do (
	echo %%a| findstr url >nul && (
		set remotePath=%%b
		goto forEnd
	)
)
:forEnd
echo remotePath: %remotePath%
echo 通路遠端連接配接:%remotePath%
rem 下載下傳遠端連接配接内容到 getUrl.html 中
curl %remotePath% -o getUrl.html
           

------------其他用法------------------

1. 判斷某應用程式是否在運作

for /f %%i in ('tasklist') do (
	if %%i==xxx.exe (
		echo find xxx.ext
		goto forEnd
	)
)
:forEnd
           

2. 檢視環境變量

rem 檢視所有環境變量
set
rem 檢視變量名環境變量
set 變量名
rem 将環境變量設定為val,隻在目前 cmd 視窗有效
set 變量名=val
rem 删除某個環境變量,目前視窗有效
set BL=