命令提示字元 13:撰批次檔

這一章正式來說批次檔,雖然之前幾章有使用到,這章來完整說明。批次檔就是把一次要執行的程式全部弄成一個檔案,再一起執行。要製作一個批次檔可以用記事本編緝好後存成「.cmd」點二下執行,有時後標準輸出成「.cmd」再編緝會比較快(如 dir >Batch.cmd)。

很多人會問批次檔要寫什麼,這裡也不好拿出一個相樣的例子,所以就抱歉不舉例了。



在這一章要說一些撰寫批次檔會遇到的問題。首先,先說批次檔常用的跳行執行:

goto

實際上是這樣用的:

goto next
echo A.
:next
echo B.

這就是「goto」的功用,直接跳到「:」開頭的地方。「goto」在需要編譯的程式是大忌,但在直譯的命令提示字元就很受歡迎,因為命令提示字元是一次解析一行,沒有程式會亂掉的問題。



批次檔也是可以傳遞參數,範例如下:

echo %0 %1 %2

可以看出來參數被傳遞了,「%0」代表批次檔執行的名稱、「%1」代表第一個參數、「%2」代表第二個參數。



來回顧一下在「set」跳過的東西:

set a=1
(
set a=2
echo %a%
)

很多人己經看出問題所在了,照理要顥示「2」,但可以看到結果它會先把括弧裡面的東西全部展開。解決辦法有二種,第一種是上面介紹的「goto」,在括弧裡面直接使用「goto」,強迫跳出副程式。但這是在比較簡單的程式才好用,否則到最後變數會變成什麼也不知道。程式碼更改如下:

set a=1
(
set a=2
goto next
)
:next
echo %a%

第二種是用延遲環境變數展開功能,程式碼更改如下:

setlocal EnableDelayedExpansion
set a=1
(
set a=2
echo %!a!%
)

直到使用時才會展開;第一行「setlocal EnableDelayedExpansion」是去查 ss64.com 才知道要開。其實一開始個人在撰寫時對這個問題困擾很久,直到做這個教學才知道可以這樣用。



後面來說如何使批次檔更美觀,首先:

echo

「echo on」是預設狀態,就是會顥示每一行執行的指令,若要不顥示,可以用「echo off」:

echo off
echo Test.

可是這還有第一行「echo off」啊!所以有一個東西叫「@」,就是不顥示那一行,使用如下:

@echo off
echo Test.




最後來說二個批次檔也會用到的指令:

pushd C:\
popd

它就是用「pushd」存入執行前目錄(範例是 C:\Users\%username%),並切換到「C:\」,當需要時再用「popd」切換回去(範例是 C:\Users\%username%)。

pushd ..
pushd ..
popd
popd

這二個指令是用堆疊的方式,即最後進去的會最先出來。



這章的深度很淺,但不知道有這些方法時在寫批次檔會不知所措,甚至初學者連錯在哪裡都不知道。批次檔很實用,學完之後可以試著來套用在一些比較簡單的使用上;一開始都會有很多問題,可以試著發問,寫多自然就沒有問題了。



下一章:淺入淺出




  • 2012-09-11 初次發佈。
  • 2017-07-12 更新成 Windows 10 的版本。

18 則留言:

  1. 請問版主goto goto next
    echo A.
    :next
    echo B.<<此段的意思

    回覆刪除
    回覆
    1. 這個的意思是要說明如果下了 goto
      他會略過中間任何程式碼
      直接到標籤的位置執行

      刪除
  2. 版主您好,想請教在延遲環境變數展開功能那的例子
    setlocal EnableDelayedExpansion
    set a=1
    (
    set a=2
    echo %!a!%
    )

    此處的 echo %!a!% ,是否應該為 !a! ?
    還想詢問 !! 的使用與方法?

    回覆刪除
    回覆
    1. 是 !a! 才對喔

      其實可以 %!a!% 和 !a! 都試看看
      在 .cmd 檔的最後面加 pause 就可以暫停結果
      這招會了還可以偵錯

      刪除
  3. 謝版主的教學文章,奠定了我的程式基礎,真要說的話,你也算是我的老師,是否有臉書或者LINE可加
    以下是我的小成果<(_ _)>
    https://www.youtube.com/channel/UClOuD6S_0OSY5RH-fACpivg

    回覆刪除
    回覆
    1. 我沒有 LINE 所以也不知道要怎麼加

      其實你寫的程式己經我教學的深很多了
      可以的話開始去摸一些大型的程式語言
      或是轉戰 Linux 也是個不錯的

      PowerShell 嗎?有興趣再去摸吧
      微軟推的不是很順利

      刪除
    2. 也沒臉書嗎,有的,我另外有學C C++ Java html vbscript,大多都有用batch的概念去學,像我C兩個禮拜就學完,其實我自己也很驚訝,powershell想等摸bash時順便去碰

      刪除
    3. 被你猜對了,我也沒有臉書

      VB 可以放生了,微軟也準備要放生了
      看你好像是要走網頁那塊
      那可以去玩看看 ASP.NET (MVC / Core)
      那個在台灣的就業市場很吃香

      最後讓我小警告一下,即便是最基礎的 C 都比命令提示字元複雜很多
      更別提 C++ / Java 等這種大型的程式語言
      不要太小看他喔

      到是在學完命令提示字元後就會默默的發現
      很多在 C / C++ / Java 要寫很多行的,在命令提示字元寫一行就好了
      然後就會默默的看著別人還在硬幹臉上的汗珠

      想要在 Linux 「做事」的
      沒有 Bash 根本什麼事都做不了
      如果有興趣的話可以去摸看看
      但台灣的市場不是很多人用就是了,至少是現在

      刪除
    4. 作者已經移除這則留言。

      刪除
    5. 現在臉書什麼動作都要登入
      想匿名都不行...

      刪除
    6. 這種事我也試過了
      他要電話,而且用手機開帳號還要你拍照拍臉給他們看

      其實我是有其他的方式在處理即時通訊的問題啦
      但現在在測試中,等之後比較穩定再拿出來獻醜吧

      刪除
    7. 等你了老師,有問題再跟我說吧,別忘記我喔

      刪除
    8. 你好

      現在的 Google 不論是 Google+ 或 YouTube 都找不到你的連絡方式
      可不可以提供一個方式找你?

      刪除
    9. 作者已經移除這則留言。

      刪除
    10. 噢對了,最近一部的影片是在前幾天所發佈的,批次檔防毒,有興趣的話可以看看順便幫我推廣XD

      https://youtu.be/x0ukbete7nY

      刪除
  4. 這種事我也試過了
    他要電話,而且用手機開帳號還要你拍照拍臉給他們看

    其實我是有其他的方式在處理即時通訊的問題啦
    但現在在測試中,等之後比較穩定再拿出來獻醜吧

    回覆刪除

定時會整理。