- 批處理(Batch),也稱(chēng)為批處理腳本。顧名思義,批處理就是對(duì)某對(duì)象進(jìn)行批量的處理,通常被認(rèn)為是一種簡(jiǎn)化的腳本語(yǔ)言,它應(yīng)用于 DOS 和 Windows 系統(tǒng)中。批處理文件的擴(kuò)展名為 bat(或 cmd)。通常我們指定的批處理指 DOS批處理腳本。
- DOS 批處理則是基于 DOS 命令的,用來(lái)自動(dòng)地批量地執(zhí)行 DOS 命令以實(shí)現(xiàn)特定操作的腳本。更復(fù)雜的情況,需要使用if、for、goto等命令控制程式的運(yùn)行過(guò)程,如同 C、Python 等高級(jí)語(yǔ)言一樣。如果需要實(shí)現(xiàn)更復(fù)雜的應(yīng)用,利用外部程式是必要的,這包括系統(tǒng)本身提供的外部命令和第三方提供的工具或者軟件。批處理程序雖然是在命令行環(huán)境中運(yùn)行,但不僅僅能使用命令行軟件,任何當(dāng)前系統(tǒng)下可運(yùn)行的程序都可以放在批處理文件中運(yùn)行。
一、常用命令
常用命令也可見(jiàn)文章:鏈接
- 文件夾管理
- cd 顯示當(dāng)前目錄名或改變當(dāng)前目錄。
- md 創(chuàng)建目錄。
- rd 刪除一個(gè)目錄。
- dir 顯示目錄中的文件和子目錄列表。
- tree 以圖形顯示驅(qū)動(dòng)器或路徑的文件夾結(jié)構(gòu)。
- path 為可執(zhí)行文件顯示或設(shè)置一個(gè)搜索路徑。
- xcopy 復(fù)制文件和目錄樹(shù)。
- 文件管理
- type 顯示文本文件的內(nèi)容。
- copy 將一份或多份文件復(fù)制到另一個(gè)位置。
- del 刪除一個(gè)或數(shù)個(gè)文件。
- move 移動(dòng)文件并重命名文件和目錄。(Windows XP Home Edition中沒(méi)有)
- ren 重命名文件。
- replace 替換文件。
- attrib 顯示或更改文件屬性。
- find 搜索字符串。
- fc 比較兩個(gè)文件或兩個(gè)文件集并顯示它們之間的不同
- 網(wǎng)絡(luò)命令
- ping 進(jìn)行網(wǎng)絡(luò)連接測(cè)試、名稱(chēng)解析
- ftp 文件傳輸
- net 網(wǎng)絡(luò)命令集及用戶管理
- telnet 遠(yuǎn)程登陸
- ipconfig顯示、修改TCP/IP設(shè)置
- msg 給用戶發(fā)送消息
- arp 顯示、修改局域網(wǎng)的IP地址-物理地址映射列表
- 系統(tǒng)管理
- at 安排在特定日期和時(shí)間運(yùn)行命令和程序
- shutdown立即或定時(shí)關(guān)機(jī)或重啟
- tskill 結(jié)束進(jìn)程
- taskkill結(jié)束進(jìn)程(比tskill高級(jí),但WinXPHome版中無(wú)該命令)
- tasklist顯示進(jìn)程列表(Windows XP Home Edition中沒(méi)有)
- sc 系統(tǒng)服務(wù)設(shè)置與控制
- reg 注冊(cè)表控制臺(tái)工具
- powercfg控制系統(tǒng)上的電源設(shè)置
二、基本語(yǔ)法
1. 注釋
在bat腳本中,我們使用 :: 和 REM 添加注釋?zhuān)梅ㄈ缦拢?/p>
:: 打印“你好,世界!”
echo 你好,世界!
注意
:: 只能出現(xiàn)在每一行的開(kāi)頭,其后的內(nèi)容被當(dāng)作注釋REM 可用于任何位置,其后的內(nèi)容被當(dāng)作是注釋
2. 變量
變量類(lèi)型包括:數(shù)字、字符串及數(shù)組。
:: 定義數(shù)字變量
set /a n=0
:: 定義字符串變量
set s1=hellworld
set s2="Hello World"
set "s3=Hello, World!"
:: 定義數(shù)組變量
set arr = 1 2 3 4 5 6
@echo off
set list=1 2 3 4
(for %%a in (%arr%) do (
echo %%a
))
注意:
- 變量名與內(nèi)容之間通過(guò)
= 連接且沒(méi)有空格
3. 判斷
在bat腳本中,if條件判斷語(yǔ)句共有6種比較操作符,分別為
操作符 | 描述 | 全稱(chēng) |
---|
equ | 等于 | equal | neq | 不等于 | no equal | lss | 小于 | less than | leq | 小于等于 | leq less than or equal | gtr | 大于 | greater than | geq | 大于等于 | geq greater than or equal |
注意:
if 條件 (
執(zhí)行命令
) else (
執(zhí)行命令
)
4. 循環(huán)
for /l %%x in (1,1,10) do (
echo 變量 x 的值是 %%x
)
5. 函數(shù)
@echo off
rem 定義函數(shù)
:myFunction
echo 這是我的函數(shù)
exit /b
rem 調(diào)用函數(shù)
call :myFunction
6. 文件操作
:: 創(chuàng)建文件
echo Hello > myfile.txt
:: 復(fù)制文件
copy source.txt destination.txt
:: 移動(dòng)文件
move source.txt destination_folder:: 重命名文件
ren oldname.txt newname.txt
:: 刪除文件
del myfile.txt
7. 字符串操作
set str1=Hello
set str2=World
set result=%str1% %str2%
echo %result%
這將輸出 Hello World。在批處理中,可以使用 % 符號(hào)來(lái)引用變量,并使用空格將字符串連接起來(lái)。
7.2 字符串截取
set myvar=abcdef
set substring=%myvar:~0,3%
echo %substring%
這將輸出 abc。:~ 后跟的是截取的起始索引和長(zhǎng)度。在這個(gè)例子中,0,3 表示從索引 0 開(kāi)始截取,長(zhǎng)度為 3。
7.3 字符串查找:
set myvar=abcdef
echo %myvar:~2%
這將輸出 cdef。如果省略長(zhǎng)度,則從指定的索引開(kāi)始一直截取到字符串末尾。
7.4 字符串替換:
set myvar=abc123abc
set newvar=%myvar:abc=xyz%
echo %newvar%
三、基本指令
注意,bat 腳本不區(qū)分大小寫(xiě)。
1. rem 和 ::
:: 用于進(jìn)行文本的注釋?zhuān)瑘?zhí)行后不會(huì)回顯內(nèi)容。 rem 用于文本注釋?zhuān)瑘?zhí)行后會(huì)回顯內(nèi)容。
2. echo 和 @
@字符放在命令前將關(guān)閉該命令回顯,?論此時(shí)echo是否為打開(kāi)狀態(tài)。
- 打開(kāi)回顯功能:
echo on - 關(guān)閉回顯功能:
echo off - 輸出空行:
echo. 或 echo, 或 echo: 或 echo/ 等 - 顯示當(dāng)前echo狀態(tài):
echo - 輸出提示信息:
echo 信息內(nèi)容 - 答復(fù)提問(wèn):
echo 答復(fù)語(yǔ)|執(zhí)行的操作 - 新建文件:
echo 文件內(nèi)容>文件名 - 新增內(nèi)容:
echo 文件內(nèi)容>>文件名 - 喇叭鳴響:
echo ^g
3. pause
使當(dāng)前程序暫停,并輸出以下內(nèi)容,作用是為了讓我們知道程序運(yùn)行到哪步了。 顯示其他提示語(yǔ):echo 其他提示語(yǔ) & pause > nul
4. errorlevel
獲取程序返回碼:echo %errorlevel% 每個(gè)命令運(yùn)?結(jié)束,可以?這個(gè)命令?格式查看返回碼。?于判斷剛才的命令是否執(zhí)?成功,默認(rèn)值為0,?般命令執(zhí)?出錯(cuò)會(huì)設(shè) errorlevel 為1。
5. title
設(shè)置cmd窗口的標(biāo)題,語(yǔ)法如下:
title 我的窗口
6. color
設(shè)置默認(rèn)控制臺(tái)的前景色和背景色,語(yǔ)法如下:
color [前景色][背景色]
顏?屬性由兩個(gè)?六進(jìn)制數(shù)字指定 – 第?個(gè)為背景色,第?個(gè)則為前景色。每個(gè)數(shù)字可以為以下任何值之?。
數(shù)值 | 顏色 | 數(shù)值 | 顏色 |
---|
0 | ?? | 8 | 灰? | 1 | 藍(lán)? | 9 | 淡藍(lán)? | 2 | 綠? | A | 淡綠? | 3 | 湖藍(lán)? | B | 淺綠? | 4 | 紅? | C | 淡紅? | 5 | 紫? | D | 淡紫? | 6 | 黃? | E | 淡黃? | 7 | ?? | F | 亮?? |
示例如下:
7. goto 和 :
通過(guò)goto 和:標(biāo)號(hào) 可以實(shí)現(xiàn)跳轉(zhuǎn)執(zhí)行命令。
@echo off
:start
set /a var+=1
echo %var%
if %var% leq 3 GOTO start
pause
8. find
在文件中搜索字符串,語(yǔ)法如下:
find [/v][/c][/n][/i][/off[line]] "字符串" [[drive:][path]filename[...]]
- /v 顯示所有未包含指定字符串的行
- /c 僅顯示包含字符串的行數(shù)
- /n 顯示行號(hào)
- /i 搜索字符串時(shí)忽略大小寫(xiě)
- /off[line] 不要跳過(guò)具有脫機(jī)屬性集的文件
- "字符串" 指定要搜索的字符串
- [drive:][path]filename 指定要搜索的文件
9. start
批處理中用來(lái)調(diào)用外部程序的命令,語(yǔ)法如下:
start 外部程序 [參數(shù)]
參數(shù):
/D path 指定程序的起始目錄/MIN 最小化啟動(dòng)窗口/MAX 最大化啟動(dòng)窗口/WAIT 等待啟動(dòng)的程序結(jié)束后才繼續(xù)腳本/B 在同一窗口中啟動(dòng)程序/b 隱藏控制臺(tái)執(zhí)行程序 說(shuō)明:
- 該命令將在新進(jìn)程中運(yùn)行外部程序,原批處理程序?qū)⒗^續(xù)執(zhí)行
- 執(zhí)行運(yùn)行外部程序則會(huì)等待外部程序完成后再繼續(xù)執(zhí)行后續(xù)指令
示例:start explorer d:\ 將會(huì)使用圖形界面打開(kāi)D盤(pán)。
10. call
CALL命令可以在批處理執(zhí)?過(guò)程中調(diào)?另?個(gè)批處理,只有當(dāng)被調(diào)用的批處理執(zhí)?完后,才能繼續(xù)執(zhí)?原來(lái)的批處理,語(yǔ)法如下:
call 指定批處理文件
11. assoc 和 ftype
assoc 和 ftype 可實(shí)現(xiàn)文件關(guān)聯(lián),語(yǔ)法如下:
assoc .txt ::顯示.txt代表的“文件類(lèi)型”,結(jié)果顯?.txt=txtfile
ftype ::顯示所有的文件類(lèi)型關(guān)聯(lián)
assoc .txt=Word.Document.8 ::設(shè)置.txt文件未word類(lèi)型的文檔,可看到.txt文件圖標(biāo)已改變
12. pushd 和 popd
主要用于保存并返回初始目錄,示例如下:
cd /d d:\mp4 ::更改當(dāng)前?錄為 d:\mp4
pushd c:\mp3 ::保存當(dāng)前?錄,并切換當(dāng)前?錄為 c:\mp3
popd ::恢復(fù)當(dāng)前?錄為剛才保存的 d:\mp4
13. if
條件判斷語(yǔ)句,語(yǔ)法如下:
if [not] errorlevel number command
if [not] str1==str2 command
if [not] exist filename command
14. mode
@echo off
mode con: cols=80 lines=30
echo This is a sample batch script.
echo It sets the console window size to 80 columns by 30 lines.
pause
在這個(gè)例子中,mode con: cols=80 lines=30 設(shè)置控制臺(tái)窗口的列數(shù)為80,行數(shù)為30。
四、常用特殊符號(hào)
1. @
用在任何命令前面,實(shí)現(xiàn)關(guān)閉當(dāng)前行的回顯.
2. %
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*為命令?傳遞給批處理的參數(shù)
%0 批處理?件本?,包括完整的路徑和擴(kuò)展名
%1 第?個(gè)參數(shù)
%9 第九個(gè)參數(shù)
%* 從第?個(gè)參數(shù)開(kāi)始的所有參數(shù)
3. >
DOS的標(biāo)準(zhǔn)輸?輸出通常是在標(biāo)準(zhǔn)設(shè)備鍵盤(pán)和顯?器上進(jìn)?的,利?重定向,可以?便地將輸?輸出改向磁盤(pán)?件或其它設(shè)備。其中:
- ?于號(hào)
> 將命令發(fā)送到?件或設(shè)備,例如打印機(jī)>prn - 雙?于號(hào)
>> 將命令輸出添加到?件結(jié)尾?不刪除?件中已有的信息 - ?于號(hào)
< 從?件?不是鍵盤(pán)上獲取命令所需的輸? >& 符號(hào)將輸出從?個(gè)默認(rèn)I/O流(stdout,stdin,stderr)重新定向到另?個(gè)默認(rèn)I/O流
4. >>
>> 和 > 有點(diǎn)類(lèi)似,但他們的區(qū)別是 >> 是傳遞并在?件的末尾追加,? > 是覆蓋。
五、實(shí)際案例
1. 設(shè)置臨時(shí)環(huán)境變量
在命令行模式下設(shè)置的環(huán)境變量,屬于臨時(shí)環(huán)境變量,只針對(duì)當(dāng)前的CMD命令窗口有效,并不影響其他窗口中的環(huán)境變量,更不會(huì)影響到永久性的環(huán)境變量,要設(shè)置永久的環(huán)境變量,需要通過(guò)圖形操作修改。
CMD
set path=%path%;C:\test ::在原有環(huán)境變量的基礎(chǔ)上追加環(huán)境變量
PowerShell
$env:path+="C:\test"
2. 啟動(dòng)CMD執(zhí)行命令
start cmd /k ::啟動(dòng)一個(gè)CMD且不關(guān)閉CMD
start cmd /c ::啟動(dòng)一個(gè)CMD且關(guān)閉CMD
start cmd /k "命令1 & 命令2 & 命令3" ::無(wú)論前面命令是否成功, 后面都會(huì)執(zhí)行
start cmd /k "命令1 && 命令2 && 命令3 " ::僅當(dāng)前面命令成功時(shí), 才執(zhí)行后面,一般用這個(gè)
start cmd /k "命令1 || 命令2 || 命令3" ::僅當(dāng)前面命令失敗時(shí). 才執(zhí)行后面
如果需要執(zhí)行指定的腳本文件,請(qǐng)使用 call 命令,示例如下:
call test.bat
3. 打開(kāi)環(huán)境變量窗口
rundll32 sysdm.cpl,EditEnvironmentVariables
4. 獲取用戶輸入并顯示
@echo off
set /p user_input=請(qǐng)輸入內(nèi)容:
echo 你輸入的內(nèi)容是:%user_input%
5. 執(zhí)行外部程序后再執(zhí)行腳本
@echo off
:: 打開(kāi)指定軟件
start notepad.exe
:: 延時(shí)5秒
echo Waiting for 5 seconds...
timeout /t 5 /nobreak >nul
:: 激活虛擬環(huán)境
echo Activating virtual environment...
call .\venv\Scripts\activate
:: 執(zhí)行python腳本
python test.py
echo sucess!
echo Windows will close in 5 seconds...
timeout /t 5 /nobreak >nul
6. 執(zhí)行命令并隱藏窗口
@echo off
start /b notepad ::打開(kāi)記事本
7. 執(zhí)行命令并最小化窗口
@echo off
start /min cmd /c "notepad"
@echo off
powershell -WindowStyle Minimized -Command "notepad"
8. 批量修改文件名
@echo off
setlocal enabledelayedexpansion
rem 設(shè)置文件所在目錄路徑
set "folderPath=C:\YourFolderPath"
rem 進(jìn)入目標(biāo)目錄
cd %folderPath%
rem 循環(huán)處理每個(gè)文件
for %%F in (*) do (
rem 獲取文件名(帶擴(kuò)展名)
set "fileName=%%F"
rem 移除字母部分,保留數(shù)字
set "newFileName="
for /L %%I in (0, 1, 9) do (
set "newFileName=!newFileName!!fileName:%%I=!"
)
rem 重命名文件
ren "%%F" "!newFileName!"
)
endlocal
9. 批量修改文件夾名
@echo off
setlocal enabledelayedexpansion
rem 設(shè)置要處理的文件夾路徑
set "folderPath=C:\Path\To\Your\Folder"
rem 遍歷文件夾
for /d %%i in ("%folderPath%\*") do (
rem 獲取文件夾名
set "folderName=%%~nxi"
rem 清除字母
set "folderNameWithoutLetters="
for /L %%j in (0, 1, 9) do (
set "folderName=!folderName:%%j=!"
)
rem 重命名文件夾
ren "%%i" "!folderNameWithoutLetters!"
)
endlocal
參考資料:
https://www.jb51.net/article/250331.htm http://www./news/show-3034558.html https://www./dosmlxxsc1/wvqyr9.html https://www.runoob.com/linux/linux-shell-variable.html https://www./subject/windows_bat.htm?id=36 https://cloud.tencent.com/developer/article/2118950 https://www./batch_script/ https://zhuanlan.zhihu.com/p/415626343 http://t./hJaPh http://t./3R7Be http://t./zFfr5 http://t./JmcoH http://t./ui048
|