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=