位元詩人 [Windows] 程式設計教學:命令提示字元 (Command Prompt) 入門

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

由於 Windows 預設即有桌面環境,讀者可能沒使用過命令列環境。但很多開發工具是以命令列工具的形式來發佈,學習命令列的使用方式仍有其必要性。本文從頭介紹命令提示字元的使用方式,讓讀者學習基礎的命令列操作。

開啟命令提示字元視窗

使用 WIN鍵 + r 開啟「執行」對話框,輸入 cmd 後按下 Enter 鍵即可開啟命令列提示字元。附帶一起,輸入 powershell 後可開啟 PowerShell 終端機。

如果想要使用管理者來開啟命令提示字元的話,在桌面左下角的「在這裡輸入文字來搜尋」中輸入 cmd,然後選擇「以系統管理員身份執行」即可:

以系統管理員身份執行命令提示字元

由於系統管理員對系統具有破壞力,應只有在確認需要相關權限時才啟用。

(選擇性) 使用第三方終端機軟體

原本的命令提示字元終端機功能比較陽春,畫面也不美觀。有些第三方開發團隊做出強化版的終端機軟體,像是 PyCmdCmderTake Command 等。筆者並不反對使用這類軟體,像筆者自己也常態性使用 Cmder。但要知道那些部分是命令提示字元原本的特性,那些部分是第三方軟體引入的特性。

對於初學者來說,至少要實際用過幾次原生的命令提示字元終端機,才能知道兩者間的差異。如果要測試命令列工具,也最好在原生的命令提示字元底下測過。

依據不同使用情境啟動不同終端機

在類 Unix 系統上,終端機環境設置得相當完善,有許多命令列工具可用,不同的命令列工具皆共用同一個終端機環境,系統整合得相當好。

相對來說,Windows 的終端機就沒整合得那麼好,執行不同的任務需要切換不同的終端機。像是 Visual C++ 有自己的終端機,MSYS2 有自己的終端機,Anaconda 也附帶了 Python 終端機。

調整終端機軟體的外觀

第一次開啟命令提示字元環境時,建議先調整字體的大小,將字體換成等寛的 Consolas,比較不會看得那麼吃力,調整的方式是在視窗條按右鍵後選取相關選單:

Command Prompt Property

第一次使用命令提示字元

剛進入命令提示字元時,命令列環境處於等待的狀態。像是以下的例子:

C:\Users\user>

命令列環境和 GUI 環境相異,不會有視覺提示,需要由使用者自行輸入指令來操作該環境。

在這個例子中,我們的工作目錄 (working directory) 位於 C 磁碟機的 C:\Users\user 目錄中。

位於不同工作目錄時,系統的提示符 (prompt) 是相異的。為了簡化,我們把命令提示字元的提示符用下述方式來記錄:

>

R 語言的互動式環境也是用 > 當成提示符。但我們不會談到 R 語言,所以不會搞混。

在命令提示字元輸入 dir 指令:

> dir

輸入的方式是在命令提示字元上逐一輸入 dir 三個字母後,按下 Enter 鍵。

這時候,命令列會顯示出工作目錄中的檔案和目錄,然後把命令列的使用權還給使用者:

> dir
 磁碟區 C 中的磁碟是 OS
 磁碟區序號:  9AA7-0990

 C:\Users\user 的目錄

2020/02/25  下午 03:10    <DIR>          .
2020/02/25  下午 03:10    <DIR>          ..
(省略一些系統訊息)
2020/02/15  上午 12:15    <DIR>          Desktop
2020/02/26  上午 10:35    <DIR>          Documents
2020/02/27  上午 10:48    <DIR>          Downloads
2020/02/15  上午 12:15    <DIR>          Favorites
2020/02/10  下午 04:38    <DIR>          go
2020/02/15  上午 12:15    <DIR>          Links
2020/02/12  上午 10:51    <DIR>          Miniconda3
2020/02/15  上午 12:15    <DIR>          Music
2020/02/19  上午 09:17    <DIR>          OneDrive
2020/02/15  上午 12:15    <DIR>          Pictures
2020/02/15  上午 12:15    <DIR>          Saved Games
2020/02/15  上午 12:15    <DIR>          Searches
2020/02/15  上午 12:15    <DIR>          Videos
2020/02/13  下午 03:59    <DIR>          VirtualBox VMs
               2 個檔案             139 位元組
              26 個目錄  867,584,675,840 位元組可用

>

當命令列環境把使用權還給使用者後,使用者就可輸入下一個指令。

每個使用者的系統會相異,所以輸入 dir 所回饋的系統訊息會相異。

命令列環境基本的使用方式就是交互模式 (interactive mode)。命令列使用者每輸入一行指令,命令列就給予相對應的回應。在一來一往的過程中操作命令列環境,完成各項任務。

除了交互模式外,使用者可以預先輸入一系列指令,在命令列環境中以非互動模式 (non-interactive mode) 或批次模式 (batch mode) 來執行。例如,開發者利用持續整合 (CI, continuous integration) 服務測試專案程式碼時,會預先寫好測試程式和測試指令,在專案更動時自動引發 CI 上的測試流程。

關閉命令提示字元

輸入 exit 指令即可關閉命令提示字元。

取得內建幫助文件

學習命令列環境和命令列工具時,閱讀內建幫助文件是很重要的習慣。由於不同系統中的命令列工具的版本可能會有差異,在網路上或書籍中所看到的命令列工具的說明可能會和系統中實際的命令列工具相異。所以,一定要去習慣閱讀內建幫助文件。

命令提示字元內建的 help 指令可提供內建幫助文件。例如,取得 dir 指令的幫助文件:

> help dir
顯示檔案清單以列出目錄中的檔案及子目錄。

DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]
  [/O[[:]sortorder]] [/P] [/Q] [/R] [/S] [/T[[:]timefield]] [/W] [/X] [/4]

  [drive:][path][filename]
              指定要顯示的磁碟機、目錄或檔案。

  /A          顯示具有指定之屬性的檔案。
  attributes   D  目錄                R  唯讀檔案
               H  隱藏檔案               A  待封存檔案
               S  系統檔案               I  非內容索引檔案
               L  重新分析點             O  離線檔案
               -  首碼表示否定
  /B          使用單純格式 (沒有標頭資訊或摘要)。
  /C          在檔案大小中顯示千位分隔符號。這是預設值。使用 /-C 可停用
              分隔符號的顯示。
  /D          與寬的列表格式相同,但是依照欄來排序。
  /L          使用小寫顯示。
  /N          使用新的長列表格式,檔名會顯示在最右方。
  /O          依照指定的排序順序來列出檔案。
  sortorder    N  依名稱 (英文字母)       S  依大小 (最小的在前)
               E  依副檔名 (英文字母)  D  依日期/時間 (日期較早的在前)
               G  先列出子目錄    -  首碼表示相反的順序
  /P          當資料填滿整個螢幕時暫停顯示。
  /Q          顯示檔案擁有者。
  /R          顯示檔案的替代資料流。
  /S          顯示指定目錄及所有子目錄中的檔案。
請按任意鍵繼續 . . .

由於說明文件較長,會分在多個頁面中,逐頁捲動。

此外,幾乎每個 DOS 風格的指令都可以搭配 /? 參數來觀看該指令的幫助文件。例如,取得 dir 指令的幫助文件:

> dir /?

由於使用 help dirdir /? 所顯示的系統訊息雷同,故不重覆展示。

/? 參數不限於內建指令,只要是 DOS 風格的指令幾乎都可以使用此參數來取得幫助文件。例如,Intel C++ Compiler 是第三方所提供的命令列工具。在 Windows 版本的 Intel C++ Compiler 中,就刻意仿照 Visual C++,用 DOS 風格的命令列參數。取得 Intel C++ Compiler 的幫助文件的指令如下:

> icl /?

雖然在命令列環境下閱讀幫助文件不是很舒適,還是得學習並適應這個過程。網路和書籍中所列出的說明文件只是二手資料,命令列工具內建的幫助文件才是真正的一手資料。

使用命令列參數改變指令的行為

使用指令時,若未加任何參數,則該指令會以預設行為來動作。例如,不加參數輸入 dir,會以預設的格式顯示工作目錄的檔案和目錄:

> dir

加上 /w 參數,可以改變顯示的格式:

> dir /w

不同系統的指令的可用參數可能會相異,最準確的方式還是查詢內建文件。

Windows 的目錄結構

要使用命令列前,得先了解 Windows 的目錄結構,才能順利地使用指令來操作系統。

Windows 會以磁碟機 (disk) 來區分系統的分割區 (partition)。Windows 本身會存放在 C: 磁碟。若有第二個以上的分割區則會依序使用 D:E: 等磁碟。由於現在雲端硬碟 (cloud drive) 很發達,我們甚少需要將系統劃分成多個分割區。

至於 A:B: 磁碟則用於軟碟機 (floppy disk)。現在不會有人用軟碟機了,保留這兩個磁碟代號僅是因為歷史因素。

C: 磁碟會以目錄 (directory) 進一步劃分工作空間。以下是常用的目錄:

  • C:\Windows :Windows 系統所在的目錄
  • C:\Drivers :存放驅動程式的目錄
  • C:\Program Files :安裝 64 位元的第三方程式的目錄
  • C:\Program Files (x86) :在 64 位元系統上安裝 32 位元的第三方程式的目錄
  • C:\ProgramData :存放第三方程式和資料的目錄。不需系統管理者權限。預設為隱藏狀態
  • C:\Users :存放使用者的資料的目錄,可移動到其他磁碟機

系統使用者還可以視需求在 C: 磁碟的根目錄新增新的目錄。像是 MSYS2 系統預設安裝在 C:\msys2

基本的檔案和目錄管理

在本節中,我們介紹命令提示字元中和檔案及目錄管理相關的指令。這算是命令列環境中最基本的操作。

dir 觀看檔案和目錄

不添加參數時,dir 會以預設的格式在終端機上印出工作目錄的檔案和子目錄:

> dir

但工作目錄的檔案和目錄較多時,要上下捲動終端機的頁面比較麻煩。建議加上 /w 參數:

> dir /w

這時候 dir 會以橫式格式來展示工作目錄的檔案和子目錄。由於橫式格式所占空間較少,比較易於觀看。

cdchdir 移動工作目錄

不添加參數時,cd 會顯示目前的工作目錄:

> cd
C:\Users\user

加上目標目錄時,cd 會移動到目標目錄。如下例:

> cd to\target\path

除了一般的目錄外,Windows 有兩個特殊目錄。. 代表本層目錄,.. 代表上層目錄。以下例子移到兩層前:

> cd ..\..

chdircd 的同義指令,使用方式雷同。

mdmkdir 建立目錄

md 用來建立目錄。在預設情形下,延伸功能是開啟的,這時候可連續建立目錄。如下例:

> md path\to\project

這時候會一併建立 pathpath\topath\to\project 三層目錄。

延伸功能是可關閉的。請自行閱讀 cmd /? 的說明。

mkdirmd 的同義指令,使用方式雷同。

renrename 修改檔案名稱

ren 指令用來更動檔案名稱。參考以下例子:

> ren old.txt new.txt

要注意 ren 指令不能用來移動檔案。若要一併移動檔案,得改用 move,詳見後文。

renameren 的同義指令,使用方式雷同。

move 移動檔案或目錄

move 具有多型性,會根據當下的情境決定其行為。參考以下指令:

> move src dest
  • dest 不存在,則 move 會將 src 更名為 dest
  • dest 為目錄,則 move 會將 src 移動到 dest
  • dest 為檔案,則 move 會以 src 覆寫 dest
  • src 本身可為檔案或目錄

由於 move 可以涵蓋 ren 的功能,所以 ren 顯得有點累贅。

copy 複製檔案

copy 類似於 move,其行為具有多型性,會根據目標的型態來決定其行為。參考以下指令:

> copy path\to\src path\to\dest
  • dest 不存在,將 src 複製到 dest
  • dest 為目錄,將 src 複製到 dest
  • dest 為檔案,以 src 覆寫 dest ,會向使用者確認
  • src 本身是檔案

如果要複製資料夾的話,請用 xcopy,詳見下一節。

xcopy 複製檔案和目錄

xcopy 用來複製目錄。通常我們會想複製整個目錄內的東西,可參考以下指令:

> xcopy /S /E /Y /I path\to\src path\to\dest

這裡簡單說明一下各個參數的意義:

  • /S:複製每個目錄和子目錄,不包含空目錄
  • /E:複製每個目錄和子目錄,包含子目錄
  • /Y:覆寫檔案時不詢問使用者
  • /I:如果目的地不存在,且來源檔案有多個,認定目的地是目錄

整體的效果就是自動複製整個目錄到目的地。

delerase 刪除檔案

delerase 用來刪除單一檔案,使用方式如下:

> del path\to\file.txt

也可刪除特定資料夾下所有的檔案:

> del /q path\to\*

/q 是安靜模式,不會逐一詢問使用者。

若要刪除整個資料夾,建議使用 rd,詳見下一節。

rdrmdir 刪除目錄

rdrmdir 用來剛除資料夾。由於資料夾內通常不為空,會搭配相關參數:

> rd /s /q path\to\dir

搭配 /s (遞迴模式) 和 /q (安靜模式) 的話,就可以把整個資料夾一口氣刪除。

start 開啟特定檔案或目錄

start 用來開啟特定檔案、目錄、程式。這個指令好用的地方在於可以直接從命令列開啟圖形介面程式,可以少掉幾次滑鼠操作。

以下指令用來開啟檔案終管,並直接進入特定位置:

> start .

以下指令用來開啟 PDF 文件:

> start "" path\to\document.pdf

該指令會以系統預設的 PDF 文件閱讀軟體來開啟該 PDF 文件。所以先設置好 PDF 的預設軟體即可。

注意這時候參數中 "" 的部分不能省略,該參數用來表示 title。

在命令提示字元使用 PowerShell

雖然命令提示字元無法直接辨識 PoweShell 指令或腳本,可透過呼叫 powershell 指令來執行 PowerShell 指令或腳本。以下是使用 PowerShell 指令的虛擬指令:

> powershell -Command "..."

... 部分填入實際的 PowerShell 指令即可。PowerShell 指令的部分要用一對雙引號括起來,因為命令提示字元無法辨識 PowerShell 指令。實際在輸入 PowerShell 指令時是把該指令以字串的形式輸進命令提示字元中。

PowerShell 對於 Windows 程式設計者是重要的工具箱。由於命令提示字元相對缺乏原生的命令列工具,PowerShell 豐富的指令剛好可以補足這個缺點。雖然 PowerShell 指令比較長,但 PowerShell 指令可以預寫在 Batch 腳本中,所以這個議題不算真正的議題。

取得第三方命令列工具

命令提示字元內建的指令較少,需要用第三方工具來補足缺少的功能。由於 Windows 是設計給一般使用者 (end user) 使用的平台,不會預裝開發工具,程式設計者得自行安裝這些工具。

除了從各個命令列工具的官網取得該工具外,以下是可以取得多種命令列工具的軟體:

套件管理軟體不是 Windows 原生的軟體安裝方式,而是源自 Unix 文化。這些社群工具讓 Windows 命令列也有類似的功能。但套件管理軟體的套件也是要有開發者去維護,有時候套件的所提供的軟體的版本會比官方所提供的軟體版本滯後,安裝時要檢查一下。

繼續深入學習

微軟提供一份官方版本的指令參考手冊,適用於 Windows 8.1 之後的版本,會比內建的 help 指令提供更多的資訊,有線上版和 PDF 版,有需要的讀者可自行前往該網站。

關於作者

身為資訊領域碩士,位元詩人 (ByteBard) 認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

位元詩人喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,位元詩人將所學寫成文章,放在這個網站上和大家分享。