bat,即批處理(Batch),也稱為批處理腳本。顧名思義,批處理就是對某對象進行批量的處理,通常被認為是一種簡化的腳本語言,它應用於DOS和Windows系統中。
基本知識
@echo off表示執行了這條命令后關閉所有命令(包括本身這條命令)的回顯。而echo off命令則表示關閉其他所有命令(不包括本身這條命令)的回顯,@的作用就是關閉緊跟其后的一條命令的回顯。
獲取當前目錄:
方法1:命令 %cd% 或者 !cd! ,取得是運行的環境目錄
方法2:命令 %~dp0 ,取得了bat的文件所在目錄
@echo off
echo 當前盤符:%~d0
echo 當前盤符和路徑:%~dp0
echo 當前盤符和路徑的短文件名格式:%~sdp0
echo 當前批處理全路徑:%~f0
echo 當前CMD默認目錄:%cd%
pause
copy命令
將一份或多份文件復制到另一個位置。
COPY [/D] [/V] [/N] [/Y | /-Y] [/Z] [/L] [/A | /B ] source [/A | /B]
[+ source [/A | /B] [+ …]] [destination [/A | /B]]
變量 | 說明 |
---|---|
source | 指定要復制的文件。 |
/A | 表示一個 ASCII 文本文件。 |
/B | 表示一個二進位文件。 |
/D | 允許解密要創建的目標文件 |
destination | 為新文件指定目錄和/或文件名。 |
/V | 驗證新文件寫入是否正確。 |
/N | 復制帶有非 8dot3 名稱的文件時,盡可能使用短文件名。 |
/Y | 不使用確認是否要覆蓋現有目標文件的提示。 |
/-Y | 使用確認是否要覆蓋現有目標文件的提示。 |
/Z | 用可重新啟動模式復制已聯網的文件。 |
/L | 如果源是符號鏈接,請將鏈接復制到目標而不是源鏈接指向的實際文件。 |
例如:
@echo off REM 使用copy命令,寫路徑時,不要使用/ REM 拷貝一個文件到指定的目錄(/y :有重名文件不提示直接覆蓋 /-y :提示是否覆蓋 默認是/y) REM copy /-y d:\mylog.log e:\ REM 拷貝一個文件到指定的目錄並重新命名 REM copy d:\mylog.log d:\mylog2.log REM 拷貝許多文件到指定的目錄(指定的目錄必須存在) REM copy d:\*.sql e:\123\ REM 拷貝源目錄下的所有文件到另一個目錄 REM copy e:\123\ e:\1234\ REM 合並多個文件 REM copy /b e:\123\1.txt + e:\123\2.txt e:\123\3.txt
xcopy (外部命令)文件拷貝
復制文件和目錄樹。
XCOPY source [destination] [/A | /M] [/D[:date]] [/P] [/S [/E]] [/V] [/W]
[/C] [/I] [/Q] [/F] [/L] [/G] [/H] [/R] [/T] [/U]
[/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z] [/B] [/J]
[/EXCLUDE:file1[+file2][+file3]…]
變量 | 說明 |
---|---|
source | 指定要復制的文件 |
destination | 指定新文件的位置和/或名稱。 |
/A | 僅復制有存檔屬性集的文件,但不更改屬性。 |
/M | 僅復制有存檔屬性集的文件,並關閉存檔屬性。 |
/D:m-d-y | 復制在指定日期或指定日期以后更改的文件。如果沒有提供日期,只復制那些源時間比目標時間新的文件。 |
/EXCLUDE:file1[+file2][+file3]… | 指定含有字符串的文件列表。每個字符串在文件中應位於單獨的一行。如果任何字符串與復制文件的絕對路徑的任何部分相符,則排除復制該文件。例如,指定如 \obj\ 或 .obj 的字符串會分別 排除目錄 obj 下面的所有文件或帶有.obj 擴展名的所有文件。 |
/P | 創建每個目標文件之前提示你。 |
/S | 復制目錄和子目錄,不包括空目錄。 |
/E | 復制目錄和子目錄,包括空目錄 |
/V | 驗證每個新文件的大小。 |
/W | 提示你在復制前按鍵。 |
/C | 即使有錯誤,也繼續復制。 |
/I | 如果目標不存在,且要復制多個文件,則假定目標必須是目錄。 |
/Q | 復制時不顯示文件名。 |
/F | 復制時顯示完整的源文件名和目標文件名。 |
/L | 顯示要復制的文件。 |
/G | 允許將加密文件復制到 不支持加密的目標。 |
/H | 也復制隱藏文件和系統文件。 |
/R | 覆蓋只讀文件。 |
/T | 創建目錄結構,但不復制文件。不包括空目錄或子目錄。/T /E 包括空目錄和子目錄。 |
/U | 只復制已經存在於目標中的文件。 |
/K | 復制屬性。一般的 Xcopy 會重置只讀屬性。 |
/N | 用生成的短名稱復制。 |
/O | 復制文件所有權和 ACL 信息。 |
/X | 復制文件審核設置(隱含 /O)。 |
/Y | 取消提示以確認要覆蓋現有目標文件。 |
/-Y | 要提示以確認要覆蓋現有目標文件。 |
/Z | 在可重新啟動模式下復制網絡文件。 |
/B | 復制符號鏈接本身與鏈接目標。 |
/J | 復制時不使用緩沖的 I/O。推薦復制大文件時使用。 |
開關 /Y 可以預先在 COPYCMD 環境變量中設置。
例如:
REM 復制源目錄下的所有文件並子文件夾到指定目錄(若指定的目錄不存在則會新建)(注意:e:\123后不要加\) xcopy e:\123 e:\1234\456\ /s /e /i /y
del命令
刪除一個或數個文件。
DEL [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
ERASE [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
標識 | 說明 |
---|---|
name | 指定一個或多個文件或者目錄列表。通配符可用來刪除多個文件。如果指定了一個目錄,該目錄中的所有文件都會被刪除。 |
- | 表示“否”的前綴 |
/P | 刪除每一個文件之前提示確認。 |
/F | 強制刪除只讀文件。 |
/S | 刪除所有子目錄中的指定的文件。 |
/Q | 安靜模式。刪除全局通配符時,不要求確認 |
/A | 根據屬性選擇要刪除的文件 |
屬性 | R 只讀文件 S 系統文件 H 隱藏文件 A 存檔文件 I 無內容索引文件 L 重分析點 - 表示“否”的前綴 |
如果命令擴展被啟用,DEL 和 ERASE 更改如下:
/S 開關的顯示句法會顛倒,即只顯示已經刪除的文件,而不顯示找不到的文件。
rd/?
刪除一個目錄。
RMDIR [/S] [/Q] [drive:]path
RD [/S] [/Q] [drive:]path
開關 | 作用 |
---|---|
/S | 除目錄本身外,還將刪除指定目錄下的所有子目錄和文件。用於刪除目錄樹。 |
/Q | 安靜模式,帶 /S 刪除目錄樹時不要求確認 |
例如:
REM 刪除指定目錄下的所有文件(不刪除子文件夾下的文件) REM DEL /Q E:\1234\456\ REM 刪除指定目錄下的所有文件(會刪除子文件夾下的文件,但會保留子文件夾) REM DEL /S /Q E:\1234\456\ REM 刪除指定目錄下的所有,並自身目錄 REM RD /S /Q E:\1234\456\
常用例子
以“管理員權限”打開
@echo off mode con lines=30 cols=60 %1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit cd /d "%~dp0" rem 下面可以寫你的bat代碼了
或

@echo off :: BatchGotAdmin :------------------------------------- REM --> Check for permissions >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" REM --> If error flag set, we do not have admin. if '%errorlevel%' NEQ '0' ( echo Requesting administrative privileges... 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"
切換cmd的字符集
//設置cmd的字符集為 UTF-8 (將下面兩行寫到一個 .bat文件中,雙擊即可) chcp 65001 cmd //設置cmd的字符集為 GBK (將下面兩行寫到一個 .bat文件中,雙擊即可) chcp 936 cmd
判斷32位還是64位系統
@echo off setlocal EnableDelayedExpansion if "%PROCESSOR_ARCHITECTURE%" == "X86" ( echo 32位系統 )^ else if "%PROCESSOR_ARCHITECTURE%" == "AMD64" ( echo 64位系統 )^ else ( echo 其他系統 ) pause
***************