Windows批次處理指令碼(一)

2020-08-17 09:05:44
基本命令
cmd
dir 列檔名
cd 改變當前目錄
ren 改變檔名
copy 拷貝檔案
del 刪除檔案
md 建立子目錄
rd 刪除目錄
deltree 刪除目錄樹
format 格式化磁碟
edit 文字編輯
type 顯示檔案內容
mem 檢視記憶體狀況
help 顯示幫助提示
cls 清屏
move 移動檔案,改目錄名
more 分屏顯示
xcopy 拷貝目錄和檔案
顯示和列印
  • echo
    – 列印顯示
    – echo on 開啓命令的回顯
    – echo off 關閉命令回顯
  • @
    如果在某一條命令最前面加上 @ ,那麼這一行命令就不會顯示出來
  • >
    表示將輸出結果列印到某處,會覆蓋之前的
  • >>
    表示將輸出結果列印到某處,不會覆蓋之前的
  • title
    後面跟字串可以改變當前命令提示字元的標題名稱
  • rem
    可以當作註釋命令,和::有異曲同工之妙。
  • pause
賦值、呼叫和參數
賦值
  • 給變數賦值一個字串
    set var=Hello world,便是賦值操作。
    set var可以檢視變數得值
    set v 可以檢視所有以字母 v 開頭變數的值。直接輸入 set 可以檢視所有變數的值
    變數兩側加上百分符號 % 用來表示該變數的值(內容)
  • 給變數賦值一個數值型得值
    在 set 後面加上 /a 的參數可以給變數賦予一個數值型的值,例如 set /a var=48 表示將數位48賦給變數var。該數值型的變數是一個32位元的整數型數值,即佔用4個位元組,能表示的數值個數爲2的32次方,含正負號,範圍爲:-2147483648~2147483647
  • 從外部獲得輸入的變數值
    在 set 後面加上 /p 的參數,可以將變數設成使用者輸入的一行輸入。讀取輸入行之前,顯示指定的 提示文字。當然,提示文字也可以是空的。比如 set /p var=請輸入一些文字: ,可以顯示出一段提示文字"請輸入一些文字:"並能將使用者輸入的資訊存到變數var裡。/p 的參數還有很多諸如對字串的替代、提取、增減等功能
  • 變數得賦值、顯示、變換和計算
    把變數 var 裡的值賦給另一個變數 var1 ,做法是:set var1=%var%
    echo var1 和 echo %var1% ,所得到的返回輸出分別爲:var1 和 Hello world! 。
    輸入的命令    結果    效果                   
    echo %var%    1234567890 顯示所有                 
    echo %var:~4%   567890   從第4個字元以後開始顯示         
    echo %var:~4,3%  567     從第4個字元以後開始顯示,並只顯示前3個  
    echo %var:~-4%  7890    從倒數第4個字元開始顯示         
    echo %var:~-4,3% 789     從倒數第4個字元開始顯示,並只顯示前3個  
    echo %var:~4,-2% 5678    從第4個字元以後開始顯示,顯示到還剩2個爲止
    echo %var:~0,3%  123     從頭開始顯示,並只顯示前3個字元     
    echo %var:~0,-3% 1234567   從頭開始顯示,顯示到還剩3個字元爲止
呼叫
  • 跳轉
    goto 跟上標籤就能直接讓程式從該標籤處開始繼續執行隨後的命令,不論標籤的位置是在該 goto 命令的前面還是後面。標籤必須以單個冒號 : 開頭,但不區分大小寫。有個特殊的標籤 :EOF 或 :eof 能將控制轉移到當前批指令碼檔案的結尾處,它是不需要事先定義的。
  • 呼叫
    call 主要體現在兩個方面:一是呼叫該批次處理以外的另一個批次處理(事實上呼叫該批次處理本身也可以,只是可能會帶來不必要的死回圈);另一方面是有着與 goto 類似的向特定標籤處跳轉的功能。然而,call 的獨特之處在於:在呼叫的批次處理或標籤後的內容處理完成以後,控制會繼續執行 call 後面的語句
  • 啓動
    start 雖然也不是一個簡單的命令,但用法絕對不難理解。來幾個例子:start msconfig 用來開啓"系統設定應用程式";start notepad 則可以開啓一個記事本;start 「這就是所謂的標題」 cmd 用來開啓一個新的命令提示字元;start 「隨便寫個標題」 http://www.baidu.com 便開啓百度的首頁;而 start 「開玩了」 E:\game\starcraft\starcraft.exe 卻是開始星際爭霸(如果您的電腦裡安裝了星際且路徑與上述一致的話)等等。雖然 start 的參數很多(具體用法在輸入 help start 後可以得到),但通常情況下我們只需要知道 start 後面加上標題,再跟上想要執行程式、命令或網址即可。值得注意的是:標題要用雙引號參照起來,否則會被作爲可執行的檔案來處理;所要執行的東西如果不是系統內部程式或命令的話,則需要我們給出具體的路徑,比如絕對路徑。
參數
  • 參數傳遞
    :::::::::::被呼叫.bat:::::::::::
    echo 這裏是 被呼叫.bat
    echo 您輸入的第1條參數爲 %1
    echo 您輸入的第2條參數爲 %2
    pause
    ::::::::::::::::::::::::::::::::
    其中,%1 和 %2 分別代表執行"被呼叫.bat"批次處理時所跟的兩個參數。那麼它該如何獲得所謂的參數1和參數2呢。雙擊執行"被呼叫.bat"當然是不行的了。可以在命令提示字元裡輸入"被呼叫.bat"的全名,並在後面加上兩個參數即可(如果"被呼叫.bat"不在當前工作路徑,需要輸入"被呼叫.bat"的路徑,比如絕對路徑,以便讓計算機找到它)。就像:D:\批次處理\test\被呼叫.bat Tom and Jerry 。執行時我們會發現 %1 和 %2 分別顯示爲 Tom 和 and ,Jerry 爲作爲第3個參數來處理,但該批次處理中卻未用到 %3 。提示:在XP等操作系統中,對於漢字的輸入可用 Ctrl + 空格 切換出中文輸入法;也可以按 Tab 鍵讓其自動切換並補充完成您所想要輸入的路徑。
  • 參數的輸入與輸出
    ::::::::::::呼叫.bat::::::::::::
    @echo off
    echo 這裏是 呼叫.bat
    pause

set /p Num=請輸入一個整數:
set Square=

call 被呼叫.bat Num Square

echo 現在又回到了 呼叫.bat ,而且,%Num% 的平方是 %Square% 。
pause
::::::::::::::::::::::::::::::::

:::::::::::被呼叫.bat:::::::::::
echo 這裏是 被呼叫.bat
echo 您輸入的第1條參數爲 %1
echo 您輸入的第2條參數爲 %2

set /a %2 = %1 * %1

echo 經過計算後,您輸入的第1條參數爲 %1
echo 經過計算後,您輸入的第2條參數爲 %2
pause
::::::::::::::::::::::::::::::::

  • 函數
    ::::::::::::跳轉.bat::::::::::::
    @echo off
    call :FirstLable 很好很強大

:SecondLable
echo 然後顯示這句
pause
goto :EOF

:FirstLable
echo 首先顯示這句,後面跟的參數爲 %1
pause
::::::::::::::::::::::::::::::::

對於 goto 所跟的標籤或 start 所跟的程式,它們後面能否加參數呢?答案是:前者是否定的;後者是肯定的,試試看。

條件/回圈
條件if

set var=Tom
if %var%==Tom echo It works
if %var%==Jerry echo We will never see this
如果變數 var 的值爲 Tom Hanks ,即中間含有空格之類的特殊符號,那麼我們在使用 if 時,就得爲字串加上雙引號,就像 if 「%var%」==「Tom Hanks」 echo It works (注意,給字串加上雙引號後,在進行判斷的時候會連雙引號一起考慮進去。所以,爲了使兩邊的對比均衡,所以一定要在 == 兩邊的兩個字串上同時都加雙引號)。這裏也體現了批次程式語言格式的多樣性(如果您熟悉 C 語言格式的話,就知道一串字元總是要被雙引號引起來)。不過爲了方便記憶,我們在使用 if 的時候,不妨總是在字串上使用雙引號,這樣既好閱讀,又不容易引起歧異。
:::::::::else的用法.bat:::::::::
@echo off

if 「%TIME:~0,2%」 lss 「12」 (
echo 現在是上午
) else (
echo 現在是下午
)

pause
::::::::::::::::::::::::::::::::

:::::::::else的用法.bat:::::::::
@echo off

if 「%TIME:~0,2%」 lss 「12」 (
if 「%TIME:~0,2%」 lss " 6" (
echo 現在是凌晨
) else (
echo 現在是上午
)
) else (
if 「%TIME:~0,2%」 lss 「18」 (
echo 現在是下午
) else (
echo 現在是晚上
)
)

pause
::::::::::::::::::::::::::::::::
4.1.4 剛纔提到的數值型變數的比較,其實很簡單,就如下面 下麪的例子中描述的一樣。
::::::::::::::::::::::::::::::::
@echo off
set /a num=5

if %num% == 5 (
echo 變數 num 等於 5
)

if not %num% == 4 (
echo 變數 num 不等於 4
)

set /a num = ( %num% + 3 ) * 2
:: 變數 num 加3並乘2後再賦給變數 num 自身

if %num% == 16 (
echo 經過運算後,現在變數 num 等於16
)

if not %num% == 16 (
echo 此時的變數 num 不會不等於 16 ,因此這一句不會顯示了
)

pause
::::::::::::::::::::::::::::::::

延遲變數

::::::::延遲變數擴充.bat::::::::
@echo off
setlocal EnableDelayedExpansion

set /a num=5

if %num% == 5 (
set /a num*=3

echo 在 if 語句之前,變數 num 等於 %num%
echo 但變數 num 在經過運算後,且由於延遲變數擴充被啓用,變數 num 等於 !num!
)

echo 但最終變數 num 還是等於 %num%

pause
::::::::::::::::::::::::::::::::
if 條件下的兩行 echo 在輸出變數值的時候用到的符號不一樣,一個是用百分號 % 包括起來的,另一個用的卻是驚歎號 ! 。雖然在顯示 %num% 之前已經使變數 num 的數值乘了3倍,但是由於沒有延遲變數的擴充,使得 %num% 的結果仍然是 5 。但用 !num! 顯示出的值已經變爲 15 了。注意到批次處理中的 setlocal EnableDelayedExpansion (setlocal/? 檢視相關資訊),這表示開啓延遲變數擴充。此時的 !num! 纔有意義。不然 !num! 將無法被識別,因爲在預設情況下,延遲變數擴充是被停用的。

4.1.6 此外,if 還有其他的用法—— if exist 和 if defined 。if exist 可判斷檔案是否存在,就像這樣:
if exist 「D:\test my folder\a.txt」 (
del 「D:\test my folder\a.txt」
) else (
echo 您所要刪除的檔案不存在
)
在對檔案進行操作之前進行判斷其是否存在很有意義,這使得程式碼更加健壯。

而對於 if defined 來說,與 if exist 類似,只不過 if defined 的判斷物件不是檔案,而是變數,它用於判斷環境變數是否被定義。

回圈for

for %i in (.) do @echo %i
for 、in 和 do ,是 for 的固定用法。其內容可以理解爲:在某一範圍內(in),對於其中的某一檔案來說(for),做如下的處理(do)。而 for %i in (.) do @echo %i 就是在當前工作目錄的所有檔案中(in (.)),對於其中的某一檔案(for %i),做出顯示其名稱的處理(do @echo %i)。變數 i 僅在當前回圈語句 for 裡起作用,%i 表示其值。
注意:以上是直接在命令提示字元裡以命令的形式表達出來的寫法;在批次檔中應使用雙百分號 %% 代替單百分比號 % ,就像:%%i
:::::::批次修改檔名.bat:::::::
@echo off
setlocal EnableDelayedExpansion
set /a num=1
for %%i in (D:\test*.txt) do (
ren 「%%i」 !num!.txt
set /a num+=1
)
::::::::::::::::::::::::::::::::

參考

Windows 批次處理指令碼學習教學