bat腳本基礎教程
https://www.cnblogs.com/linyfeng/p/8072002.html 自己動手太少了。
bat腳本就是DOS批處理腳本,就是將一系列DOS命令按照一定順序排列而形成的集合,運行在windows命令行環境上。本文主要介紹bat腳本基礎語法,希望完成本文內容學習之后具備基礎的bat腳本開發能力,提高工作效率。
為什么學習bat腳本?
在開始學習bat腳本前可能大家會有一個就是為什么要學習bat腳本,特別是擁有Python、Java、Shell等各種語言可以滿足自己開發小工具完成工作提高效率的情況下。在大家去搜索或者想了解bat腳本的時候或許已經給自己找到了一些理由。我學習bat腳本的原因很簡單,是因為我在用Notepad++編輯器寫完代碼后總是要跑到cmd命令行下執行Python myScript.py才能運行程序,多了很多操作步驟,很繁瑣(開始我還不知道Notepad++可以直接運行Python,配置參考Notepad++好用的功能和插件)。可以編寫一個myScript.bat腳本直接雙擊執行python腳本,myScript.bat腳本內容如下:
@echo off python myScript.py pause
如果你的Windows環境上同時裝有Python2.X和Python3.X,但是腳本必須使用Python2.X程序運行,可以使用Python2.X軟件絕對路徑,如下:
@echo off C:\Python27\python.exe myScript.py pause
大家可以自己測試感受下,從我個人總結來說學習bat的理由有以下2點:
(1)bat腳本作為Python的配套使用工具確實可以提高的編碼效率和工作效率。
(2)學習bat腳本基礎語法不會占用太多時間。
下面開始學習bat腳本基礎語法。
閱讀說明&建議
(1)本文描述內容為bat腳本最基礎內容,僅適合bat初學者。如果想完整學習,建議下載DOS批處理高級教程學習。
(2)常用"help command"或"command /?"查看命令的使用方法,如color /?。對於命令的基本語法和使用技巧列舉的很詳細。
基本概念
bat腳本就是DOS批處理腳本,就是將一些列DOS命令按照一定順序排列而形成的集合,運行在windows命令行環境上。
變量設置和讀取
(1)常用系統變量
%CD% 獲取當前目錄 %PATH% 獲取命令搜索路徑 %DATE% 獲取當前日期。 %TIME% 獲取當前時間。 %RANDOM% 獲取 0 和 32767 之間的任意十進制數字。 %ERRORLEVEL% 獲取上一命令執行結果碼
(2)變量讀取。使用%variable%可以獲取變量值,舉例如下
D:\>echo %RANDOM% 157
(3) 變量設置。使用set命令顯示、設置或刪除 windows環境變量。set命令用法可以在cmd下執行"set /?" 或"help set"查看。
SET [variable=[string]] #variable表示變量名,string表示變量值。
舉例如下:
D:\>set VAR1="I Love BAT Script" D:\>echo %VAR1% "I Love BAT Script"
字符串基本操作
(1)字符串截取。使用命令 echo %var:~n,k%,其中"%var",表示待截取字符的字符串,"~"取字符標志符,"n”表示字符截取起始位置,"k" 表示截取結束位置(不包含該字符)。舉例如下
@echo off set str=superhero echo str=%str% echo str:~0,5=%str:~0,5% echo str:~3=%str:~3% echo str:~-3=%str:~-3% echo str:~0,-3=%str:~0,-3% pause
輸出結果如下:
str=superhero str:~0,5=super str:~3=erhero str:~-3=ero str:~0,-3=superh 請按任意鍵繼續. . .
(2)字符串替換。使用命令%var:old_str=new_str% ,舉例如下
@echo off set str=hello world! set temp=%str:hello=good% echo %temp% pause
輸出結果如下:
good world! 請按任意鍵繼續. . .
DOS基本命令介紹
(1)rem 注釋符,也可以用兩個冒號代替(::)
REM [comment]
(2)echo 顯示信息,或啟用或關閉命令回顯。@字符放在命令前將關閉該命令回顯,無論此時echo是否為打開狀態。
echo on 批處理命令在執行時顯示自身命令行 echo off 批處理命令在執行時不顯示自身命令行 @echo off 關閉echo off命令行自身的顯示 echo Hello World 打印Hello World echo. 輸出空行,"."可以用,:;”/[\]+等任一符號替代 echo test > file.txt 創建包含字符test的file.txt文件 echo y | del d:\temp\*.txt 輸入y確認刪除
(3)pause 暫停並輸出“請按任意鍵繼續. . .”
pause 等待並提示"請按任意鍵繼續. . ." pause > nul 等待但不出現提示語 echo wait a moment.. & pause > nul 輸出指定輸出語"wait a moment.."並等待操作
(4)errorlevel。程序執行結果返回碼,執行成功返回0,失敗返回為1
(5)start 啟動一個單獨的窗口以運行指定的程序或命令,程序繼續向下執行。
START [command/program] [parameters]
(6)exit 退出CMD.EXE程序或當前批處理腳本
EXIT [/B] [exitCode] 參數說明: /B:指定要退出當前批處理腳本而不是 CMD.EXE。如果從一個批處理腳本外執行,則會退出 CMD.EXE exitCode:指定一個數字號碼。如果指定了 /B,將 ERRORLEVEL設成那個數字。如果退出 CMD.EXE,則用那個數字設置過程退出代碼
(7)cls 清除屏幕內容
(8)help 提供 Windows 命令的幫助信息
HELP [command]
文件操作命令
(1)copy 文件復制命令
copy d:\temp1\file1.txt d:\temp2 將文件file1.txt復制到temp2目錄,有相同文件提示 copy d:\temp1\file1.txt d:\temp2 /y 將文件file1.txt復制到temp2目錄,有相同文件覆蓋原文件,不提示 copy d:\temp1\* d:\temp2 /y 將temp1目錄下的所有文件復制到temp2目錄,有相同文件覆蓋原文件,不提示
(2)xcopy 目錄復制命令
xcopy temp1 d:\temp2 /y 將temp1目錄下的文件復制到temp2目錄,不包括temp1子目錄下的文件。 xcopy temp1 d:\temp2 /s /e /y 將temp1目錄下的文件復制到temp2目錄,包括temp1子目錄下的文件
(3)type 顯示文件內容命令
type file1.txt 查看file1文件內容 type file1.txt file2.txt #查看file1和file2文件內容 type file1.txt > file2.txt #將file1.txt文件內容重定向到file2.txt type nul > file1.txt #創建文件
(4)ren 重命名文件命令
ren d:\temp1\file1.txt file2.txt 修改temp目錄下的file1.txt文件名為file2.txt
(5)del 刪除文件命令
del d:\temp1\file1.txt 刪除temp目錄下的file1.txt文件 del d:\temp\*.txt 刪除temp目錄下的后綴為.txt的文件
目錄操作命令
(1) cd 顯示當前目錄或切換目錄
cd d:\temp1 切換到temp1目錄,當前目錄是d盤 cd /d d:\temp1 切換到temp1目錄,當前目錄非d盤 cd .. 切換到上一級目錄
(2)mkdir 創建目錄
mkdir test 在當前目錄下創建test目錄 mkdir d:\temp1\test 在temp1目錄下創建test目錄,如果temp1目錄不存在,自動創建
(3)rmdir 刪除目錄
rmdir d:\temp1 刪除空目錄temp1,非空則刪除失敗 rmdir d:\temp1 /s /q 刪除temp1目錄,包括子目錄(/s),並且刪除時不提示(/q)
(4)dir 顯示目錄下的子目錄和文件
dir d:\temp1 顯示temp1目錄下的文件和目錄信息,顯示信息包含日期、時間、文件類型和文件名 dir d:\temp1 /a:a /b 只顯示temp1目錄下(不包括子目錄)的文件的絕對路徑,不顯示日期、時間、文件類型和文件名 dir d:\temp1 /b /s /o:n /a:a 顯示temp1路徑下(包括子目錄)的所有文件的絕對路徑。輸出文件按照文件名數字順序排序 dir d:\temp1\*.txt /a:a /b /o:n 顯示.txt后綴文件,並且按照文件名順序排序(/on),其他排序方法查看help dir
說明:
(1)/b表示去除摘要信息,僅顯示完整路徑、/s表示循環列舉文件夾中的內容、/o:n 表示根據文件名排序、/a:a 表示只枚舉文件而不枚舉其他。
(2)單獨dir /b與dir /s 都不會顯示完整路徑,只有這兩個組合才會顯示完整路徑。
if/else判斷句使用
if/else條件語句,用來判定是否符合規定的條件,從而決定執行不同的命令。 在CMD下使用“IF /?”打開 IF 的系統幫助,IF有3種基本的用法,如下
IF [NOT] ERRORLEVEL number command IF [NOT] string1==string2 command IF [NOT] EXIST filename command
說明:
NOT:指定只有條件為 false 的情況下,Windows 才應該執行該命令。 ERRORLEVEL number:如果最后運行的程序返回一個等於或大於指定數字的退出代碼,指定條件為 true。 string1==string2:如果指定的文字字符串匹配,指定條件為 true。 EXIST filename:如果指定的文件名存在,指定條件為 true。 command:如果符合條件,指定要執行的命令。如果指定的條件為 FALSE,命令后可跟 ELSE 命令,該命令將在 ELSE 關鍵字之后執行該命令。
ELSE 子句必須出現在同一行上的 IF 之后。例如:
IF EXIST filename. ( del filename. ) ELSE ( echo filename. missing. )
或者如果都放在同一行上,以下子句有效:
IF EXIST filename. (del filename.) ELSE echo filename. missing
如果命令擴展被啟用,IF 會如下改變:
IF [/I] string1 compare-op string2 command IF CMDEXTVERSION number command IF DEFINED variable command
其中, compare-op 可以是:
EQU - 等於 NEQ - 不等於 LSS - 小於 LEQ - 小於或等於 GTR - 大於 GEQ - 大於或等於
而 /I 開關(如果指定)說明要進行的字符串比較不分大小寫。/I 開關可以用於 IF 的 string1==string2 的形式上。這些比較都是通用的;原因是,如果 string1 和 string2 都是由數字組成的,字符串會被
轉換成數字,進行數字比較。
for語句使用
cmd命令行窗口下,輸入help for 或者 for /? 查看for語句的使用方法。for語句基本格式如下:
FOR %variable IN (set) DO command [command-parameters]
參數說明:
%variable 指定一個單一字母可替換的參數。注意:批處理腳本中使用%%variable (set) 指定一個或一組文件。可以使用通配符。 command 指定對每個文件執行的命令。 command-parameters 為特定命令指定參數或命令行開關。
for語句還有4個參數,分別是 /d /r /l /f ,下面分別介紹這4個參數對應的for語句命令。
(1)/D參數的fro語句格式
FOR /D %variable IN (set) DO command [command-parameters]
說明:如果(set)集中包含通配符,則指定與目錄名匹配,而不與文件名匹配。
實例:打印C盤根目錄下的目錄名
@echo off for /d %%i in (c:/*) do ( echo %%i ) pause
(2)/R參數的fro語句格式
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
說明:遞歸查詢指定目錄下的匹配文件。默認使用當前目錄。
實例:打印D盤目錄及子目錄下的后綴為.txt和.py的文件
@echo off for /r d:/temp %%i in ( *.txt *.py ) do ( echo %%i ) pause
(3)/L參數的fro語句格式
FOR /L %variable IN (start,step,end) DO command [command-parameters]
該集表示以增量形式從開始到結束的一個數字序列。因此,(1,1,5)將產生序列1 2 3 4 5,(5,-1,1)將產生序列(5 4 3 2 1)
實例:打印10以內的奇數
@echo off for /l %%i in (1,2,10) do ( echo %%i ) pause
(4)FOR語句的/F參數包含如下3種命令格式:
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters] FOR /F ["options"] %variable IN ("string") DO command [command-parameters] FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
說明:包含/F的參數可以處理文件內容(file-set)、字符串("string")以及執行指定命令('command')返回回的值。可以通過設置["options"]值實現相關需求。["options"]值包含關鍵字說明如下:
eol=c 處理時跳過起始為c字符的行,通常用於跳過注釋行。 skip=n 跳過文件開始的n行 delims=xxx 指定分隔符集。這個替換了空格和制表符的默認分隔符集。 tokens=x,y,m-n 被分隔各字段的處理。 usebackq 需使用雙引號包含文件名時考慮,具體使用執行help for查看
上面的描述有些地方可能不好裂解,學習並執行完如下幾個實例觀察輸出結果,再去理解效果會更快。
實例:操作temp.txt文件內容。
@echo off type nul > temp.txt echo ;Test for /f parameter >> temp.txt echo line1 1 2 3 >> temp.txt echo line2 1 2 3 >> temp.txt echo line3 1 2 3 >> temp.txt echo 11 12 13 14 15 16 >> temp.txt echo 21,22,23,24,25,26 >> temp.txt echo 31-32-33-34-35-36 >> temp.txt for /F "skip=4 eol=; tokens=1,3* delims=,- " %%i in (temp.txt) do ( echo i=%%i, j=%%j, k=%%k ) pause del temp.txt
輸出結果如下:
i=11 , j=13 ,k=14 15 16 i=21 , j=23 ,k=24,25,26 i=31 , j=33 ,k=34-35-36
程序關鍵代碼簡單說明:
skip=4:跳過temp.txt文件的前4行。 eol=;: 忽略冒號打頭的行,直接跳過不處理 delims=,- :指定分隔符為逗號(,)、減號(-)、和空格,空格必須放在最后 tokens=1,3*:將按照指定分隔符號分隔到的第1個字段賦給變量i,第二個字段賦值給變量j,剩余字段賦值給變量k。注意:變量i在 for 語句中顯式聲明,變量j和變量k是通過tokens= 選項隱式聲明的。
建議:如果還是不太理解的可以將上述skip、eol、delims、tokens進行修改並執行觀察輸出,
bat腳本常用實例
(1)根據輸入選項操作
@echo off set /p var="Please input the number(1,2,3):" if %var% == 1 ( echo "the number equal to 1" ) else if %var% == 2 ( echo "the number equal to 2" ) else if %var% == 3 ( echo "the number equal to 3" ) else ( echo "input wrong number,exit program." ) pause
(2)文件和目錄相關操作
@echo off rem "About operate directory&file bat script" title Test bat set CURRENTDIR=D:\worktset TEMPDIR=%CURRENTDIR%\temp set TEMPFILE=%TEMPDIR%\temp.txt if not exist %TEMPDIR% ( echo "Create temp directory" mkdir %TEMPDIR% ) else ( echo The directory of %TEMPDIR% existed,recreate directory ) if not exist %TEMPFILE% ( echo Create temp file type nul > %TEMPFILE% ) else ( echo echo "=========%DATE% %TIME%================" >> %TEMPFILE% ) echo Happy New Year! >> %TEMPFILE% echo Congratulate to everyone >> %TEMPFILE% rem copy file and directory set TEMPDIR2=%CURRENTDIR%\temp2 md %TEMPDIR2% xcopy /s /y %TEMPDIR% %TEMPDIR2% type %TEMPDIR2%\temp.txt pause
(3)將指定目錄下的文件輸出並移動到指定目錄下
@echo off rem 如果路徑中包含空格,變量值需帶雙引號
rem WORK_DIR表示要操作的文件夾,DEST_DIR表示文件要保存的目標文件夾 SET WORK_DIR="c:\Program Files" SET DEST_DIR="D:\temp" if not exist %DEST_DIR% ( mkdir %DEST_DIR% ) for /f "delims=" %%i in ('dir /b /s /o:n /a:a %WORK_DIR%') do ( echo %%i copy "%%i" %DEST_DIR% )
pause
(4)將指定目錄下的文件按照文件名排序輸出。
@echo off SET WORK_DIR=D:\temp\work
for /f "delims=" %%i in ('dir /a /b /on %WORK_DIR%\*.txt') do ( echo %%i )
pause
FAQ
1、DOS命令下如何實現自動交互?
利用重定向方式可以實現自動交互輸入。假設需要交互的腳本為A.exe,腳本需要依次輸入12、13、15。則可以采用如下形式:
del c.txt echo 12 > c.txt echo 13 >> c.txt echo 15 >> c.txt A.exe < c.txt
參考資料
(1)cmd詳解 目錄類命令
(2)cmd下文件類操作命令