首頁 > 軟體

bat指令碼常用命令及親測範例程式碼超詳細講解

2022-04-20 13:01:07

【內容】:

注意:編輯bat檔案請使用ANSI編碼(不然會出現中文亂碼)

1、語句註釋

rem命令列註釋,可以回顯(語句會在命令列中顯示);

::兩個冒號,效果同上,但不會回顯。(冒號後加任意非字母數位字元都可起到註釋作用)

2、暫停

pause暫停,命令列中出現"請按任意鍵繼續..."

自定義暫停時的文字,如下:

::pause>nul,隱藏原暫停文字
echo 這裡是自定義文字! & pause > nul

3、輸出和換行

echo後加內容即輸出該內容,如:echo "welcome!";

echo.換行命令,即echo後加一個點

4、開啟關閉回顯

@置於語句前則該條語句不會回顯(無視echo on)

echo off關閉回顯功能,直到出現echo on,但其本身會回顯,故其之前往往和@一起使用,即@echo off(關閉所有回顯功能)

5、新建檔案、增加檔案內容

@echo off
rem 格式:echo 檔案內容>檔案路徑
echo @echo off>test1.bat
::其中>>在文末新增,>覆蓋原內容
echo echo this is test>>test1.bat
echo pause>>test1.bat
rem 顯示該檔案內容
type test1.bat
pause

6、設定標題title

@echo off
::title設定標題
title 我測試一下!
pause

 7、設定顏色

例:color 0A

8、if語句判斷

特別特別注意:if語句塊在執行時是當做一條語句載入的,故需要通過11中的延遲賦值來解決其內部變數參照的問題

::if常規用法,注意空格
@echo off
:start
set /p a=
if not %a%==1 (
	echo 請輸入1
	goto start
) else (
	echo 輸入正確
)
pause>nul
@echo off
if not exist d:test.bat (
	echo @echo off>d:test.bat
) else (
	del d:test.bat
)
pause>nul
@echo off
set a=1
if defined a (
	echo 已定義a
) else (
	echo 未定義a
)
pause>nul
@echo off
set a=123
set b=abc
set c=12
::/i字串大小寫忽略
if /i %b% equ ABC (
  if %a% geq %c% (
    echo %a%^>=%c%
  ) else (
    echo %a%^<%c%
  )
) else (
  echo %b%不等於ABC
)
pause>nul

如上的運算元可以是字串、數值、變數;當參與比較的字串是字串時,將被轉換為對於的ASCII碼進行比較;比較運運算元有如下:

if語句中的'與'、'或'、'非'邏輯判斷

::'與'一般用if巢狀實現
@echo off
set /p a=
::當a小於10且大於0
if %a% lss 10 if %a% gtr 0 echo 輸入的是0-10
pause
::'非'用not可以實現
@echo off
set /p a=
::a不小於10
if not %a% lss 10 ( echo 輸入的是不小於10 )
pause
::'或'實現一:使用if巢狀(程式碼簡潔但邏輯不太好理解)
@echo off
set /p a=請輸入a:
set /p b=請輸入b:
::a小於5或b小於5時
if %a% lss 5 (echo a小於5或b小於5) else (if %b% lss 5 (echo a小於5或b小於5) else (echo a、b都不小於5))
pause
::'或'實現二:使用額外變數標記結果,再判斷該變數(邏輯簡單但程式碼多)
@echo off
set /p a=請輸入a:
set /p b=請輸入b:
::a小於5或b小於5時
set flag=0
if %a% lss 5 set flag=1
if %b% lss 5 set flag=1
if %flag% equ 1 ( echo a小於5或b小於5 ) else ( echo a、b都不小於5 )
pause

 9、goto語句跳轉

@echo off
::使用冒號加標記名作為goto語句的標記
:start
set /p param=
if %param%==4 (echo 請不要輸入4! & goto start) else (echo %param%)
pause

10、set用法之接收使用者輸入資料

@echo off
set /p param=請輸入密碼:
echo %param%
pause

11、set用法之定義變數和延遲賦值 

請特別注意這個機制,真的是特別噁心

::輸出為1
@echo off
set a=1
set a=2&echo %a%
pause

注意:批次處理在執行“set a=2&echo %a%”之前,會先把這一句整句讀取並做了預處理,即對變數a賦了值,那麼%a%值為1,為解決該問題,批次處理設計了變數延遲。也就是說,在讀取了一條完整的語句之後,不立即對該行的變數賦值,而會在某個單條語句執行之前再進行賦值,具體實現如下:

::輸出為2
@echo off&setlocal enabledelayedexpansion
set a=1
set a=2&echo !a!
pause

注意:'變數名=值'中間不要有空格

@echo off
::將0賦值給b
set b=0
echo b:%b%
::將空格和0賦值給a
set a= 0
echo a:%a%
::無法賦值
set c =0
echo c:%c%
pause

 12、set用法之系統變數

@echo off
::檢視所有環境變數
echo ----------------ALL----------------------
set
echo ----------------END----------------------
::檢視環境變數JAVA_HOME的值
if defined JAVA_HOME ( echo JAVA_HOME:%JAVA_HOME% ) else ( echo 未定義JAVA_HOME )
pause

13、set用法之定義數位表示式

@echo off
set a=1&set b=6
set c=%a%+%b%
::輸出1+6
echo %c%
set d=a+b
::輸出a+b
echo %d%
set /a e=a+b
::輸出7
echo %e%
pause

14、for語句迴圈

@echo off
::關鍵字for、in、do必有,括號必有
::分隔符可以是逗號、分號、等號、空格
::輸出為A換行1換行B。。。
for %%i in (A,B,C) do echo %%i & echo 1
pause>nul
@echo off
::找出D槽下所有檔案
for %%i in (d:*.*) do echo "%%i"
pause
@echo off
set str=c d e f g h i j k l m n o p q r s t u v w x y z
echo 當前硬碟的分割區有:
for %%i in (%str%) do if exist %%i: echo %%i:
pause
@echo off
::找出當前目錄下檔名為四個字元的txt檔案
for %%i in (????.txt) do echo "%%i"
pause

15、變數%0--%9

%0指該檔案本身,%1--%9為接收到的引數,如下例子中子程式的%1即為主程式傳輸的param1,%2即為param2

::該檔名為test.bat
@echo off
echo 這是主程式第一個輸出
timeout 2
start test1.bat param1 param2
timeout 2
echo 這是主程式第二個輸出
pause
::該檔名為test1.bat
@echo off
timeout 2
echo 這是子程式第一個輸出
echo 這是接收到的第一個引數%1 和第二個引數%2
pause
@echo off
set /p param=
if %param%==4 (echo 請不要輸入4!) else (echo %param%)
::%0在當前視窗重新呼叫自身
%0

 16、切換目錄

::@echo off
::顯示當前目錄
cd
::切換到根目錄
cd
::碟符加冒號,切換到該盤
d:
::切換到e:hi目錄下(目錄名不區分大小寫)
cd /d e:hi
::儲存當前目錄,並切換當前目錄為d:test
pushd d:test
::恢復當前目錄為剛才儲存的e:hi
popd
pause

17、md命令建立資料夾

::建立資料夾
md e:testtest1
::資料夾名有空格需要加引號
md "e:test op"
::空格隔開,建立多個
md e:test1 e:test9test2 "e:test5 lmn"

 18、rd命令刪除資料夾

@echo off
::刪除e:test op下空資料夾,不為空不能刪除
rd "e:test op"
::刪除e:test9下所有資料夾,不管是否為空,但會詢問是否確認刪除[Y/N]
rd /s e:test9
::自定義刪除提示資訊
echo 是否刪除[Y/N]: & rd /s e:test9>nul
::/s/q聯合使用,不會詢問直接刪除
rd /s/q e:test9

 19、move命令移動檔案(夾)

@echo off
::資料夾移動,如果test資料夾存在,則將test5資料夾移動到test資料夾下
::如果test資料夾不存在,則將test5資料夾移動到test1資料夾下並重新命名為test
::注意:資料夾移動不能跨分割區
move e:test5 e:test1test
::將d:test1.txt檔案移動到e:下並重新命名為23.txt
::如果該目錄已存在23.txt,則會覆蓋
move d:test1.txt e:23.txt>nul&&echo 移動成功並重新命名
::將e:23.txt檔案移動到e:test資料夾下
move e:23.txt e:test>nul&&echo 移動到資料夾下

20、del命令刪除檔案 

@echo off
::刪除該層目錄下的所有檔案,需要確認[Y/N]
del d:test
pause
::不需要確認
del /q d:test
::刪除該目錄下所有層級的檔案,不刪除資料夾,需要逐個資料夾確認
del /s d:test
::刪除檔案111.png,不需要確認
del d:test111.png

21、cope命令複製檔案

@echo off
::將d:testtest.txt複製到e:test1目錄下並重新命名為test2.txt
::如果test2.txt檔案已存在,將自動覆蓋
copy d:testtest.txt e:test1test2.txt
::將e:test該層目錄下所有檔案複製到d:test1test3資料夾下
::前提d:test1test3資料夾必須已存在
::相同檔名的檔案會被覆蓋
copy e:test d:test1test3

22、xcope命令複製檔案

@echo off
::將e:test目錄下所有檔案(夾)複製到d:test1
::/e目錄下所有檔案(夾),/y已存在時直接覆蓋
xcopy e:test d:test1 /e/y

23、cope命令合併檔案

@echo off
cd /d d:test
::將129.txt和156.txt兩個檔案內容合併存入新建的new.txt中
copy 129.txt+156.txt new.txt
::列印出new.txt中的內容
type new.txt
::將d:mp3111.mp3和e:2.mp3以二進位制資料合併複製到d:new.mp3
::其中/b二進位制,/a文字形式
copy /b d:mp3111.mp3+e:2.mp3 d:new.mp3

24、ren命令重新命名檔案(夾)

@echo off
::將1.txt重新命名為58.bat
ren d:test1.txt 58.bat
::將d:test目錄下所有檔名為1開頭的txt檔案改為bat檔案
ren d:test1*.txt *.bat
::將d:test目錄下所有檔名為1開頭三個字元的bat改為txt檔案
ren d:test1??.bat ???.txt

25、call使用

在程式中呼叫子指令碼,在當前程式中執行子指令碼程式碼,子指令碼執行完後繼續執行本程式之後的程式碼

::該檔名為test.bat
@echo off
echo 這是主程式第一個輸出
timeout 2
call test1.bat param1 param2
timeout 2
echo 這是主程式第二個輸出
pause
::該檔名為test1.bat
@echo off
timeout 1
echo 這是子程式第一個輸出
echo 這是接收到的第一個引數%1 和第二個引數%2
pause

26、timeout延遲

@echo off
set a=1
:start
echo %a%&set /a a=a+1
timeout 1 > nul
goto start
pause
@echo off
::每隔一秒輸出斐波拉契數列
set a=1
set b=1
echo %a%&timeout 1 >nul
echo %b%&timeout 1 >nul
:start
set /a c=a+b
echo %c%&set a=%b%&set b=%c%
timeout 1 > nul
goto start
pause

27、start命令

注意:執行start時將開啟一個新執行緒來執行該程式,原程式不受影響繼續執行

@echo off
::開啟test.txt檔案
start e:test.txt
::啟動jar包
start java -jar e:demo.jar
pause

啟動一個新的cmd視窗並在其內執行命令

https://www.jb51.net/article/245248.htm

28、呼叫彈框

::一、MSG命令方式
@echo off
::/time:5設定時間彈框的顯示時間為5S,5S後自動關閉
msg * /time:5 這裡是彈窗顯示的文字
pause
::設定彈窗的多行文字
(echo 這是彈窗的第一行文字
echo 這是第二行文字)|msg * /time:5
pause
::一、呼叫VBScript的MsgBox實現彈窗
@echo off
::第二個引數65的解釋在程式碼之後的列表中
mshta vbscript:msgbox("彈窗單行顯示內容",65,"彈窗的標題")(window.close)
::多行顯示文字可在文字中使用vbCrLf或vbNewLine
set msg="多行顯示vbCrLf這是第二行vbNewLine這是第三行"
mshta vbscript:msgbox(Replace(Replace(%msg%,"vbCrLf",vbCrLf),"vbNewLine",vbNewLine),6,"自定義標題")(window.close)

 MsgBox的button引數取值如下:

0 = vbOKOnly - 只顯示確定按鈕。
1 = vbOKCancel - 顯示確定和取消按鈕。
2 = vbAbortRetryIgnore - 顯示放棄、重試和忽略按鈕。
3 = vbYesNoCancel - 顯示是、否和取消按鈕。
4 = vbYesNo - 顯示是和否按鈕。
5 = vbRetryCancel - 顯示重試和取消按鈕。
16 = vbCritical - 顯示臨界資訊圖示。
32 = vbQuestion - 顯示警告查詢圖示。
48 = vbExclamation - 顯示警告訊息圖示。
64 = vbInformation - 顯示資訊訊息圖示。
0 = vbDefaultButton1 - 第一個按鈕為預設按鈕。
256 = vbDefaultButton2 - 第二個按鈕為預設按鈕。
512 = vbDefaultButton3 - 第三個按鈕為預設按鈕。
768 = vbDefaultButton4 - 第四個按鈕為預設按鈕。
0 = vbApplicationModal - 應用程式模式:使用者必須響應訊息方塊才能繼續在當前應用程式中工作。
4096 = vbSystemModal - 系統模式:在使用者響應訊息方塊前,所有應用程式都被掛起。

注意:第一組值 (0 - 5) 用於描述對話方塊中顯示的按鈕型別與數目;第二組值 (16, 32, 48, 64) 用於描述圖示的樣式;第三組值 (0, 256, 512) 用於確定預設按鈕;而第四組值 (0, 4096) 則決定訊息方塊的樣式。在將這些數位相加以生成 buttons 引數值時,只能從每組值中取用一個數位。

29、獲得管理員許可權

可嘗試以下兩種方式

@ echo off
%1 %2
ver|find "5.">nul&&goto :Admin
mshta vbscript:createobject("shell.application").shellexecute("%~s0","goto :Admin","","runas",1)(window.close)&goto :eof
:Admin
::上面這段程式碼之後執行的所有東西都是管理員許可權方式
@echo off
>nul 2>&1 "%SYSTEMROOT%system32cacls.exe" "%SYSTEMROOT%system32configsystem"
if '%errorlevel%' NEQ '0' (
	echo 請求管理員許可權...
	goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%getadmin.vbs"
"%temp%getadmin.vbs"
exit /B
:gotAdmin
echo 獲得管理員許可權
pause

 30、for語句讀取檔案內容

@echo off
::按行讀取d:test.txt檔案中的內容,輸出每行的第一個資料,預設每行內以空格和tab為分隔符
for /f %%i in (d:test.txt) do echo %%i
::delims引數指定分隔符為/
for /f "delims=/" %%i in (d:test.txt) do echo %%i
::tokens引數指定讀取第二列,tokens=*讀取所有
for /f "tokens=2 delims=/" %%i in (d:test.txt) do echo %%i
::skip引數直接跳過前兩行,從第三行開始
::tokens=2,*讀取第二個和之後剩餘所有,%%i為第一列值,%%j為之後剩餘所有
::tokens=1,4讀取第一個和第四個,%%i為第一列值,%%j為第四列值
::('net start')表示將單引號內語句的執行結果作為集合
for /f "skip=2 tokens=1,* delims=/" %%i in ('net start') do echo %%i %%j
::("asc/2ap/as5")表示對字串進行處理
for /f "tokens=2,* delims=/" %%i in ("asc/2ap/as5") do echo %%i--%%j
::eol引數直接忽略以#開頭的行
for /f "eol=# tokens=*" %%i in (d:test.txt) do echo %%i

31、sc和net命令

@echo off
::關閉/啟動MySQL服務,執行該條語句後會立即執行之後的程式碼,不會等待停止/啟動的過程
sc stop MySQL
sc start MySQL
::設定MySQL服務為自啟動,demand手動,disabled禁用
sc config MySQL start= auto
::安裝服務
sc create MySQL binPath= "F:installFilesmysql-5.7.1.exe"
::解除安裝服務(解除安裝前先關閉服務)
sc delete MySQL
::關閉/啟動MySQL服務,等待停止/啟動的過程,完成後執行之後的程式碼
net start MySQL
net stop MySQL
::檢視所有執行的服務
net start

32、ping命令

@echo off
ping 192.168.0.225
::無休止ping某地址
ping www.baidu.com -t

33、mshta命令

::可以呼叫vb指令碼和js指令碼
mshta vbscript:window.execScript("alert('hello world!');","javascript")(window.close)
mshta javascript:window.execScript("msgBox('hello world!')(window.close)","vbs")
mshta vbscript:msgbox("彈窗單行顯示內容",65,"彈窗的標題")(window.close)
mshta vbscript:CreateObject("Wscript.Shell").popup("彈窗內容",7,"標題",64)(window.close)
::連續彈二個資訊框
mshta vbscript:execute("msgbox ""one BOX"":msgbox ""two BOX"":window.close")

34、exit退出指令碼和檢視返回碼errorlevel

@echo off
set a=1
set b=
if defined a if defined b echo 都搞定了,按任意鍵就可以撤了!&pause>nul &exit
echo 我去!還有沒賦值的?
pause
@echo off
::格式化A盤---請謹慎操作,一般莫搞騷操作
format a:
::用以判斷上一條命令是否執行成功,預設為0,出錯為1
echo %errorlevel%
::這個很好理解 就是判斷errorlevel為0
if %errorlevel% == 0 echo 搞定
::下面相當於判斷errorlevel大於等於0 等同於%errorlevel% GEQ 0 
if errorlevel 0 echo 搞定
::下面相當於判斷errorlevel大於等於0且小於1 等同於%errorlevel% == 0
if errorlevel 0 if not errorlevel 1 echo 0
pause

子程式exit退出時可用exit /b num來指定返回碼,主程式用errorlevel可以接受到該返回碼

@echo off
echo this is test.bat
echo %errorlevel%
call test1.bat
echo %errorlevel%
pause
@echo off
echo this is test1.bat
echo 按任意鍵結束test1.bat!&pause>nul &exit /b 123

  • 指令碼請使用ANSI編碼
  • 很多操作需要管理員許可權,所以注意使用管理員許可權執行指令碼
  • if語句一次性載入真的很噁心,變數賦值注意延遲載入
  • 字串中避免使用特殊字元小括號
  • 環境變數設定完成後在新視窗才可以檢視,所以設定完了之後無法立馬檢視,%0呼叫自身是在當前視窗繼續執行,也無法檢視

到此這篇關於bat指令碼常用命令及親測範例程式碼超詳細講解的文章就介紹到這了,更多相關bat指令碼命令內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com