1. 程式人生 > 其它 >cmd命令及bat批處理入門

cmd命令及bat批處理入門

本文主要來自批處理之家的 《批處理標準教程.pdf》

基礎語法

註釋

註釋有二種型別:

  • rem 註釋內容
  • :: 註釋內容 (推薦這種形式)

兩者略有區別:當打開回顯時,rem 註釋會回顯出來,:: 則不會顯示。

@關閉回顯

在執行一條命令時,這條命令本身也會顯示在控制檯上,譬如編寫如下內容的一個 .bat 檔案,雙擊執行

echo 'bbb'

pause

輸出如下:

C:\Users\wztshine\Desktop\bat>echo 'bbb'   # 這條命令自身也顯示出來了
'bbb'

C:\Users\wztshine\Desktop\bat>pause        # 這條命令也顯示出來了
請按任意鍵繼續. . .

你可以使用 @ 放在任何命令的前面,來關閉那個命令的回顯,但是命令太多的話,一個個的關閉太過麻煩。可以使用 echo off 關閉後續所有的回顯:

:: @ 用來關閉 echo off 自身的回顯
@echo off
echo 'bbb'
pause

輸出:

'bbb'
請按任意鍵繼續. . .

注意:命令自身消失了,沒有出現

想要打開回顯,可以使用 @echo on

批處理檔案

隨意建立一個 .txt 檔案,然後將字尾改為 .bat 或者 .cmd,就是一個批處理檔案了,你可以直接雙擊這個檔案來執行,也可以將其放在 cmd 中作為一個可執行檔案來執行:

C:\Users\wztshine\Desktop\bat>test.bat   # 在命令列視窗中,作為可執行程式來執行
'bbb'
請按任意鍵繼續. . .

符號

&, && 可以用來連線多個命令:

C:\Users\wztshine\Videos>set a=5 & set b=10

C:\Users\wztshine\Videos>echo %a% %b%
5  10

-/ 是等價的,用來指定選項:

timeout /t 5

轉義符號

對於一些特殊符號 ^ > >> & && | || ,需要使用轉義符 ^ 進行轉義:

echo ^^
echo ^>
echo ^>^>
echo ^&
echo ^&^&
echo ^|
echo ^|^|
pause

針對 % ,使用 % 自身進行轉義:

:: 只會輸出一個 %
echo %%

輸出 !

沒有進行延遲變數的情況下,不用轉義。

如果進行了延遲變數,需要這麼做:

@echo off

:: 設定延遲變數
setlocal enabledelayedexpansion

echo ^^!
pause

因為在延遲變數時,! 有特殊含義,所以需要轉義。第一次預處理會用第一個 ^ 轉義第二個 ^,第二次預處理會用 ^ 轉義 !

獲取幫助

想要獲取幫助資訊,可以在 cmd 命令視窗執行 命令 /? , 譬如:

C:\Users\wztshine>move /?
移動檔案並重命名檔案和目錄。

要移動至少一個檔案:
MOVE [/Y | /-Y] [drive:][path]filename1[,...] destination

要重新命名一個目錄:
MOVE [/Y | /-Y] [drive:][path]dirname1 dirname2

  [drive:][path]filename1 指定你想移動的檔案位置和名稱。
  destination             指定檔案的新位置。目標可包含一個驅動器號
                          和冒號、一個目錄名或組合。如果只移動一個檔案
                          並在移動時將其重新命名,你還可以包括檔名。
  [drive:][path]dirname1  指定要重新命名的目錄。
  dirname2                指定目錄的新名稱。

你會看到它的用法是這樣的:

MOVE [/Y | /-Y] [drive:][path]filename1[,...] destination

其中,所有中括號 [/Y | /-Y] 代表了這個選項是可選的,可以有也可以沒有。/Y | /-Y 代表了這個選項可以設定成 /Y /-Y ,也就是兩者之一,不能同時使用。

引數和變數

命令列引數

批處理檔案可以接受命令列引數,通過變數%1%2%3等來獲取。

@echo off

echo %1 %2
pause

執行:

C:\Users\wztshine\Desktop\bat>test.bat a b c  # 傳遞了三個引數:a, b, c; 多餘的引數會忽略
a b
請按任意鍵繼續. . .

set 設定變數

set 可以用來設定變數

語法:

set [/A] variable=value
  • /A : 可選引數。針對變數,接受一個整數,如果值是字串等型別,變數值是0
  • varibale: 變數名
  • value:變數值

例項:

C:\Users\wztshine\Desktop\bat>set /A var=abc    # 字串也會變成數字
0
C:\Users\wztshine\Desktop\bat>set /A var=2.1
運算子不存在。

C:\Users\wztshine\Desktop\bat>set /A var=2
2
C:\Users\wztshine\Desktop\bat>set /A var=-10
-10
C:\Users\wztshine\Desktop\bat>set var=bac    # 設定字串

C:\Users\wztshine\Desktop\bat>echo %var%     # 顯示變數的值
bac

%變數名% 是獲取變數值的語法。

全域性變數和區域性變數

預設宣告的任何變數都是全域性變數。在 SETLOCALENDLOCAL 之間宣告的任何變數,都是區域性變數:

@echo off

set a=10

:: 這是一個區域性變數
setlocal
set b=20    
endlocal

echo %a%
:: 此時變數 b 會是未宣告的狀態,因此不會打印出任何東西
echo %b%


pause

雙擊執行上述檔案:

10
ECHO 處於關閉狀態。
請按任意鍵繼續. . .

環境變數

在批處理檔案中或者 cmd 的命令列中,你可以直接使用系統定義的環境變數:

C:\Users\wztshine\Desktop\bat>echo %PATH%       # 顯示環境變數
D:\AZ\py3.10.1\Scripts\;D:\AZ\py3.10.1\;

常見符號

  • @: 關閉回顯,遮蔽當前命令自身的回顯。

  • %:求餘,顯示變數,for 迴圈中的臨時變數等。

  • |:管道符號。將前一條命令的輸出,作為後續命令的輸入。

  • >, >> 重定向符號。

  • < : 輸入重定向

  • & :組合命令,它的作用是用來連線 n 個 DOS 命令,並把這些命令按順序執行,而不管是否有命令執行失敗,譬如 dir Z:\ & dir Y:\ & dir C:\

  • && : 這個命令也是把它前後兩個命令連線起來,並按這些命令 的順序執行。與&命令不同之處在於,它在從前往後依次執行被它連 接的幾個命令時會自動判斷是否有某個命令執行出錯,一旦發現出錯 後將不繼續執行後面剩下的命令

  • || : 連線多個命令,只有當前一條命令失敗後,才會執行後續的命令,當碰到執行正確的命令後,將不執行後面所有的命令

  • "" : 雙引號代表字串。字串內部可以巢狀變數:if "%var%"=="abc" echo %var% is abc

    • 儘管不加雙引號也可以表示字串,但是如果字串中間包含空格,則要加上雙引號
  • , : 某些情況下逗號可以被看作空格使用

  • () : 代表多行命令,要使用變數延遲,否則無法動態獲取實時變數內容。

  • ! : 啟動變數延遲擴充套件以後,變數由 %var% 的形式,要寫成 !var!

資料型別

字串

建立字串

C:\Users\wztshine\Desktop\bat>set var=hello world

C:\Users\wztshine\Desktop\bat>echo %var%
hello world

注意,字串不用加引號!否則引號會作為字串的一部分。

空字串

@echo off

:: 空字串
set var=

:: 判斷空白字串
if defined var echo "var is not empty"

pause

字串判斷

字串判斷,最好使用雙引號將字串包裹起來,這樣可以防止字串包含空格

@echo off

:: 判斷字串
if "A"=="A" echo A^=A


:: /i 選項可以忽略大小寫
if /i "A"=="a" echo A^=a


set a=abc
:: 變數也可以放在引號中
if "%a%"=="abc" echo %a%^=abc

pause

字串拼接

字串拼接很簡單,只要將變數或者字串放在一起就行,不用加引號

set a=hello
set b=world
set c=%a% %b%!

echo %c%

::結果:hello world!

字串長度

@echo off

set str=Hello World

:: :strLen 是一個函式,str 是變數, length 是返回值
call :strLen str length

:: 列印長度
echo String is %length% characters long
pause


:strLen
setlocal enabledelayedexpansion

:strLen_Loop
   if not "!%1:~%len%!"=="" set /A len+=1 & goto :strLen_Loop
(endlocal & set %2=%len%)
goto :eof

字串轉數字

:: var 是個字串
set var=23

:: c 也是字串
set c=%var%+5
echo %c%

:: /A 選項,就變成了數字 28
set /A c=%var%+5

擷取字串

語法:

%變數:~start,end%

上面的 start,end 都是索引,從0開始。可以是正數和負數

例項: 注意負號

set a=123456789

echo %a:~2,3%
::345      從索引2開始,擷取3個字元

echo %a:~2,-1%
::345678   從索引2開始,擷取到倒數第一個字元

echo %a:~2%
::3456789  從索引2開始,擷取到末尾

echo %a:~-2%
::89       擷取倒數2個字元

echo %a:~-5,1%
::5        從倒數第5開始,擷取一個字元

echo %a:~-5,-1%
::5678     從倒數第5開始,擷取到倒數第一個字元

輸出:

ello
orld
llo world
ello worl

替換/刪除字串

@echo off

set x=hello world

:: 將 hello 替換成 beautiful
echo %x:hello=beautiful%

:: 將 hello 替換成空(刪掉)
echo %x:hello=%

pause

注意是全部替換,而不是隻替換一次

輸出:

beautiful world
 world
請按任意鍵繼續. . .

使用萬用字元:

C:\Users\wztshine>set a=123456789

C:\Users\wztshine>echo %a:1*=0%   # 萬用字元寫在右側不生效,不知為啥
123456789

C:\Users\wztshine>echo %a:*4=0%   # 萬用字元寫在左側才生效
056789

字串大小寫替換

@echo off
setlocal enabledelayedexpansion
REM 全部轉換成大寫字母
set str=http://bbs.BATHOME.net
set up=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
for %%i in (%up%) do (
set str=!str:%%i=%%i!
)
echo %str%
pause

陣列

建立陣列

通過 set 命令可以建立陣列

@echo off 

:: 0 是索引,1 是值
set a[0]=1 

:: 下面這個沒有用
echo %a%

:: 這樣才能打印出索引 0 的值
echo %a[0]%

pause

修改陣列

正常修改就行

@echo off

set a[0]=1

set a[0]=2

常見命令

echo

echo 用來列印資訊

:: 顯示回顯狀態
echo

:: 顯示某個資訊
echo message

:: 列印一個空行, '.' 可以用 , : ; / [ \ ] + ( = 等任意符號代替
echo.

:: 寫入內容到檔案
echo message>a.txt

:: 追加內容到檔案
echo message>>a.txt

echo 顯示訊息時,還可以將中間的空格替換成任意符號:

echo.aaa     # 等同於: echo aaa

pause

pause 用來暫停程式,等待使用者按下任意按鍵來繼續:

C:\Users\wztshine>pause
請按任意鍵繼續. . .

不想要預設的提示資訊,可以:

pause>nul

set

set 可以用來宣告變數,注意等號左右不要加空格

C:\>set str=BatHome
C:\>echo %str%
BatHome

set 還可以批量賦值:

:: 用逗號隔開
set /a a=1+1,b=2+1,c=3+1


:: 設定相同的值
set /a x=y=z=1

特殊符號

如果變數值中帶有特殊符號,譬如 &, >>, |, <<, ^, +=, =, -=需要加引號

C:\>set "str=Bat&Home"
C:\>echo "%str%"
"Bat&Home"

注意:是將整個表示式都用引號包起來

數字和運算

/a 選項可以將字串變成數字,並且等號右邊支援運算表示式

注意:DOS 計算只能精確到整數,小數採用四捨五入。

C:\>set x=1    # 字串
C:\>set y=2    # 字串

C:\>set /a n=%x%+%y%
3


C:\>set x=1
C:\>set y=2
C:\>set /a n=x+y
3

注意:等號右邊的變數,可以不用加 %

表示式符號

( )

沒啥好說的,括號裡的先執行:set /a a=(1+2)+3

+ - * / %

加減乘除以及求餘,在批處理程式中使用 % 求餘時,要使用 %% 來轉義自身,如果是 cmd 命令列視窗則不需要。

@echo 
set /a a=10%%2
pause

位運算子

<<, >>, &, ^, |

使用者輸入

/p 選項可以等待使用者輸入,從鍵盤獲取內容。

@echo off
set /p input=Input a number:
echo,%input%
pause

不換行輸出

@echo off
for %%i in (bat home) do (
set /p =%%i<nul
)
pause

命令結果賦值給變數

@echo off

REM 利用for語句把命令結果(單行字串)賦值給變數
for /f "delims=" %%i in ('ping 127.0.0.1 ^| findstr "%%"') do (
    set "PacketLoss=%%i"
)
echo %PacketLoss%
pause

for 語句不懂,可以看下文的 for 命令部分。

簡單說一下:

  • for /f 是用來處理字串的,他可以遍歷命令的每一行輸出內容, "delims=" 是它的選項,用來設定行分隔符為空白。

  • 單引號包裹的 ping 127.0.0.1 ^| findstr "%%" 是一個命令。單引號在 for /f 語句中代表了裡面是命令。

顯示變數

set 還可以用來列出所有以某個字串開頭的變數:

C:\>set xxx1=A
C:\>set xxx3=C
C:\>set xxx2=B
C:\>set xxx       # 列出所有以 xxx 開頭的變數
xxx1=A
xxx2=B
xxx3=C

if 命令

if 命令可以進行條件判斷。if 可以寫成命令的格式:if condition (command) 也可以寫成 if ... else ... 語句的形式:

if condition (commands) else (commands)

注意

  • 圓括號的兩側要加空格!
  • else 一定要和 if 的右括號寫在一行!
  • if 中不能進行數學運算如求餘,求和...;只能進行比較運算如 大於,小於,等於...

語法:

if condition (
	commands
	...
:: 注意,右括號和 else 以及 else 的左括號要放在一行; 
) else (
	commands
	...
)

例項:判斷上一條命令的退出碼

@echo off

echo bbs.bathome.net | findstr "bat"

if %errorlevel% equ 0 (
	echo 找到指定字串
) else (
	echo 沒有找到指定字串
)
pause

判斷變數是否宣告

if [not] defined variable

例項:

C:\Users\wztshine>set a=20

C:\Users\wztshine>if defined a echo yes
yes

判斷檔案或資料夾存在

if [not] exist "path"

注意:如果判斷資料夾,要在資料夾後面加上 \ ,因為它無法區分資料夾和檔案

例項:

@echo off
if exist "C:\Program Files\" (
	echo 資料夾存在
) else (
	echo 資料夾不存在
)
pause

例項2:

@echo off

:: 先判斷沒有叫 1.txt 的資料夾
if not exist "1.txt\" (
	:: 再判斷叫 1.txt 的檔案
    if exist "1.txt" (
        echo 檔案存在
    ) else (
        echo 檔案不存在
    )
)
pause

判斷數字

if 1 == 1 echo yes

if 2 gtr 10 echo yes

判斷字串

判斷字串,最好是用雙引號包裹起來,以防字串包含空格導致判斷錯誤。

if "a" == "a" echo yes

:: /i 忽略大小寫
if /i "a" == "A" echo yes


set a=abc
set b=ABC
:: 針對變數,我們也可以新增雙引號,這是為了避免變數值中包含空格
if /i "%a%"=="%b%" echo yes

比較運算子

equ  # 等於
neq  # 不等於
lss  # 小於
leq  # 小於或等於
gtr  # 大於
geq  # 大於或等於

批處理if命令字串比較和ASCII的關係:

  • 數字小於字母。
  • 同一個字母,小寫字母小於大寫字母。
  • 不同的字母,按照字母表中的順序排列。

for

for 處理檔案

基礎語法:

for %%variable in (set) do command
  • %%variable:是自定義的變數,如:%%i;在批處理檔案中使用兩個百分號 %%i ,在cmd命令列使用一個百分號%i

  • set: 是一個集合,可以是多個檔案

  • command: 是要執行的命令,多行命令可以放在圓括號裡面

譬如:

@echo off

:: 這裡我們處理兩個檔案:a.txt 和 "b c.txt"
for %%i in (a.txt "b c.txt") do (
  echo 正在處理:%%i
)
pause

萬用字元

* 匹配任意多個字元。? 匹配 0 或 1 個字元。

@echo off

:: * 用來匹配零個或一個或多個任意字元; ? 表示零個或一個任意字元
for %%i in (*.txt ??.log) do (
  echo 正在處理:%%i
)
pause

變數擴充套件

遍歷檔案時的變數,還支援變數擴充套件:關於變數擴充套件,見後文的《變數擴充套件》章節

@echo off

for %%i in ("C:\Program Files\7-Zip\7z.exe") do (
    echo 檔案:%%i
    echo 刪除引號:%%~i
    echo 檔案所在的驅動器:%%~di
    echo 檔案所在的路徑:%%~pi
    echo 檔名:%%~ni
    echo 副檔名:%%~xi
    echo 檔案路徑的短名:%%~si
    echo 檔案的日期/時間:%%~ti
    echo 檔案的大小:%%~zi
)
pause

批量重新命名的例子:

@echo off

:: 查詢當前路徑下所有的 txt 檔案,並重命名加字首:new_
for %%i in (*.txt) do (
    echo 正在處理:%%i
    ren "%%i" "new_%%i"
)
pause

for /d 遍歷資料夾

/d 選項用來處理資料夾。/d 無法搜尋到隱藏的資料夾

@echo off

:: 想要遍歷當前資料夾,可以寫成 * 或者 ./* ,不需要加引號
for /d %%i in ("C:\Test\*") do (
    echo %%i
)
pause

遞迴遍歷資料夾

/r 選項可以遞迴遍歷資料夾,語法:for /r path /d in (path) do command

@echo off

:: ./ 代表了當前路徑, ./* 代表了路徑下的任意資料夾
for /r ./ /d %%i in (./*) do (
    echo %%i
)
pause

for /r 列舉目錄樹處理檔案

/r path 可以遞迴遍歷 path 下的資料夾,因此我們可以遞迴查詢所有資料夾下的檔案:

如果/r 後面不寫路徑,則預設是當前目錄。

@echo off

for /r "C:\Test\" %%i in (*.txt) do (
    echo %%i
)
pause

for /l 生成數字序列

/l 可以處理數字,這個功能有點像 python 的 range 函式,可以設定起始和終止值以及步長。

for /l %%variable in (start,step,end) do command

start : 起始值

step: 步長,起始值每次都加上這個數

end:結束值

例項:

@echo off

:: 這裡用了大寫字母,它是 L
for /L %%i in (1,2,8) do (
	:: 會顯示 1 3 5 7
    echo %%i
)

pause

for /f 遍歷字串、命令輸出和檔案

/f 用來格式化顯示某個資訊,它可以處理字串,文字內容,甚至一個命令的輸出資訊:

:: 處理檔案
for /f ["options"] %%variable in (file-set) do command

:: 處理字串
for /f ["options"] %%variable in ("string") do command

:: 注意,command 用單引號包裹起來,這裡單引號有特殊含義,代表裡面是要執行的命令,並獲取輸出
for /f ["options"] %%variable in ('command') do command

options :是如何顯示資訊的選項

options 的選項

delims

設定一行的分隔符,可以設定多個。預設的分隔符是空格製表符。當讀取到某一行資料時,在這一行中如果遇到分隔符,程式就會將這一行進行分割。

譬如針對如下檔案:

a.txt:

1 2
3 4

我們讀取它:

@echo off
REM 預設 空格和製表符 作為分隔符
for /f %%i in (a.txt) do (
    echo,%%i
)
pause

輸出:

1
3
請按任意鍵繼續. . .

你會發現,只打印了 1,3,第一行的 2 和第二行的 4 沒有打印出來。這是因為每一行都用空格分割,然後列印分割後的第一個欄位。

我們手動設定分隔符:

@echo off
REM 設定分隔符為 . 和 ;
for /f "delims=.;" %%i in (a.txt) do (
    echo,%%i
)
pause

輸出:

1 2
3 4

過濾空白行:

@echo off

REM 刪除空行但是不刪除行首的空格或製表符
for /f "delims=" %%i in (a.txt) do (
echo,%%i
)
pause

雙引號作為分隔符

@echo off

REM 以雙引號作為列分隔符, 獲取第二列
for /f tokens^=2^ delims^=^" %%i in (a.txt) do (
	echo,%%i
)
pause

tokens

delims 可以對每行進行分割,tokens 用來指定獲取哪幾個欄位(哪幾列)。預設獲取第一個欄位。

語法:

tokens=x,y,m-n

x, y 用來指定獲取哪兩個列

m-n 用來指定獲取從 m 到 n 列

刪除行前空白:

@echo off
REM 刪除空行並且刪除行首的空格或製表符
for /f "tokens=*" %%i in (a.txt) do (
	echo,%%i
)
pause

eol

eol 用來指定一個字元,然後 for /f 處理一行文字時,如果文字以這個字元開頭,就會忽略這一行

@echo off

:: 預設忽略分號開頭的行, 它會讀取 a.txt 的內容,遇到分號開頭的行,就會略過
for /f %%i in (a.txt) do (
    echo,%%i
)
pause

指定忽略以 # 開頭的行:

@echo off

REM 忽略指定字元開頭的行
for /f "eol=#" %%i in (a.txt) do (
	echo,%%i
)
pause
skip

用來跳過幾行。

@echo off

REM 跳過一行
for /f "skip=1" %%i in (a.txt) do (
    echo,%%i
)
pause
usebackq

usebackq 可以將雙引號的內容作為檔案,並且它會將單引號看作字串(不使用usebackq的情況,單引號裡面代表命令),將反引號看作命令。

@echo off

REM 預設把雙引號裡面的內容當做字串處理
for /f "tokens=2" %%i in ("a 1.txt") do (
	echo,%%i
)
pause

譬如檔案包含空格,需要加引號:

@echo off

REM 正確處理檔名包含空格的情況

for /f "usebackq tokens=2" %%i in ("a 1.txt") do (
	echo,%%i
)
pause

處理命令輸出

@echo off

:: 單引號有特殊含義,代表裡面是命令; ^| 用來轉義管道符
for /f "delims=" %%i in ('dir /b *.txt ^| findstr "[0-9]"') do (
	echo,%%i
)
pause


:: ^= 轉義等號
for /f "delims=" %%i in ('wmic LogicalDisk where DriveType^="3" get DeviceID') do (
	echo,%%i
)
pause


:: ^, 轉義逗號
for /f "delims=" %%i in ('wmic NicConfig get IPAddress^, MACAddress /value') do (
	echo,%%i
)
pause


:: ^> 轉義重定向符號
for /f "delims=" %%i in ('dir /b /s /a-d "*.jpg" 2^>nul') do (
	echo %%i
)
pause

goto

語法:GOTO label, 用來跳轉到 label 指定的程式碼處。

@echo off

:: begin 是一個標籤,標籤的定義規則是以 : 開頭
:begin
set /a var+=1
echo %var%
:: 當 var 變數值 小於等於 3,跳轉到 begin 自身(相當於遞迴)
if %var% leq 3 goto begin

pause

標籤並不是一個函式,不需要額外呼叫,程式從上到下可以直接執行標籤後的程式碼。

goto 後面的 label 可以帶: 也可以不帶。如:goto :begin 等同於 goto begin,但是建議帶上。

特殊用法

goto :eof 用來退出指令碼。eofend of file 的意思,相當於檔案末尾。

退出程式

三種方式退出程式:

  • exit
  • exit /b
  • goto :eof

區別:

goto :eof 並不是真的退出了指令碼,而是執行到檔案的末尾,變相的退出程式。

exit 徹底退出指令碼。

exit /b 僅退出當前的批處理指令碼。

譬如編寫一個 test.bat 檔案,在裡面分別寫上三種退出方式,然後我們開啟一個命令列視窗,用命令列來執行這個指令碼(不是直接雙擊執行):C:\Users\wztshine\Desktop>test.bat

  • goto :eof 會退出指令碼,但是我們的命令列視窗還在。
  • exit /b 會退出批處理指令碼,命令列視窗還在。
  • exit 會將我們的命令列視窗一起關閉。

start

啟動另一個視窗執行指定的程式或命令。

語法:

START ["title"] [/Dpath] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED] [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL] [/WAIT] [/B] [command/program] [parameters]

引數:[] 代表可選選項

  • "title" 在視窗標題欄中顯示的標題。
  • path 起始目錄
  • I 新環境是傳遞給 cmd.exe 的原始環境,而不是當前環境
  • MIN 開始時視窗最小化
  • MAX 開始時視窗最大化
  • SEPARATE 在分開的空間內開始 16 位 Windows 程式
  • SHARED 在分共享的空間內開始 16 位 Windows 程式
  • LOW 在 IDLE 優先順序類別開始應用程式低優先順序
  • NORMAL 在 NORMAL 優先順序類別開始應用程式 一般優先順序
  • HIGH 在 HIGH 優先順序類別開始應用程式高優先順序
  • REALTIME 在 REALTIME 優先順序類別開始應用程式實時優先順序
  • ABOVENORMAL 在 ABOVENORMAL 優先順序類別開始應用程式 超出常規優先順序
  • BELOWNORMAL 在 BELOWNORMAL 優先順序類別開始應用程式 低出常規優先順序
  • WAIT 啟動應用程式並等候它結束
  • B 在不建立新視窗的情況下開始應用程式。 除非啟動 ^C 處理,否 則該應用程式會忽略 ^C 處理;^Break 是唯一可以中斷該應用程式的方式
  • command/program
    • 如果是內部 cmd 命令或批檔案,那麼該命令處理器是用 /K 命令列開關執行 cmd.exe 的。 如:start cmd /K dir 即保留新開的cmd視窗, /c 可以關閉新開的視窗
    • 如果不是內部 cmd 命令或批檔案,則是一個程式,並作為視窗應用程式或控制檯應用程式執行。
  • parameters 傳遞給前面命令或程式的引數

start 可以開啟程式,路徑,檔案,網址等,譬如:

@echo off
start D:\Tencent\QQ\Bin\QQ.exe
start C:\批處理教程.txt

::開啟 E 盤
start E:
start www.baidu.com
exit

帶有空格的資料夾:

start "" "C:\Users\wztshine\Desktop\s d"

當開啟帶有空格的資料夾或檔案時,需要加上雙引號,並且前面必須使用 title 引數,否則這個資料夾會被當成 title 引數。因此我們前面加上了一個空白的 "" 來作為 title。

call

call 命令來呼叫一個程式段或者另一個批處理檔案。呼叫完成後,程式會從之前呼叫的地方繼續執行(就像 python 或者 java 等呼叫一個函式)

語法:

call [[Drive:][Path] FileName [BatchParameters]] [:Label [Arguments]]

引數說明:

  • [Drive:][Path] 指定要呼叫的批處理程式的位置和名稱。
  • FileName 引數必須有 .bat.cmd 副檔名。
  • BatchParameters 指定批處理程式所需的任何命令列資訊,包括命令列選項、檔名、 批處理引數(即從 %0 到 %9)或變數(例如,%baud%)。
  • call: Label Arguments
    • 呼叫本檔案內命令段,相當於呼叫本檔案內的函式。被呼叫的命令段以標籤:label 開頭,以 goto:eof 結尾,呼叫完後程序會回到原來的地方繼續按順序執行下去。假如被呼叫命令段(子程式)以 exit 結尾,那麼呼叫完子程 序後,程式就直接退出。被呼叫的函式應該以 goto :eof 作為結尾來表示函式到此截至,否則後續所有的命令都會被當作函式的一部分執行。

建立程式碼段

我們可以使用 :name 的方式,來建立一個名為 name 的程式碼段,一個程式碼段僅僅是用來標記一段程式碼,它並不是一個函式,它不需要呼叫就能執行:

@echo off

:: 這個程式碼段,沒有設定結尾
:func
    echo hello

echo world

pause

輸出:

hello
world
請按任意鍵繼續. . .

goto :eof 來設定程式碼段的結尾,我們需要手動設定它來讓這個程式碼段截止:

:func
    echo hello
    pause
    goto :eof
    
echo world
pause

注意:後續會用 函式 一詞來形容這種程式碼段,但是注意:它並不是真的其他程式語言中的函式。

呼叫其他批處理檔案

CALL "C:\Documents and Settings\Administrator\桌面\圓周率.bat"

呼叫本檔案的程式碼段

@echo off

call :func

pause



:func
  echo hello
  goto :eof

呼叫函式並傳參

我們可以給函式傳參:

call :func arg1 arg2 arg3 ..

然後在函式中,可以通過 %0 %1 %2 ... 等來接受引數。注意:%0 代表了 函式或者 可執行程式路徑 本身。

@echo off

call :func 1 2 3

pause



:func
  echo %0 %1 %2 %3
  goto :eof

輸出:

:func 1 2 3              # 輸出了 :func 這是 %0 的值
請按任意鍵繼續. .

變相獲取返回值

@echo off

:: 傳遞兩個引數
call :sub return Hello
echo returned: %return%
pause>nul

:sub
:: 我們將第二個變數賦值給第一個變數:return=Hello
set %1=%2

輸出:

returned: Hello

另一個求和的例子:

@echo off
set sum=0
call :sub sum 10 20 35
echo 資料求和結果: %sum%
pause>nul
goto :eof

:sub
set /a %1=%1+%2
:: shift /2 的作用是:從第二引數開始,向左移動一位:將 %3 移位到 %2,將 %4 移位到 %3,等等;並且不影響 %0 和 %1。
shift /2
if not "%2"=="" goto sub

shift

shift 可以向左移動引數。該命令列 開關告訴命令從第 n 個引數開始移位;n 介於零和八之間。例如: SHIFT /2 會將 %3 移位到 %2,將 %4 移位到 %3...,並且此時不影響 %0 和 %1

語法:

shift [/n]

一個求和例子:

@echo off

call :sub sum 1 2 3 4 5 6 7 8 9
echo result: %sum%
pause>nul


:sub
set /a %1=%1+%2
:: 從第二個引數開始,向左移動
shift /2
:: 判斷引數是否為空,否則繼續
if not "%2"=="" goto sub

分析一下:

  • 呼叫 :sub 這個程式碼段時,傳遞了引數:"sum 1 2 3 4 5 6 7 8 9"
  • 剛進入 sub 程式碼段時:set /a %1=%1+%2 會變成:set /a sum=sum+1, 等號右邊的 sum 是變數 %sum%,因為等號右邊的變數可以省略 %, 所以最終是 set /a sum=0+1

title

設定視窗名稱:

title BAT

color

設定背景色和前景文字顏色

它的引數是兩個 16 進位制數字(數字之間沒有空格

支援的顏色如下:

譬如:

color F5

注意:兩個顏色不能一樣。

mode

它有兩個主要作用:

  • 設定 cmd 視窗的大小
  • 設定內碼表

設定視窗大小

mode con cols=113 lines=15 

cols 指定寬度

lines 指定高度

設定內碼表

mode con cp select=936

將控制檯顯示語言設定成中文(936), 437 代表英文

C:\Users\wztshine>mode con cp select=437

Status for device CON:
----------------------
    Lines:          200
    Columns:        88
    Keyboard rate:  31
    Keyboard delay: 1
    Code page:      437


C:\Users\wztshine>mode con cp select=936

裝置狀態 CON:
---------
    行:        200
    列:       88
    鍵盤速度:   31
    鍵盤延遲:  1
    內碼表:     936

date / time

time 命令顯示和設定當前系統時間(時分秒), /t 選項可以僅顯示時間(時分)而不設定時間。

date 命令顯示和設定當前系統日期, /t 選項可以僅顯示日期而不設定日期。

C:\Users\wztshine>time
當前時間: 16:54:28.20
輸入新時間:

C:\Users\wztshine>time /t
16:54



C:\Users\wztshine>date
當前日期: 2022/05/20 週五
輸入新日期: (年月日)

C:\Users\wztshine>date /t
2022/05/20 週五

修改時間:

time 09           # 修改當前時間為 09:00 整
time 09:13        # 修改當前時間為 09:13:00 整
time 09:13:30     # 修改當前時間為 09:13:13.00 整
time 09:13:30.25  # 修改當前時間為 09:13:30.25 精確修改

修改日期:

date 2013-10-1
date 2013/10/3
date 2013/09-25 

vol

vol 可以檢視磁碟卷標和序列號(如果存在)。所謂卷標,例如 軟體(D:), D:是磁碟名,軟體是卷標。

C:\Users\wztshine>vol c:
 驅動器 C 中的卷沒有標籤。
 卷的序列號是 284A-C138
 

C:\Users\wztshine>vol d:
 驅動器 D 中的卷是 本地磁碟
 卷的序列號是 0007-6A37

LABEL

建立、更改或刪除磁碟的卷標。

語法:

LABEL [drive:][label] 

drive: 指定驅動器

label : 指定卷標

如:

label D:Software

ATTRIB

顯示或更改檔案屬性。

ATTRIB [+R | -R] [+A | -A ] [+S | -S] [+H | -H] [[drive:] [path] filename] [/S [/D]] 

+,- 代表新增或刪除某個屬性

  • R 只讀檔案屬性。
  • A 存檔檔案屬性。
  • S 系統檔案屬性。
  • H 隱藏檔案屬性。
  • [drive:][path][filename]指定要處理的檔案路徑。
  • /S 處理當前資料夾及其子資料夾中的匹配檔案。
  • /D 也處理資料夾。

注意:如果將檔案屬性修改為系統屬性後,將無法對屬性再進行修改, 所以 -s 沒用!

預設輸出當前目錄下所有檔案的屬性(不包含資料夾):

C:\Users\wztshine\Desktop\sd>attrib
A                    C:\Users\wztshine\Desktop\sd\t.txt
A                    C:\Users\wztshine\Desktop\sd\xx.bat

指定資料夾:

C:\Users\wztshine\Desktop\sd>attrib b   # 指定 b 資料夾
                     C:\Users\wztshine\Desktop\sd\b

將資料夾設定隱藏:

C:\Users\wztshine\Desktop\sd>attrib +h b  # 將 b 資料夾設定隱藏

DEL

del 刪除的東西,不會到回收站。DEL 和 ERASE 一樣,都是用來刪除一個或多個檔案,支援萬用字元刪除。

語法:

DEL [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
  • /P 刪除每一個檔案之前提示確認。
  • /F 強制刪除只讀檔案。
  • /S 從所有子目錄刪除指定檔案(會遍歷子資料夾,自動找到指定檔名的檔案)。
  • /Q 安靜模式。直接刪除檔案,不需要使用者確認
  • /A 根據屬性選擇要刪除的檔案。
    • R 只讀檔案
    • S 系統檔案
    • H 隱藏檔案
    • A 存檔檔案
    • - 表示“否”的字首, 如 -H 代表不是隱藏檔案。

del 沒有帶引數的情況下,無法刪除具有隱藏屬性、只讀屬性或者系 統屬性的檔案。

::刪除具有隱藏屬性的檔案 
del /a:h D:\test.txt

::刪除具有隻讀屬性的檔案 
del /a:r D:\test.txt

::刪除具有系統屬性的檔案 
del /a:s D:\test.txt

::所有檔案都可以刪除
del /a /f D:\test.txt

帶對話的刪除:

del /a /f /p D:\test.txt

不帶對話,直接刪除:

del /a /f /q D:\test.txt

支援萬用字元:

del D:\testssssss\*

遍歷刪除:

:: 會遍歷當前路徑下的所有子目錄,來刪除 test.txt 檔案
del /a /f /p /s test.txt

RD / RMDIR

這兩個命令完全一樣,作用都是刪除一個目錄。 注意:rd 不支援萬用字元!rd 可以刪除檔案和資料夾

語法:

RD [/S] [/Q] [drive:]path

/S 除目錄本身外,還將刪除指定目錄下的所有子目錄和檔案。用於刪除目錄樹。

/Q 安靜模式,刪除目錄時不要求確認

刪除資料夾:

rd /s /q d:\test\t1

MOVE

移動檔案,也可以重新命名檔案和目錄。

移動檔案到目錄

MOVE [/Y | /-Y] [drive:][path]filename1 destination

/Y:如果目錄有同名檔案,不提示,直接覆蓋

/-Y: 如果目錄有同名檔案,出現提示對話,讓使用者確認

待移動的檔案可以是 絕對路徑,也可以是相對路徑,也可以用萬用字元 *, ?

destination 是一個目錄,這個目錄必須事先存在(絕對路徑和相對路徑都可以)

例項:

md folder
move /y x.txt folder

move /y *.txt folder

移動資料夾

將資料夾 b 移動到資料夾 a:

C:\Users\wztshine\Desktop\sd>move b a
移動了         1 個目錄。

如果移動前,目的資料夾 a 內已經包含了同名資料夾 b,則可能無法移動,提示拒絕訪問。

重新命名

move 不僅可以移動檔案或資料夾,還可以重新命名他們:

move t.txt b\a.txt  # 將 t.txt 移動到 b 資料夾內,並重命名為 a.txt

copy

將一份或多份檔案複製到另一個位置。copy 不可以複製資料夾,複製資料夾應該用 xcopy 命令。 copy 不可以複製具有隱藏、系統屬性的檔案,要複製這些檔案,要先用 attrib 去除檔案屬性或者改用 xcopy 命令。

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 不要提示,直接覆蓋已存在的檔案

複製到資料夾

:: 目的地可以是一個資料夾
copy D:\test.txt D:\test\

:: 萬用字元
copy D:\*.txt D:\test\

複製到檔案

:: 複製檔案,注意複製時檔名可以改變
copy D:\test.txt D:\abc.txt

合併多個檔案

copy 還可以合併多個檔案,並將合併結果儲存下來

:: 以二進位制的方式,合併三個 txt 檔案的內容,到 all.txt
copy /b 1.txt+2.txt+3.txt all.txt


copy *.txt all.txt

XCOPY

複製檔案或目錄樹。 copy 是內部命令,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] [/EXCLUDE:file1[+file2][+file3]...] 

source 指定要複製的檔案。

destination 指定新檔案的位置或名稱。

/A 只複製有存檔屬性集的檔案,但不改變屬性。

/M 只複製有存檔屬性集的檔案,並關閉存檔屬性。

/D:m-d-y 複製在指定日期或指定日期以後更改的檔案。如果沒有提供日期,只複製那些源時間比目標時間新的檔案。

/EXCLUDE:file1[+file2][+file3]... 指定含有字串的檔案列 表。每一個字串必須在檔案的單獨行中。如果有任何字串與要被 複製的檔案的絕對路徑相符,那個檔案將不會得到複製。例如,指定 如 \obj\ 或 .obj 的字串會排除目錄 obj 下面的所有檔案或帶 有.obj 副檔名的檔案。

/P 建立每個目標檔案前提示

/S 複製目錄和子目錄(如果目錄是空的,則不會複製)。

/E 複製目錄和子目錄,包括空的。與 /S /E 相同。可 以用來修改 /T。

/V 驗證每個新檔案。

/W 提示您在複製前按鍵。

/C 即使有錯誤,也繼續複製。

/I 如果目標不存在,又在複製一個以上的檔案,則假 定目標一定是一個目錄。

/Q 複製時不顯示檔名。

/F 複製時顯示完整的源和目標檔名。

/L 顯示要複製的檔案。

/G 允許將沒有經過加密的檔案複製到不支援加密的目標。

/H 也複製隱藏和系統檔案。

/R 覆蓋只讀檔案。

/T 建立目錄結構,但不復制檔案。不包括空目錄或子目錄。/T /E 包括空目錄和子目錄。

/U 只複製已經存在於目標中的檔案。

/K 複製屬性。一般的 Xcopy 會重置只讀屬性。

/N 用生成的短名複製。

/O 複製檔案所有權和 ACL 資訊。

/X 複製檔案稽核設定(隱含 /O)。

/Y 複製檔案稽核設定(隱含 /O)。現存目標檔案。

/-Y 導致提示以確認改寫一個 現存目標檔案。

/Z 用重新啟動模式複製網路檔案。

譬如:

copy C:\*.* D:\   # 只會複製 C 盤的檔案
xcopy C:\*.* D:\  # 會複製 C 盤所有內容:檔案,資料夾,子資料夾

複製所有內容(包括空的資料夾):

xcopy F:\ G:\abc\ /e /s /h /y

複製特定日期之後的內容:

:: 複製 Rawdata 目錄中 1993 年 12 月 29 日以及以後更改的檔案更新到 Reports 目錄中的檔案。
xcopy D:\rawdata E:\reports /d:12-29-1993

:: 僅複製較新的檔案
xcopy D:\rawdata E:\reports /d

注意:

:: 它只會將 folder1 下的所有內容複製到 folder2 中,不會在 folder2 中建立一個 folder1
xcopy folder1 folder2 /s /e /h /y

FIND

在檔案中搜索字串。

語法:

FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]] 

引數說明:

  • /V 顯示不包含指定字串的行。
  • /C 顯示符合條件的行數。
  • /N 顯示行號
  • /I 搜尋字串時忽略大小寫。
  • /OFF[LINE] 不要跳過具有離線屬性集的檔案。
  • "string" 指定要搜尋的文字串
  • [drive:][path]filename 指定要搜尋的檔案

支援萬用字元,可以在多個檔案中查詢:

@echo off
:: 顯示不包含 abc 的行
find /v /i "abc" D:\*.txt

pause

例子:

現有 a.txt:

1
2
3

例項:

@echo off

echo 僅顯示帶 1 的行
find /i "1" a.txt

echo 顯示每一行的行號
find /i /n "1" a.txt

echo 顯示不包含 1 的行
find /i /v "1" a.txt

echo 顯示有多少行帶 1
find /i /c "1"  a.txt

echo 顯示不帶 1 有多少行
find /i /c /v "1"  a.txt

pause

type 搭配,先讀取檔案,然後過濾包含 '2' 的行:

@echo off
mode con cols=100
type a.txt | find /n "2"
pause

FINDSTR

在檔案中尋找字串

語法:

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/F:file] [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]] strings [[drive:][path]filename[ ...]] 

引數:

  • /B 在一行的開始配對模式。
  • /E 在一行的結尾配對模式。
  • /L 按字使用搜索字串。
  • /R 將搜尋字串作為一般表示式使用。
  • /S 在當前目錄和所有子目錄中搜索匹配檔案。有了這個引數,就不可以指定搜尋路徑了,否則出錯。
  • /I 指定搜尋不分大小寫。
  • /X 列印完全匹配的行。
  • /V 只打印不包含匹配的行。
  • /N 在匹配的每行前列印行數。
  • /M 如果檔案含有匹配項,只打印其檔名。
  • /O 在每個匹配行前列印字元偏移量。
  • /P 忽略有不可列印字元的檔案。
  • /OFF[LINE] 不跳過帶有離線屬性集的檔案。
  • /A:attr 指定有十六進位數字的顏色屬性。請見 "color /?"
  • /F:file 從指定檔案讀檔案列表 (/ 代表控制檯)。
  • /C:string 使用指定字串作為文字搜尋字串。
  • /G:file 從指定的檔案獲得搜尋字串。 (/ 代表控制檯)。
  • /D:dir 查詢以分號為分隔符的目錄列表 strings 要查詢的文字。
  • [drive:][path]filename 指定要查詢的檔案。

忽略大小寫:

findstr /i abc a.txt

忽略大小寫,在 a.txt 中查詢包含 abc 的行

搜尋 A 字串 或 B 字串

findstr /i "a c" a.txt

在 a.txt 中搜索 a 或者 c

注意:預設字串中的空格,會作為分隔符分割字串,然後將每一部分都作為單獨的欄位來查詢,並且各欄位是 的關係。

禁止空格分割:

上面說了,字串中的空格會將字串分割,然後用 的關係,來查詢每個字串。/c: 可以將帶有空格字串作為一個整體進行查詢:

findstr /i /c:"a b c" a.txt

上面會將 a b c 作為一個整體進行查詢過濾

搜尋子目錄:

@echo off
findstr /s /i Windows *.*
pause 

正則

findstr 支援正則表示式。

findstr "^[a-z]*$" 2.txt 

"<…>"表示式

這個表示精確查詢一個字串,\< 表示字串的開頭, \> 表示字串結尾。

echo hello world computer|findstr "\<computer\>"

精確查詢 computer 這個字串。當然,上面的例子僅僅只是說明"<…>"的作用而已。上面程式其實 直接就 echo hello world computer|findstr "computer" 就可以了。

pushd, popd

就是用 pushd 標記路徑,然後 popd 恢復路徑。可以多次 pushd 和 popd 來儲存和恢復路徑。其實本質就是先進後出的棧。

C:\Users\wztshine>pushd c:\Users\wztshine   # 暫存當前路徑

C:\Users\wztshine>cd \                      # 切換路徑

C:\>popd                                    # 在其他路徑 popd

C:\Users\wztshine>                          # 自動恢復之前存的路徑

CMD

可以新建一個 cmd 命令視窗,並執行一些命令

語法:

CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF] [[/S] [/C | /K] string] 

引數:

  • /C 執行命令後關閉視窗
  • /K 執行命令後保留視窗
  • /S 在 /C 或 /K 後修改字串處理(見下)
  • /Q 關閉迴應
  • /D 從登錄檔中停用執行 AutoRun 命令(見下)
  • /A 使向內部管道或檔案命令的輸出成為 ANSI
  • /U 使向內部管道或檔案命令的輸出成為 Unicode
  • /T:fg 設定前景/背景顏色(詳細資訊,請見 COLOR /?)
  • /E:ON 啟用命令擴充套件(見下)
  • /E:OFF 停用命令擴充套件(見下)
  • /F:ON 啟用檔案和目錄名稱完成字元 (見下)
  • /F:OFF 停用檔案和目錄名稱完成字元(見下)
  • /V:ON 將 ! 作為定界符啟動延緩環境變數擴充套件。如: /V:ON 會允 許 !var! 在執行時允許 !var! 擴充套件變數 var。var 語法在輸入時擴充套件變數,這與在一個 FOR 迴圈內不同。
  • /V:OFF 停用延緩的環境擴充套件。

例項:

cmd /k start c:

FC

比較兩個檔案或兩個檔案集並顯示它們之間的不同

FC [/A] [/C] [/L] [/LBn] [/N] [/OFF[LINE]] [/T] [/U] [/W] [/nnnn] [drive1:][path1]filename1 [drive2:][path2]filename2 FC /B [drive1:][path1]filename1 [drive2:][path2]filename2

引數:

  • /A 只顯示每個不同處的第一行和最後一行。
  • /B 執行二進位制比較。
  • /C 不分大小寫。
  • /L 將檔案作為 ASCII 文字比較。
  • /LBn 將連續不匹配的最大值設為指定的行數。
  • /N 在 ASCII 比較上顯示行數。
  • /OFF[LINE] 不要跳過帶有離線屬性集的檔案。
  • /T 不要將 tab 擴充到空格。
  • /U 將檔案作為 UNICODE 文字檔案比較。
  • /W 為了比較而壓縮空白(tab 和空格)。
  • /nnnn 指定不匹配處後必須連續匹配的行數。
  • [drive1:][path1]filename1 指定要比較的第一個檔案或第一個檔案集。
  • [drive2:][path2]filename2 指定要比較的第二個檔案或第二個檔案集。

FORMAT

格式化磁碟

語法:

FORMAT volume [/FS:file-system] [/V:label] [/Q] [/A:size] [/C] [/X] 
FORMAT volume [/V:label] [/Q] [/F:size] 
FORMAT volume [/V:label] [/Q] [/T:tracks /N:sectors] 
FORMAT volume [/V:label] [/Q] 
FORMAT volume [/Q]

選項:

  • volume 指定驅動器(後面跟一個冒號)、裝入點或卷名。
  • /FS:filesystem 指定檔案系統型別(FAT、FAT32 或 NTFS)。
  • /V:label 指定卷標。
  • /Q 執行快速格式化。
  • /C 僅適於 NTFS: 預設情況下,將壓縮在該新建捲上建立的檔案。
  • /X 如果必要,先強制卸下卷。那時,該卷所有 已 開啟的控制代碼不再有效。
  • /A:size 替代預設配置單位大小。極力建議您在一般狀況 下使用 預設設定

MORE

逐屏顯示輸出。

RECOVER

從損壞的磁碟中恢復可讀取的資訊。

RECOVER [drive:][path]filename

REPLACE

替換檔案。

REPLACE [drive1:][path1]filename [drive2:][path2] [/A] [/P] [/R] [/W]

REPLACE [drive1:][path1]filename [drive2:][path2] [/P] [/R] [/S] [/W] [/U] 

[drive1:][path1]filename 指定原始檔。

[drive2:][path2] 指定要替換檔案的目錄。

/A 把新檔案加入目標目錄。不能和 /S 或 /U 命令列開關搭配使用。

/P 替換檔案或加入原始檔之前會先提示您 進行確認

/R 替換隻讀檔案以及未受保護的檔案。

/S 替換目標目錄中所有子目錄的檔案。不 能與 /A 命令選項搭配使用。

/W 等您插入磁碟以後再執行。

/U 只會替換或更新比原始檔日期早的文 件。不能與 /A 命令列開關搭配使用。

shutdown

語法:

shutdown [-i | -l | -s | -r | -a] [-f] [-m \\computername] [-t xx] [-c "comment"] [-d up:xx:yy] 
  • /i 顯示圖形使用者介面(GUI)。
  • /l 登出。這不能與 /m 或 /d 選項一起使用。
  • /s 關閉計算機。
  • /sg 關閉計算機。在下一次啟動時,重啟任何註冊的應用程式。
  • /r 完全關閉並重啟計算機。
  • /g 完全關閉並重新啟動計算機。在重新啟動系統後,重啟任何註冊的應用程式。
  • /a 中止系統關閉。 這隻能在超時期間使用。與 /fw 結合使用,以清除任何未完成的至韌體的引導。
  • /p 關閉本地計算機,沒有超時或警告。可以與 /d 和 /f 選項一起使用。
  • /h 休眠本地計算機。可以與 /f 選項一起使用。
  • /hybrid 執行計算機關閉並進行準備以快速啟動。 必須與 /s 選項一起使用。
  • /fw 與關閉選項結合使用,使下次啟動轉到韌體使用者介面。
  • /e 記錄計算機意外關閉的原因。
  • /o 轉到高階啟動選項選單並重新啟動計算機。必須與 /r 選項一起使用。
  • /m \computer 指定目標計算機。
  • /t xxx 將關閉前的超時時間設定為 xxx 秒。有效範圍是 0-315360000 (10 年),預設值為 30。如果超時時間大於 0,則默示為 /f 引數。
  • /c "comment" 有關重新啟動或關閉的原因的註釋。最多允許 512 個字元。
  • /f 強制關閉正在執行的應用程式而不事先警告使用者。如果為 /t 引數指定大於 0 的值,則默示為 /f 引數。
  • /d [p|u:]xx:yy 提供重新啟動或關閉的原因。
    • p 指示重啟或關閉是計劃內的。
    • u 指示原因是使用者定義的。
    • 如果未指定 p 也未指定 u,則重新啟動或關閉
    • 是計劃外的。
    • xx 是主要原因編號(小於 256 的正整數)。
    • yy 是次要原因編號(小於 65536 的正整數)。

800 秒後自動關機

shutdown /s /t 800

60秒後強制關機,並設定一個備註資訊:April Fools

shutdown -s -f -t 60 -c "April Fools"

ver

顯示系統版本

tree

以圖形模式顯示路徑的目錄結構。

語法:

TREE [drive:][path] [/F] [/A]
  • /F 顯示每個資料夾中檔案的名稱(遞迴目錄,包含子目錄)。
  • /A 使用 ASCII 字元,而不使用擴充套件字元。
tree D:                # 顯示 D 盤根目錄結構
tree D:\tencent        # 顯示 D 盤 tencent 目錄結構
tree D:\tencent /f     # 顯示 D 盤 tencent 目錄結構及其所有檔案
tree D:\tencent /a     # 以 ASCII 碼顯示 D 盤 tencent 目錄結構
tree D:\tencent /f /a  # 以 ASCII 碼顯示 D 盤 tencent 目錄結構及其所有檔案

type

顯示文字檔案的內容。

type D:\test.txt

DIR

顯示某個路徑下的目錄和檔案。不指定路徑,則預設顯示當前路徑下的所有檔案和資料夾

語法:

DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N][/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4] 
  • /A : 指定目錄或檔案屬性,如 dir /ah 只顯示隱藏檔案,支援如下屬性:
    • D 目錄
    • R 只讀檔案
    • H 隱藏檔案
    • A 準備存檔的檔案
    • S 系統檔案
    • - 表示“否”的字首,例 如-r 為非只讀檔案,-h 為非隱藏檔案如此等等。
  • /B 只顯示檔名和副檔名。
  • /C 在檔案大小中顯示千位數分隔符。這是預設值。用 /-C 來停用分隔符顯示。
  • /D 跟寬式相同,但檔案是按欄分類列出的。
  • /L 用小寫。
  • /N 新的長列表格式,其中檔名在最右邊。
  • /O 用分類順序列出檔案。支援如下分類方式:
    • N 按名稱(字母順序)
    • S 按大小(從小到大)
    • E 按副檔名(字母順序)
    • D 按日期/時間(從先到後)
    • G 組目錄優先
    • - 顛倒順序的字首
  • /P 在每個資訊屏幕後暫停。
  • /Q 顯示檔案所有者。
  • /S 顯示指定目錄和所有子目錄中的檔案。
  • /T 控制顯示或用來分類的時間字元域
    • C 建立時間
    • A 上次訪問時間
    • W 修改的時間
  • /W 用寬列表格式。
  • /X 顯示為非 8dot3 檔名產生的短名稱。格式是 /N 的格式,短 名稱插在長名稱前面。如果沒有短名稱,在其位置則顯示空白。
  • /4 用四位數字顯示年

例子:

例 1: C:\>dir 顯示 C 盤根目錄檔案列表

例 2:C:\>dir "program files" 顯示 C:\program files 裡面 的內容。注意:如果檔名包含空格,就必須用雙引號,否則失敗。 檔名不包含空格,則雙引號可有可無。

例 3: C:\>dir /a 顯示所有檔案,包括系統檔案和隱藏檔案。/a 後面可以帶引數,表示搜尋具有指定屬性的檔案。 這裡預設情況下,就表示搜尋所有檔案。

例 4:C:\>dir /as 顯示 C 盤裡的系統檔案及隱藏的檔案及目錄,其它不顯示。

例 5: C:\>dir /ah 顯示隱藏檔案及資料夾。

例 6: C:\>dir /ad 只顯示 C 盤的目錄而不顯示檔案。

例 7: C:\>dir /a-d 只顯示 C 盤的檔案而不顯示目錄。以上都 是/a 後面帶引數,表明搜尋具備或者不具備(-d -r -h -a -s)指定屬性的檔案。

例 8: C:\>dir /o 顯示 C 盤目錄和檔案順序。

例 9: C:\>dir /o-g 目錄在下面,檔案在上面。

例 10:C:\>dir /on 按名稱的字母順序排列 C 盤的目錄和檔案。

例 11:C:\>dir /o-n 按名稱的字母逆序排列 C 盤的目錄和檔案。

例 12:C:\>dir /oe 按副檔名的字母順序排列 C 盤的目錄和檔案。

例13:C:\>dir /o-e 按副檔名的字母逆序排列C盤的目錄和檔案。

例 14:C:\>dir /od 按日期和時間順序排列 C 盤的目錄和檔案(早的排前)

例 15:C:\>dir /o-d 按日期和時間逆序排列 C 盤的目錄和檔案(晚的排前)

例 16:C:\>dir /os 按檔案的大小排列(大的排前)

例 17:C:\>dir /o-s 按檔案的大小排列(小的排前)

例 18:C:\>dir /p /a /og windows 分頁顯示 C 盤 Windows 目錄 和檔案,也包括隱藏的目錄和檔案,並按照在檔案之前分組顯示。 windows 沒有包含空格,那麼有無雙引號無所謂。

例 19:C:\>dir /p /w /a /og windows 分頁並寬屏顯示 C 盤 Windows 目錄和檔案,也包括隱藏的目錄和檔案,並按照在檔案之前分組顯示。

例20:C:\>dir /s /b regedit.exe 在C盤搜尋regedit.exe路徑。 如果要求顯示詳細資訊,可以這麼寫 C:\>dir /s regedit.exe

例 22:F:\>dir /s /b *.mp3>E:\mp3.txt 搜尋 F 盤每個角 落的 mp3 檔案,生成列表後儲存在 E 盤。

例 23:C:\>dir read???.txt 搜尋 C 盤根目錄下所有以 read 開頭,後面最多跟三個字元的 txt 檔案。

cd

CD 等於 CHDIR, 用來切換路徑。

語法:

CD [/D] [drive:][path]
CD [..]
CD [\] 

/d 選項用來切換磁碟。譬如你從 C 盤 切換到 D 盤,必須使用這個選項。

.. 代表上層路徑

\ 代表磁碟的根目錄

例子:

C:\Users\wztshine>cd ..

C:\Users>cd \

C:\>cd /d D:

D:\>cd /d C:\Users

EXIT

退出 CMD.EXE 程式(命令翻譯程式)或當前批處理指令碼。

語法:

EXIT [/B] [exitCode] 

/B 選項用來僅退出指令碼,而非 cmd.exe 程序。

exitCode 是退出碼,可選範圍是 0~255

譬如可以在指令碼這樣寫,來設定退出指令碼,並設定退出碼:

exit /b 0

MD / MKDIR

MD 等於 MKDIR,用來建立目錄(也就是建立資料夾),如果資料夾已經存在,會提示。

注意:路徑使用 \, 而不是 /

md a\b\c  # 在當前路徑下建立 a\b\c 三層資料夾

md D:\test

REN / RENAME

ren 等同於 rename,用來給資料夾或檔案重新命名

REN [drive:][path]name1 name2

注意:第一個引數是要重新命名的路徑,第二個引數只能是名字,不能指定路徑!

ren a.txt b.txt

ren D:\a.txt b.txt

內建變數

%errorlevel%

最近一次執行命令的退出碼。成功是 0,錯誤是非 0 的數值。退出碼的取值範圍是 0~255

%ALLUSERSPROFILE%

返回“所有使用者”配置檔案的位置。

%APPDATA%

返回預設情況下應用程式儲存資料的位置。

%CD%

返回當前目錄字串。也就是獲得當前路徑,並將其轉換為字串。

%CMDCMDLINE%

返回用來啟動當前的 Cmd.exe 的準確命令列。

%CMDEXTVERSION%

返回當前的“命令處理程式擴充套件”的版本號。

%COMPUTERNAME%

返回計算機名稱。

%COMSPEC%

返回命令列直譯器可執行程式的準確路徑。也就是返回 cmd.exe 的路徑,一般在C:\WINDOWS\system32\cmd.exe。

%DATE%

返回當前日期字串。和使用 date/t 效果一樣。

%HOMEDRIVE%

返回連線到使用者主目錄的本地工作站驅動器號。基於主目錄值而設定。使用者主目錄是在“本地使用者和組”中指定的。

%HOMEPATH%

返回使用者主目錄的完整路徑。基於主目錄值而設定。使用者主目錄是在“本地使用者和組”中指定的。

%HOMESHARE%

返回使用者的共享目錄的網路路徑。基於主目錄值而設定。使用者主目錄是在“本地使用者和組”中指定的。

%LOGONSERVER%

返回驗證當前登入會話的域控制器的名稱。

%NUMBER_OF_PROCESSORS%

指定安裝在計算機上的處理器數目(所有 CPU 的總核心數)。

%OS%

返回作業系統名稱。

%PATH%

系統指定可執行檔案的搜尋路徑。也就是在這些目錄下的可執行檔案

%PATHEXT%

返回作業系統認為可執行的副檔名的列表。

%PROCESSOR_ARCHITECTURE%

返回處理器的晶片體系結構。返回值為 x86 或 IA64或 RISC。這些都是常見的架構,或者稱作指令集。

%PROCESSOR_IDENTFIER%

返回處理器說明。

%PROCESSOR_LEVEL%

返回計算機上安裝的處理器型號。

%PROCESSOR_REVISION%

返回處理器版本號。

%PROMPT%

返回當前解釋程式的命令提示符設定。由 Cmd.exe 生成。

%RANDOM%

返回 0 到 32767 之間的任意十進位制數字。由 Cmd.exe 生成。

%SYSTEMDRIVE%

返回包含Windows server operation system根目錄(即系統根目錄)的驅動器。

%SYSTEMROOT%

返回 Windows server operation system 根目錄位置。

%TEMP%和%TMP%

使用者返回對當前登入使用者可用的應用程式所使用的預設臨時目錄。有些應用程式需要 TEMP,而其他應用程式則需要 TMP。

%TIME%

返回當前時間字串。使用與 time /t 命令相同的格式。

%USERDOMAIN%

返回包含使用者賬戶的域的名稱。

%USERNAME%

返回當前登入的使用者的名稱。

%USERPROFILE%

返回當前使用者的配置檔案的位置,即當前使用者的家目錄

%WINDIR%

返回作業系統目錄的位置。

我的電腦上執行結果:

echo %errorlevel% 0
echo %ALLUSERSPROFILE% C:\ProgramData
echo %APPDATA% C:\Users\wztshine\AppData\Roaming
echo %CD% C:\Users\wztshine\Desktop\bat_test
echo %CMDCMDLINE% C:\Windows\system32\cmd.exe /c ""C:\Users\wztshine\Desktop\bat\test.bat" "
echo %CMDEXTVERSION% 2
echo %COMPUTERNAME% DESKTOP-DCBC2US
echo %COMSPEC% C:\Windows\system32\cmd.exe
echo %DATE% 2022/05/20 週五
echo %HOMEDRIVE% C:
echo %HOMEPATH% \Users\wztshine
echo %HOMESHARE% ECHO 處於關閉狀態。
echo %LOGONSERVER% [\DESKTOP-DCBVSO](file://DESKTOP-DCBVSO)
echo %NUMBER_OF_PROCESSORS% 4
echo %OS% Windows_NT
echo %PATH% D:\AZ\py3.10.1\Scripts;D:\AZ\py3.10.1; .....
echo %PATHEXT% .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW
echo %PROCESSOR_ARCHITECTURE% AMD64
echo %PROCESSOR_IDENTFIER% ECHO 處於關閉狀態。
echo %PROCESSOR_LEVEL% 6
echo %PROCESSOR_REVISION% 3c06
echo %PROMPT% $P$G
echo %RANDOM% 19717
echo %SYSTEMDRIVE% C:
echo %SYSTEMROOT% C:\Windows
echo %TEMP% %TMP% C:\Users\wztshine\AppData\Local\Temp C:\Users\wztshine\AppData\Local\Temp
echo %TIME% 14:05.9
echo %USERDOMAIN% DESKTOP-DCBC2CN
echo %USERNAME% wztshine
echo %USERPROFILE% C:\Users\wztshine
echo %WINDIR% C:\Windows

變數延遲擴充套件

setlocal enabledelayedexpansion 可以設定變數延遲。

先看一個很簡單的例子,猜測一下輸出結果是啥:

@echo off

set a=Hello
if "%a%" == "Hello" (
    set a=World
    echo %a%
)
echo %a%
pause

輸出:

Hello
World

為什麼輸出了 Hello 呢?按道理說,應該輸出兩次 World 才對。

這是因為 if 後面的圓括號以及圓括號裡面的所有命令,都會被當作一條完整的語句來進行預處理,所謂預處理,就是先將語句中所有的變數 %var%,都用變數的值替換掉。

因此程式執行到 if 語句時,找到語句中的變數 %a% ,並用它的值 Hello 來替換,因此 if 語句中的 echo %a% 就變成了 echo Hello,當 if 語句執行完畢後,set a=World 也就生效了,因此最後一個 echo %a% 輸出的是 World

所謂變數延遲,就是禁用預處理,讓變數實時的更新。但是需要注意的是,要實時更新的變數,不能再用 %var% 這種格式,而是要用 !var! 這種格式

啟用變數延遲:

@echo off

set a=Hello

:: 啟用變數延遲擴充套件
setlocal enabledelayedexpansion
if "%a%" == "Hello" (
    set a=World
    :: 注意這裡要用 !a! 這種形式
    echo !a!
)

echo %a%
pause

輸出:

World
World

注意:

以後所有的複合語句(“for if else”等含有語句塊的語句和用“& | && ||”等連線起來的複合語句),如果要實時更新某個變數,都要使用變數延遲!否則預期結果可能和你猜想的不同。

首先要明白什麼是“複合語句”,所謂“複合語句”就是指一對 () 裡的所有命令。比如 fordo 後面,如:

for /f "delims=" %%i in (a.txt) do (
    set var=%%i
    echo %%i
    set num=%%i
) 

當然,不僅僅是 for 命令的括號裡面是複合語句,實際上,所有用圓括號包裹的命令,都是複合語句。通過管道命令 &、 &&、|、|| 連線起來的命令也是複合語句。

如果在複合語句之外引用變數,則使用 %var% !var!都是可以的。若想在複合語句中使用實時的變數,則必須使用 !var!。如果在複合語句中還是使用 %var% 變數,那麼得到的變數將是複合語句之前 var 的值,此時如果 var 在複合語句之前沒有定義,那麼值為空值

變數擴充套件

我們不僅可以使用 %0, %1, %2.. 這種引數變數,還可以擴充套件一下變數:

語法:

%~[flag]num

num 是第幾個引數,如 0,1,2,...

flag 是可選項,有如下幾種,並且可以組合一起:

  • d : 獲取驅動器號
  • f : 檔案路徑
  • p :資料夾路徑
  • n :檔名(不帶字尾)
  • x :字尾名
  • s :檔案路徑的短名
  • a :檔案屬性
  • t :檔案修改日期和時間
  • z :檔案大小
  • $PATH :查詢環境變數中的路徑
  • dp:獲取驅動器和路徑
  • nx :獲取檔名和字尾
  • ftza :檔案的路徑,時間,大小等資訊,類似於 dir 命令的輸出

flag 如果不寫,則去除引數的引號,如果不知道路徑帶不帶引號,用它非常有用。

例項:

test script.bat

@echo off

:: 處理 %0 這個變數
echo 刪除引號: %~0
echo 擴充到路徑: %~f0
echo 擴充到一個驅動器號: %~d0
echo 擴充到一個路徑:%~p0
echo 擴充到一個檔名: %~n0
echo 擴充到一個副檔名: %~x0
echo 擴充的路徑只含有短名: %~s0
echo 擴充到檔案屬性: %~a0
echo 擴充到檔案的日期/時間: %~t0
echo 擴充到檔案的大小: %~z0
echo 查詢列在 PATH 環境變數的目錄,並將第一個引數擴充到找到的第一個完全合格的名稱: %~$PATH:0
echo 擴充套件到驅動器號和路徑: %~dp0
echo 擴充套件到檔名和副檔名: %~nx0
echo 擴充套件到類似 DIR 的輸出行: %~ftza0 

pause & exit

雙擊執行,輸出:

刪除引號: C:\Users\wztshine\Desktop\test script.bat
擴充到路徑: C:\Users\wztshine\Desktop\test script.bat
擴充到一個驅動器號: C:
擴充到一個路徑:\Users\wztshine\Desktop\
擴充到一個檔名: test script
擴充到一個副檔名: .bat
擴充的路徑只含有短名: C:\Users\wztshine\Desktop\test script.bat
擴充到檔案屬性: --a--------
擴充到檔案的日期/時間: 2022/05/19 16:29
擴充到檔案的大小: 514
查詢列在 PATH 環境變數的目錄,並將第一個引數擴充到找到的第一個完全合格的名稱: C:\Users\wztshine\Desktop\test script.bat
擴充套件到驅動器號和路徑: C:\Users\wztshine\Desktop\
擴充套件到檔名和副檔名: test script.bat
擴充套件到類似 DIR 的輸出行: --a-------- 2022/05/19 16:29 514 C:\Users\wztshine\Desktop\test script.bat
請按任意鍵繼續. . .