bat腳本常用命令及親測示例代碼超詳細(xì)講解
【內(nèi)容】:
注意:編輯bat文件請使用ANSI編碼(不然會出現(xiàn)中文亂碼)
1、語句注釋
rem命令行注釋,可以回顯(語句會在命令行中顯示);
::兩個冒號,效果同上,但不會回顯。(冒號后加任意非字母數(shù)字字符都可起到注釋作用)
2、暫停
pause暫停,命令行中出現(xiàn)"請按任意鍵繼續(xù)..."
自定義暫停時的文本,如下:
::pause>nul,隱藏原暫停文本 echo 這里是自定義文本! & pause > nul
3、輸出和換行
echo后加內(nèi)容即輸出該內(nèi)容,如:echo "welcome!";
echo.換行命令,即echo后加一個點
4、開啟關(guān)閉回顯
@置于語句前則該條語句不會回顯(無視echo on)
echo off關(guān)閉回顯功能,直到出現(xiàn)echo on,但其本身會回顯,故其之前往往和@一起使用,即@echo off(關(guān)閉所有回顯功能)
5、新建文件、增加文件內(nèi)容
@echo off rem 格式:echo 文件內(nèi)容>文件路徑 echo @echo off>test1.bat ::其中>>在文末添加,>覆蓋原內(nèi)容 echo echo this is test>>test1.bat echo pause>>test1.bat rem 顯示該文件內(nèi)容 type test1.bat pause
6、設(shè)置標(biāo)題title
@echo off ::title設(shè)置標(biāo)題 title 我測試一下! pause
7、設(shè)置顏色
例:color 0A
8、if語句判斷
特別特別注意:if語句塊在執(zhí)行時是當(dāng)做一條語句加載的,故需要通過11中的延遲賦值來解決其內(nèi)部變量引用的問題
::if常規(guī)用法,注意空格 @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
如上的操作數(shù)可以是字符串、數(shù)值、變量;當(dāng)參與比較的字符串是字符串時,將被轉(zhuǎn)換為對于的ASCII碼進行比較;比較運算符有如下:
if語句中的'與'、'或'、'非'邏輯判斷
::'與'一般用if嵌套實現(xiàn) @echo off set /p a= ::當(dāng)a小于10且大于0 if %a% lss 10 if %a% gtr 0 echo 輸入的是0-10 pause
::'非'用not可以實現(xiàn) @echo off set /p a= ::a不小于10 if not %a% lss 10 ( echo 輸入的是不小于10 ) pause
::'或'實現(xiàn)一:使用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
::'或'實現(xiàn)二:使用額外變量標(biāo)記結(jié)果,再判斷該變量(邏輯簡單但代碼多) @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語句跳轉(zhuǎn)
@echo off ::使用冒號加標(biāo)記名作為goto語句的標(biāo)記 :start set /p param= if %param%==4 (echo 請不要輸入4! & goto start) else (echo %param%) pause
10、set用法之接收用戶輸入數(shù)據(jù)
@echo off set /p param=請輸入密碼: echo %param% pause
11、set用法之定義變量和延遲賦值
請?zhí)貏e注意這個機制,真的是特別惡心
::輸出為1 @echo off set a=1 set a=2&echo %a% pause
注意:批處理在運行“set a=2&echo %a%”之前,會先把這一句整句讀取并做了預(yù)處理,即對變量a賦了值,那么%a%值為1,為解決該問題,批處理設(shè)計了變量延遲。也就是說,在讀取了一條完整的語句之后,不立即對該行的變量賦值,而會在某個單條語句執(zhí)行之前再進行賦值,具體實現(xiàn)如下:
::輸出為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用法之系統(tǒng)變量
@echo off ::查看所有環(huán)境變量 echo ----------------ALL---------------------- set echo ----------------END---------------------- ::查看環(huán)境變量JAVA_HOME的值 if defined JAVA_HOME ( echo JAVA_HOME:%JAVA_HOME% ) else ( echo 未定義JAVA_HOME ) pause
13、set用法之定義數(shù)字表達式
@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語句循環(huán)
@echo off ::關(guān)鍵字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 當(dāng)前硬盤的分區(qū)有: for %%i in (%str%) do if exist %%i: echo %%i: pause
@echo off ::找出當(dāng)前目錄下文件名為四個字符的txt文件 for %%i in (????.txt) do echo "%%i" pause
15、變量%0--%9
%0指該文件本身,%1--%9為接收到的參數(shù),如下例子中子程序的%1即為主程序傳輸?shù)膒aram1,%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 這是接收到的第一個參數(shù)%1 和第二個參數(shù)%2 pause
@echo off set /p param= if %param%==4 (echo 請不要輸入4!) else (echo %param%) ::%0在當(dāng)前窗口重新調(diào)用自身 %0
16、切換目錄
::@echo off ::顯示當(dāng)前目錄 cd ::切換到根目錄 cd\ ::盤符加冒號,切換到該盤 d: ::切換到e:hi目錄下(目錄名不區(qū)分大小寫) cd /d e:\hi ::保存當(dāng)前目錄,并切換當(dāng)前目錄為d:\test pushd d:\test ::恢復(fù)當(dāng)前目錄為剛才保存的e:\hi popd pause
17、md命令創(chuàng)建文件夾
::創(chuàng)建文件夾 md e:\test\test1 ::文件夾名有空格需要加引號 md "e:\test op" ::空格隔開,創(chuàng)建多個 md e:\test1 e:\test9\test2 "e:\test5 lmn"
18、rd命令刪除文件夾
@echo off ::刪除e:\test op下空文件夾,不為空不能刪除 rd "e:\test op" ::刪除e:\test9下所有文件夾,不管是否為空,但會詢問是否確認(rèn)刪除[Y/N] rd /s e:\test9 ::自定義刪除提示信息 echo 是否刪除[Y/N]: & rd /s e:\test9>nul ::/s/q聯(lián)合使用,不會詢問直接刪除 rd /s/q e:\test9
19、move命令移動文件(夾)
@echo off ::文件夾移動,如果test文件夾存在,則將test5文件夾移動到test文件夾下 ::如果test文件夾不存在,則將test5文件夾移動到test1文件夾下并重命名為test ::注意:文件夾移動不能跨分區(qū) move e:\test5 e:\test1\test ::將d:\test\1.txt文件移動到e:\下并重命名為23.txt ::如果該目錄已存在23.txt,則會覆蓋 move d:\test\1.txt e:\23.txt>nul&&echo 移動成功并重命名 ::將e:\23.txt文件移動到e:\test文件夾下 move e:\23.txt e:\test>nul&&echo 移動到文件夾下
20、del命令刪除文件
@echo off ::刪除該層目錄下的所有文件,需要確認(rèn)[Y/N] del d:\test pause ::不需要確認(rèn) del /q d:\test ::刪除該目錄下所有層級的文件,不刪除文件夾,需要逐個文件夾確認(rèn) del /s d:\test ::刪除文件111.png,不需要確認(rèn) del d:\test\111.png
21、cope命令復(fù)制文件
@echo off ::將d:\test\test.txt復(fù)制到e:\test1\目錄下并重命名為test2.txt ::如果test2.txt文件已存在,將自動覆蓋 copy d:\test\test.txt e:\test1\test2.txt ::將e:\test該層目錄下所有文件復(fù)制到d:\test1\test3文件夾下 ::前提d:\test1\test3文件夾必須已存在 ::相同文件名的文件會被覆蓋 copy e:\test d:\test1\test3
22、xcope命令復(fù)制文件
@echo off ::將e:\test目錄下所有文件(夾)復(fù)制到d:\test1 ::/e目錄下所有文件(夾),/y已存在時直接覆蓋 xcopy e:\test d:\test1 /e/y
23、cope命令合并文件
@echo off cd /d d:\test ::將129.txt和156.txt兩個文件內(nèi)容合并存入新建的new.txt中 copy 129.txt+156.txt new.txt ::打印出new.txt中的內(nèi)容 type new.txt ::將d:\mp3\111.mp3和e:\2.mp3以二進制數(shù)據(jù)合并復(fù)制到d:\new.mp3 ::其中/b二進制,/a文本形式 copy /b d:\mp3\111.mp3+e:\2.mp3 d:\new.mp3
24、ren命令重命名文件(夾)
@echo off ::將1.txt重命名為58.bat ren d:\test\1.txt 58.bat ::將d:\test\目錄下所有文件名為1開頭的txt文件改為bat文件 ren d:\test\1*.txt *.bat ::將d:\test\目錄下所有文件名為1開頭三個字符的bat改為txt文件 ren d:\test\1??.bat ???.txt
25、call使用
在程序中調(diào)用子腳本,在當(dāng)前程序中運行子腳本代碼,子腳本執(zhí)行完后繼續(xù)執(zhí)行本程序之后的代碼
::該文件名為test.bat @echo off echo 這是主程序第一個輸出 timeout 2 call test1.bat param1 param2 timeout 2 echo 這是主程序第二個輸出 pause
::該文件名為test1.bat @echo off timeout 1 echo 這是子程序第一個輸出 echo 這是接收到的第一個參數(shù)%1 和第二個參數(shù)%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 ::每隔一秒輸出斐波拉契數(shù)列 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命令
注意:執(zhí)行start時將開啟一個新線程來執(zhí)行該程序,原程序不受影響繼續(xù)執(zhí)行
@echo off ::打開test.txt文件 start e:\test.txt ::啟動jar包 start java -jar e:\demo.jar pause
啟動一個新的cmd窗口并在其內(nèi)執(zhí)行命令
https://www.jb51.net/article/245248.htm
28、調(diào)用彈框
::一、MSG命令方式 @echo off ::/time:5設(shè)置時間彈框的顯示時間為5S,5S后自動關(guān)閉 msg * /time:5 這里是彈窗顯示的文本 pause ::設(shè)置彈窗的多行文本 (echo 這是彈窗的第一行文本 echo 這是第二行文本)|msg * /time:5 pause
::一、調(diào)用VBScript的MsgBox實現(xiàn)彈窗 @echo off ::第二個參數(shù)65的解釋在代碼之后的列表中 mshta vbscript:msgbox("彈窗單行顯示內(nèi)容",65,"彈窗的標(biāo)題")(window.close) ::多行顯示文本可在文本中使用vbCrLf或vbNewLine set msg="多行顯示vbCrLf這是第二行vbNewLine這是第三行" mshta vbscript:msgbox(Replace(Replace(%msg%,"vbCrLf",vbCrLf),"vbNewLine",vbNewLine),6,"自定義標(biāo)題")(window.close)
MsgBox的button參數(shù)取值如下:
0 = vbOKOnly - 只顯示確定按鈕。
1 = vbOKCancel - 顯示確定和取消按鈕。
2 = vbAbortRetryIgnore - 顯示放棄、重試和忽略按鈕。
3 = vbYesNoCancel - 顯示是、否和取消按鈕。
4 = vbYesNo - 顯示是和否按鈕。
5 = vbRetryCancel - 顯示重試和取消按鈕。
16 = vbCritical - 顯示臨界信息圖標(biāo)。
32 = vbQuestion - 顯示警告查詢圖標(biāo)。
48 = vbExclamation - 顯示警告消息圖標(biāo)。
64 = vbInformation - 顯示信息消息圖標(biāo)。
0 = vbDefaultButton1 - 第一個按鈕為默認(rèn)按鈕。
256 = vbDefaultButton2 - 第二個按鈕為默認(rèn)按鈕。
512 = vbDefaultButton3 - 第三個按鈕為默認(rèn)按鈕。
768 = vbDefaultButton4 - 第四個按鈕為默認(rèn)按鈕。
0 = vbApplicationModal - 應(yīng)用程序模式:用戶必須響應(yīng)消息框才能繼續(xù)在當(dāng)前應(yīng)用程序中工作。
4096 = vbSystemModal - 系統(tǒng)模式:在用戶響應(yīng)消息框前,所有應(yīng)用程序都被掛起。
注意:第一組值 (0 - 5) 用于描述對話框中顯示的按鈕類型與數(shù)目;第二組值 (16, 32, 48, 64) 用于描述圖標(biāo)的樣式;第三組值 (0, 256, 512) 用于確定默認(rèn)按鈕;而第四組值 (0, 4096) 則決定消息框的樣式。在將這些數(shù)字相加以生成 buttons 參數(shù)值時,只能從每組值中取用一個數(shù)字。
29、獲得管理員權(quán)限
可嘗試以下兩種方式
@ 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 ::上面這段代碼之后執(zhí)行的所有東西都是管理員權(quán)限方式
@echo off >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" if '%errorlevel%' NEQ '0' ( echo 請求管理員權(quán)限... 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 獲得管理員權(quán)限 pause
30、for語句讀取文件內(nèi)容
@echo off ::按行讀取d:\test.txt文件中的內(nèi)容,輸出每行的第一個數(shù)據(jù),默認(rèn)每行內(nèi)以空格和tab為分隔符 for /f %%i in (d:\test.txt) do echo %%i ::delims參數(shù)指定分隔符為/ for /f "delims=/" %%i in (d:\test.txt) do echo %%i ::tokens參數(shù)指定讀取第二列,tokens=*讀取所有 for /f "tokens=2 delims=/" %%i in (d:\test.txt) do echo %%i ::skip參數(shù)直接跳過前兩行,從第三行開始 ::tokens=2,*讀取第二個和之后剩余所有,%%i為第一列值,%%j為之后剩余所有 ::tokens=1,4讀取第一個和第四個,%%i為第一列值,%%j為第四列值 ::('net start')表示將單引號內(nèi)語句的執(zhí)行結(jié)果作為集合 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參數(shù)直接忽略以#開頭的行 for /f "eol=# tokens=*" %%i in (d:\test.txt) do echo %%i
31、sc和net命令
@echo off ::關(guān)閉/啟動MySQL服務(wù),執(zhí)行該條語句后會立即執(zhí)行之后的代碼,不會等待停止/啟動的過程 sc stop MySQL sc start MySQL ::設(shè)置MySQL服務(wù)為自啟動,demand手動,disabled禁用 sc config MySQL start= auto ::安裝服務(wù) sc create MySQL binPath= "F:\installFiles\mysql-5.7.1.exe" ::卸載服務(wù)(卸載前先關(guān)閉服務(wù)) sc delete MySQL ::關(guān)閉/啟動MySQL服務(wù),等待停止/啟動的過程,完成后執(zhí)行之后的代碼 net start MySQL net stop MySQL ::查看所有運行的服務(wù) net start
32、ping命令
@echo off ping 192.168.0.225 ::無休止ping某地址 ping www.baidu.com -t
33、mshta命令
::可以調(diào)用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("彈窗單行顯示內(nèi)容",65,"彈窗的標(biāo)題")(window.close) mshta vbscript:CreateObject("Wscript.Shell").popup("彈窗內(nèi)容",7,"標(biāo)題",64)(window.close) ::連續(xù)彈二個信息框 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盤---請謹(jǐn)慎操作,一般莫搞騷操作 format a: ::用以判斷上一條命令是否執(zhí)行成功,默認(rèn)為0,出錯為1 echo %errorlevel% ::這個很好理解 就是判斷errorlevel為0 if %errorlevel% == 0 echo 搞定 ::下面相當(dāng)于判斷errorlevel大于等于0 等同于%errorlevel% GEQ 0 if errorlevel 0 echo 搞定 ::下面相當(dāng)于判斷errorlevel大于等于0且小于1 等同于%errorlevel% == 0 if errorlevel 0 if not errorlevel 1 echo 0 pause
子程序exit退出時可用exit /bnum來指定返回碼,主程序用errorlevel可以接受到該返回碼
@echo off echo this is test.bat echo %errorlevel% call test1.bat echo %errorlevel% pause
@echo off echo this is test1.bat echo 按任意鍵結(jié)束test1.bat!&pause>nul &exit /b 123
- 腳本請使用ANSI編碼
- 很多操作需要管理員權(quán)限,所以注意使用管理員權(quán)限執(zhí)行腳本
- if語句一次性加載真的很惡心,變量賦值注意延遲加載
- 字符串中避免使用特殊字符小括號
- 環(huán)境變量設(shè)置完成后在新窗口才可以查看,所以設(shè)置完了之后無法立馬查看,%0調(diào)用自身是在當(dāng)前窗口繼續(xù)執(zhí)行,也無法查看
到此這篇關(guān)于bat腳本常用命令及親測示例代碼超詳細(xì)講解的文章就介紹到這了,更多相關(guān)bat腳本命令內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。