一、符號含義
符號 | 含義 |
---|---|
CR(0D) | 命令行結束符 |
Escape(1B) | ANSI轉義字符引導符 |
Space(20) | 常用的參數界定符 |
Tab(09) ; = | 不常用的參數界定符 |
+ | COPY命令文件連接符 |
* ? | 文件通配符 |
“” | 字符串界定符 |
| | 命令管道符 |
< > >> | 文件重定向符 |
@ | 命令行回顯屏蔽符 |
/ | 參數開關引導符 |
: | 批處理標籤引導符 |
% | 批處理變量引導符 |
1. 百分號%
- 用於變量,代表變量的引用
set A="Test" echo %A% ::A的打印輸出爲"Test"
- For循環中的特有的變量,一般的用法是%A(cmd)或%%A(bat腳本)
2. echo符號
- echo variable - 打印variable的值
set A="Test" Echo %A% :: 會打印"Test"
- @echo on - 會打印當前輸出命令 ,比如當前工作目錄是在D:\Temp\
@echo on echo A :: 會打印 :: D:\Temp > echo A :: A
- @echo of - 不會打印當前輸出命令,比如當前工作目錄是在D:\Temp\
@echo off echo A :: 會打印 :: A
二、循環For語句
for %%variable in (set) do command
- %%variable - 循環中的變量,用來獲取值
- set - 被遍歷的集合,比如是一個目錄,那麼遍歷它的子目錄;如果是一個文件,遍歷所有內容
- command - 在variable變量滿足set集合時做的事
例子
@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:
)
對一組文件中的每一個文件執行某個特定命令。命令擴展名被啓用,下列額外的 FOR 命令格式會受到支持
:: 如果集中包含通配符,則指定與目錄名匹配,而不與文件名匹配
FOR /D %variable IN (set) DO command [command-parameters]
:: 檢查以 [drive:]path 爲根的目錄樹,指向每個目錄中的 FOR 語句。如果在 /R 後沒有指定目錄,則使用當前目錄。如果集僅爲一個單點(.)字符,則枚舉該目錄樹
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
:: 該集表示以增量形式從開始到結束的一個數字序列。因此,(1,1,5) 將產生序列 1 2 3 4 5,(5,-1,1) 將產生序列 (5 4 3 2 1)
FOR /L %variable IN (start,step,end) DO command [command-parameters]
更多詳細信息請見參考資源
三、對比文件是否相同
參考資源 How can I compare two files in a batch file?
@echo on
fc D:\Temp\test\build1.txt D:\Temp\test\build2.txt > nul
if %errorlevel%==1 (
rd /s /q D:\Temp\test\AA\
)
errorlevel的值的含義
值 | 含義 |
---|---|
-1 | 無效的語法(例如,僅傳遞了一個文件) |
-2 | 文件相同 |
1 | 文件不同 |
2 | 找不到至少一個文件 |
使用errorlevel全局變量獲取是否相等,不相等則做其他的事
四、尋找進程和結束進程
1. 尋找進程
tasklist | find "ArcGISEarth.exe"
if %%errorlevel%%==0 (command)
}
判斷某個進程是否在運行中,errorlevel爲0則代表該進程正在運行
2. 結束進程
taskkill /F /T /IM "ArcGISEarth.exe"
參數 | 含義 |
---|---|
/S | System 指定要連接到的遠程系統 |
/U | [domain]user 指定應該在哪個用戶上下文執行這個命令 |
/P | [password] 爲提供的用戶上下文指定密碼。如果忽略,提示輸入 |
/F | 強行終止進程 |
/FI | Filter 指定篩選進或篩選出查詢的的任務 |
/PID | processID 指定要終止的進程的PID |
/IM | ImageName 指定要終止的進程的映像名,通配符 '*'可用來指定所有映像名 |
/T | Tree kill 終止指定的進程和任何由此啓動的子進程 |
/? | 顯示幫助/用法 |
經常用到參數應該就是/F,可以強制結束某個進程
一個使用案例是判斷該進程是否正在運行,如果是則結束該進程,注意,從獲取進程到結束進程中需要有一定時間間隔,然後才能結束進程,這裏例子中間隔2s
tasklist /FI "IMAGENAME eq ArcGISEarth.exe" 2>NUL | find /I /N "ArcGISEarth.exe">NUL
ping -n 2 127.0.0.1>nul
if %errorlevel%==0 (taskkill /F /T /IM "ArcGISEarth.exe")
發現了一個更好的方法去結束程序
符號 | 含義 |
---|---|
2>null | 不顯示錯誤提示 |
1>null | 不顯示正確提示 |
128 | 找不到特定程序錯誤提示的返回代碼 |
0 | 找到特定程序並結束進程的返回代碼 |
@echo on
:: 不顯示錯誤提示
taskkill /F /T /IM "ArcGISEarth.exe" 2>null
:: Earth已經正常自動關閉
if %errorlevel%==128 (echo "ArcGIS Earth end normally")
:: 強制關閉Earth
if %errorlevel%==0 (echo "ArcGIS Earth end Forcibly")
:: 暫停幾秒
ping -n 4 127.0.0.1>nul
五、字符串操作
1. 字符串替換
set text="12345678"
set name=%text:12=00%
echo %name%
:: 輸出00345678
六、創建刪除文件或文件夾
參考資源 bat刪除文件及文件夾
1. 文件的創建和刪除
創建文件,以下兩種方式均可以,注意如果有同名文件會默認覆蓋
echo > Test.txt
echo => Text.txt
刪除(Delete)文件
del D:\Temp\Test.txt /F /S /Q /A
參數 | 含義 |
---|---|
/F | 強制刪除 |
/S | 從所有子目錄刪除指定文件 |
/Q | 安靜模式,刪除文件時不需要提示 |
/A | 根據屬性選擇要刪除的文件 |
2. 文件夾的創建和刪除
創建文件夾,使用md或者mkdir(Make directory)關鍵字
:: 這兩個關鍵字作用一致
md D:\Temp\Dir1\
mkdir D:\Temp\Dir2\
:: 創建多個文件夾,用空格分隔
mkdir D:\Temp\Dir1\ D:\Temp\Dir2\
:: 假設Dir1原本不存在,執行該命令後會自動創建中間目錄Dir1
mkdir D:\Temp\Dir1\SubDir\
刪除文件夾 (Remove directory)
:: 這兩個關鍵字作用一致
rd /S /Q D:\Temp\
rmdir /S /Q D:\Temp\
參數 | 含義 |
---|---|
/S | 從所有子目錄刪除指定文件 |
/Q | 安靜模式,刪除文件時不需要提示 |
七、複製文件或文件夾
複製(Copy)文件
:: 複製A.txt文件到 Dir1目錄下,這時存在D:Temp\Dir1\A.txt 文件
copy D:Temp\A.txt D:Temp\Dir1\
:: 複製A.txt文件到 Dir1目錄下,並更名爲B.txt, 這時存在 D:Temp\Dir1\B.txt 文件
copy D:Temp\A.txt D:Temp\Dir1\B.txt
參數 | 含義 |
---|---|
/A | 表示一個 ASCII 文本文件 |
/B | 表示一個二進位文件 |
/D | 允許解密要創建的目標文件 |
/V | 爲新文件指定目錄和/或文件名 |
/N | 複製帶有非 8dot3 名稱的文件時,儘可能使用短文件名 |
/Y | 不使用確認是否要改寫現有目標文件的提示 |
/-Y | 使用確認是否要改寫現有目標文件的提示 |
/Z | 用可重新啓動模式複製已聯網的文件 |
複製文件夾
:: 將Dir1 文件夾中所有文件 複製到 Dir2文件夾
xcpoy D:Temp\Dir1\ D:Tem\Dir2\ /D /S /Q /I /Y
參數 | 含義 |
---|---|
/A | 只複製有存檔屬性集的文件,但不改變屬性 |
/M | 只複製有存檔屬性集的文件, 並關閉存檔屬性 |
/D | 複製在指定日期或指定日期以後更改的文件, 如果沒有提供日期,只複製那些源時間, 比目標時間新的文件 |
/EXCLUDE | 排除指定含有字符串的文件列表,如 /E:*.png 則表示不復制 png 文件 |
/P | 在創建每個目標文件前提示 |
/S | 複製目錄和子目錄,除了空的 |
/E | 複製目錄和子目錄,包括空的 |
/V | 驗證每個新文件 |
/W | 提示在複製前按鍵 |
/C | 即使有錯誤,也繼續複製 |
/I | 如果目標不存在,而又在複製一個以上的文件,則假定目標一定是一個目錄 |
/Q | 複製時不顯示文件名 |
/F | 複製時顯示完整的源和目標文件名 |
/L | 顯示要複製的文件 |
/G | 允許將沒有經過加密的文件複製到不支持加密的目標 |
/H | 也複製隱藏和系統文件 |
/R | 覆蓋只讀文件 |
/T | 創建目錄結構,但不復制文件,不包括空目錄或子目錄 |
/U | 只複製已經存在於目標中的文件 |
/K | 複製屬性,一般的 xcopy 會重置只讀屬性 |
/N | 用生成的短名複製 |
/O | 在寫入destination的文件中保留所有權和訪問控制列表(ACL)信息 |
/X | 複製文件審覈設置和系統訪問控制列表(SACL)信息 |
/Y | 阻止xcopy命令提示您覆蓋目標中已存在的源文件 |
/-Y | 強制xcopy命令提示您有關覆蓋文件的信息 |
/Z | 在網絡連接丟失時安全地停止複製文件,然後在重新建立連接後從中斷處恢復複製 |
八、設置文件屬性
參考 資源
當我們想直接刪除文件夾時可能會遇到這種錯誤,這是因爲這個文件夾裏面的文件有些是隻讀屬性,所以訪問受限
我們需要將這個目錄下的所有文件設置成非只讀屬性,然後才能刪除
attrib -r E:\Applications\DotNet\WinDesktop\Apps\arcgis-earth\*.* /s /d
參數 | 含義 |
---|---|
±R | 設置/移除 只讀屬性 |
±A | 設置/移除 存檔屬性 |
±S | 設置/移除 系統屬性 |
±H | 設置/移除 隱藏屬性 |
±O | 設置/移除 脫機屬性 |
±I | 設置/移除 無內容引索屬性 |
±X | 設置/移除 無清理屬性 |
±V | 設置/移除 完整性屬性 |
±P | 設置/移除 固定屬性 |
±U | 設置/移除 非固定屬性 |
/S | 處理當前文件夾及其所有子文件夾中的匹配文件 |
/D | 處理文件夾 |
/L | 處理符號鏈接和符號鏈接目標的屬性 |
九、If判斷變量是否一致
1. 判斷字符串
判斷字符串可以直接使用==
set var_1=%1
if %var_1%=="test" (echo "var_1 = test")
2. 判斷數值
符號 | 含義 |
---|---|
EQU | 等於 |
NEQ | 不等於 |
LSS | 小於 |
LEQ | 不小於 |
GTR | 大於 |
GEQ | 不大於 |
set var_1=5
if %var_1% equ 5 (echo "var_1 = 5")
結合errorlevel使用,當一條命令正確執行後 errorlevel值爲0,否則不爲0,比如
xcopy D:\temp\ E:\temp\
if %errorlevel% neq 0 (echo "xcopy file failed!")
十、函數調用
@echo off
set var1=%1
set var2=%2
if var
call :Func1
Call :Func2
pause
::=====================
::函數名稱
::=====================
:Func1
set aa=%var1%
echo %aa%
goto:eof
::=====================
::函數名稱
::=====================
:Func2
set aa=%var2%
echo %aa%
goto:eof