前言

這篇文章是我在學習 PowerShell 時整理的筆記,主要解答兩個最常見的新手問題:

[!NOTE] 關於本文的寫作方式 本文由 ( 我 ) 提供點子與架構,並由 AI 協助撰寫完成。我很誠實地告訴你吧!

  1. Windows 內建的 PowerShell 要怎麼更新?
  2. 有哪些常用指令我需要知道?

如果你跟我一樣剛開始學習 PowerShell,這篇文章會是很好的起點。


目錄


版本篇:5.1 vs 7.x 大對決

簡單來說:Windows 內建的那隻藍色的,基本上已經「停止進化」了。

不管是 Windows 10 還是 Windows 11,預設內建的都是 Windows PowerShell 5.1。微軟為了系統相容性(怕舊的 script 壞掉),不敢隨便動它。如果你想要強大的新功能,你必須自己「安裝」新版的 PowerShell 7(現在改名叫 PowerShell,沒有 Windows 字樣了,Logo 也是黑色的)。


⚔️ PowerShell 版本比較表

特性 Windows PowerShell (舊版/內建) PowerShell (新版/需安裝)
版本號 5.1 (萬年不變) 7.4 / 7.5 (持續更新)
核心架構 .NET Framework 4.x (舊技術) .NET 8 / 9 (新技術,效能狂飆)
作業系統 只限 Windows Windows, Linux, macOS 通吃
圖示顏色 🟦 藍色 ⬛ 黑色 (帥氣多了)
定位 系統維護、向後相容 (Legacy) 開發者工具、雲端自動化 (Modern)
更新方式 跟隨 Windows Update (幾乎只修 Bug) 手動下載或用指令更新

🧐 Win 10 跟 Win 11 有差嗎?

完全沒差。

它們內建的都是 5.1 版。所以你買了新電腦,打開 PowerShell 如果看到藍色的視窗,恭喜你,你正在駕駛一輛骨董車。雖然它還能跑,但很多新語法(比如三元運算子 ? :||)它是看不懂的。



這個視覺化作品採用了「無框架技術時光流逝(Frameless Tech-Lapse)」的設計理念: 五層展廳結構 (從下到上):

底層 - Windows 獨佔時代 (PowerShell 5.1, 2016) 第二層 - 開源革命 (PowerShell Core 6.0, 2016-2018) 第三層 - 跨平台成熟期 (PowerShell 7.0, 2018-2020) 第四層 - 性能與創新 (PowerShell 7.1-7.3, 2020-2023) 頂層 - 現代與未來 (PowerShell 7.4-7.5, 2024-2026)

PowerShell 版本演進




安裝篇:如何更新到 PowerShell 7

我們不要去微軟網站點下載按鈕了,那不夠帥。既然你在學指令,我們就用微軟現在最強推的套件管理工具 Winget 來處理。


第一步:檢查你現在的版本

請在你的 PowerShell 視窗輸入以下指令(這是檢查環境變數的標準做法):

$PSVersionTable.PSVersion

如果出來是 Major: 5, Minor: 1,那就是舊版。


第二步:安裝/更新到最新的 PowerShell 7

我們使用 winget 指令,它可以幫你從微軟官方儲存庫抓最新版並安裝。請直接輸入:

winget install Microsoft.PowerShell

這個指令會發生什麼事?

  1. 它會去抓最新的穩定版 (Stable)。
  2. 安裝後,你的電腦裡會有兩個 PowerShell:
    • 原本的藍色 (Windows PowerShell) → 繼續留著保平安。
    • 新的黑色 (PowerShell 7) → 以後開發、練習都開這個。

[!TIP] Side-by-Side 部署 這在軟體架構上稱為並行部署。微軟為了符合 SOLID 原則中的「開閉原則 (Open/Closed Principle)」——對擴充開放,對修改封閉,所以不直接覆蓋舊版 5.1,而是讓你安裝全新的 7.x 版,這樣既不會把舊系統搞壞,又能讓你享受新效能。


設定篇:在 Antigravity 與 VS Code 強制啟用 PowerShell 7

身為一名追求極致效能的開發者,最令人煩躁的莫過於剛裝好嶄新的 IDE —— 像是 Google 最新推出的 Antigravity 或是經典的 VS Code,打開 Terminal 卻發現迎面而來的還是那個充滿「古早味」、基於 .NET Framework 4.8 的 Windows PowerShell (v5.1)。

明明我們已經安裝了跨平台、基於 .NET 8/9 的 PowerShell 7 (Core),為什麼編輯器總是視而不見?

這涉及到 Windows 的環境變數優先順序以及編輯器的預設行為。Antigravity 雖然是 Google 的黑科技,但它的介面設定邏輯與 VS Code 系出同源。大多數編輯器採用「慣例優於設定」(Convention over Configuration) 的原則,預設會抓取系統路徑中最穩定的 powershell.exe (Legacy)。要打破這個慣例,我們必須在設定檔中明確注入依賴,強制指定執行路徑。


實作步驟:修改 settings.json

我強烈建議直接操作 settings.json,這符合 Infrastructure as Code (IaC) 的精神——將環境設定程式碼化。

1. 開啟設定檔

Antigravity (或 VS Code) 中,按下 Ctrl + Shift + P 開啟命令面板,輸入 Open Settings (JSON)

2. 注入設定程式碼

請在 JSON 物件中加入以下配置。這段程式碼做了兩件事:

  1. 定義 Profile: 明確宣告一個名為 "PowerShell 7" 的設定檔,並指定其絕對路徑。
  2. 設定預設值: 將編輯器的預設 Terminal 指向這個新定義的 Profile。
{
    "terminal.integrated.profiles.windows": {
        // [關鍵手段] 這裡我們故意用 "Windows PowerShell" 這個名字
        // 這樣當 Agent 或任何舊插件試圖呼叫預設名稱時,實際上會被導向 v7
        "Windows PowerShell": {
            "path": "C:\\Program Files\\PowerShell\\7\\pwsh.exe",
            "icon": "terminal-powershell",
            "args": [
                "-NoLogo"
            ]
        },
        // 為了以防萬一你需要真的舊版,我們幫舊版取個新名字備用
        "Legacy PowerShell 5": {
            "path": "C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
            "icon": "terminal-powershell"
        }
    },
    // 將所有預設入口都指向這個被我們「魔改」過的設定檔
    "terminal.integrated.defaultProfile.windows": "Windows PowerShell",
    // 連自動化設定也指過去
    "terminal.integrated.automationProfile.windows": {
        "path": "C:\\Program Files\\PowerShell\\7\\pwsh.exe",
        "args": [
            "-NoLogo"
        ]
    },
}

3. 進階觀念:為什麼需要 automationProfile

你可能會問:「我不是已經改了 defaultProfile 嗎?為什麼 AI Agent 還是笨笨的?」

這在軟體架構中屬於 關注點分離 (Separation of Concerns) 的細節:

  • Interactive Shell (互動式):這是給你用的,講究使用者體驗 (例如載入你的主題、歷史紀錄)。
  • Automation Shell (自動化):這是給程式 (如 AI Agent、Task Runner) 用的。為了相容性,編輯器預設常會死守最舊的 powershell.exe

所以,如果你希望 Antigravity 的 AI 助手能用 PowerShell 7 的強大語法幫你寫 script,你就必須明確設定 automationProfile

[!CAUTION] 設定完必須「完全重啟」 改完 automationProfile 後,單純關閉 Terminal 是不夠的。因為 AI Agent 的執行緒 (Process) 通常在 IDE 啟動時就載入了。請務必完全關閉並重新開啟 Antigravity 或 VS Code,讓它重新抓取新的 PowerShell 7 路徑,這樣你的 AI 助手才會變聰明喔!


4. 實戰驗證:AI Agent 的升級之路

這不是開玩笑,協助我撰寫這篇文章的 AI 助手本身就經歷了這個過程。

  1. 第一階段:我們只改了 defaultProfile,結果 AI 回報它還是在用 PowerShell 5.1。
  2. 第二階段:我們補上了 automationProfile,但尚未重啟,AI 回報版本依然是 5.1。
  3. 第三階段:我們完全關閉並重啟了 IDE,AI 終於興奮地回報:「Name: PSVersion, Value: 7.5.4」。

這證明了 automationProfile 是真的有效,且「重啟生效」是絕對的鐵律。現在,我的 AI 助手已經運行在最新的核心上了!


語法篇:PowerShell 7 的新玩具

既然升級到了 PowerShell 7,當然要來體驗一點 5.1 做不到的事情。以下是幾個最實用的新語法,讓你的腳本寫起來更像現代程式語言:

1️⃣ 三元運算子 (Ternary Operator)

寫過 C# 或 JavaScript 的人一定不陌生,以前在 5.1 我們要寫冗長的 if...else,現在一行搞定。

# 語法:<條件> ? <True時的值> : <False時的值>

$score = 85
$result = ($score -ge 60) ? "及格" : "不及格"
Write-Host $result  # 輸出: 及格

2️⃣ 管線鏈結算子 (Pipeline Chain Operators)

這在 Linux Bash 中很常見,現在 PowerShell 也有了!它用來控制指令執行的「相依性」。

  • && (AND):左邊成功 (Success),右邊才會執行。
  • || (OR):左邊失敗 (Failure),右邊才會執行。
# 範例:先切換目錄,如果成功,就列出檔案
Set-Location "C:\MyProject" && Get-ChildItem

# 範例:嘗試連線伺服器,如果失敗,就發出警告
Test-Connection "192.168.1.1" -Count 1 || Write-Warning "伺服器掛了!"

3️⃣ 空值合併算子 (Null Coalescing Operator)

用來處理變數是 $null 的情況,給它一個預設值。

# 語法:<變數> ?? <預設值>

$myConfig = $null
$finalConfig = $myConfig ?? "DefaultSettings"
Write-Host $finalConfig  # 輸出: DefaultSettings

這些現代語法能讓你的腳本更簡潔、邏輯更清晰。如果你把這些寫在舊版 5.1 裡,它會直接報錯給你看,這也是為什麼我們一定要升級環境的原因!


3. 關鍵細節解析

  • 路徑跳脫 (Escaping): 許多開發者會直接複製檔案總管的路徑 C:\Program Files\...,這在 JSON 中會導致語法錯誤。必須寫成 C:\\Program Files\\...
  • Foreign Key 關聯: defaultProfile.windows 的值字串,必須與 profiles.windows 中的 Key 完全一致(本例為 "PowerShell 7")。

驗收成果

存檔後,關閉目前的 Terminal 並重新開啟一個新的 (快捷鍵 Ctrl + )。輸入 $PSVersionTable` 進行驗證。

若看到 PSEdition 顯示為 Core,且 PSVersion7.x.x,恭喜你!你的開發環境已經成功脫離了舊時代的束縛。


指令篇:新手生存必備指令表

PowerShell 為了照顧從 Linux (Bash) 或 舊版 Windows (CMD) 轉過來的使用者,內建了很多「別名」(Alias)。你打的 ls 其實不是真的 ls,它背後的真名叫做 Get-ChildItem。PowerShell 的邏輯是「動詞-名詞」(Verb-Noun),雖然字多了點,但語意非常清楚。

你需要清空畫面的指令叫做 cls (來自 CMD) 或 clear (來自 Linux),它們的本尊是 Clear-Host


📁 檔案與目錄操作 (生存基礎)

常用縮寫 (Alias) 完整指令 (Cmdlet) 功能說明 備註
cls, clear Clear-Host 清除畫面 把雜亂的視窗清乾淨。
ls, dir Get-ChildItem 列出檔案與資料夾 用來看看這裡有什麼。
cd, chdir Set-Location 切換目錄 (資料夾) 用來「瞬移」位置。
pwd Get-Location 顯示目前位置 迷路時用,告訴你現在在哪個路徑下。
mkdir, md New-Item -Type Directory 建立新資料夾 創造屬於你的新天地。
cp, copy Copy-Item 複製檔案或資料夾 Ctrl+C / Ctrl+V 的指令版。
mv, move Move-Item 移動或重新命名 把檔案搬家,或是幫它改名。
rm, del, erase Remove-Item 刪除檔案或資料夾 ⚠️ 危險指令,刪了通常就不進資源回收桶囉,請小心使用!
cat, type Get-Content 查看檔案內容 直接在終端機把文字檔內容吐出來給你看。
ni, touch(非內建) New-Item 建立新檔案 例如 ni test.txt 可以建一個空檔。

⚙️ 系統與程序 (進階一點點)

常用縮寫 (Alias) 完整指令 (Cmdlet) 功能說明 備註
ps Get-Process 列出執行中的程序 看看電腦現在在忙什麼 (類似工作管理員)。
kill Stop-Process 停止程序 強制關閉某個卡死的程式 (Process ID)。
echo, write Write-Output 輸出文字到螢幕 通常用來顯示訊息或測試變數。
man, help Get-Help 查詢說明書 這是最強指令!忘記怎麼用時,打 help ls 它就會教你。
h, history Get-History 顯示歷史指令 忘記剛剛打了什麼神操作?用這查。

排版篇:管線與格式化輸出

預設的 PowerShell 輸出有時候真的像一碗大雜燴,資訊多到讓人不想看。要學會排版,你必須先學會 PowerShell 的靈魂——管線 (Pipeline),也就是那個直線符號 | (通常在鍵盤 Enter 鍵上方)。

它的概念是:把左邊指令的「產出」,丟給右邊指令去「處理」。 就像工廠流水線一樣,前面的負責生產資料,後面的負責包裝漂亮。


1️⃣ 整理成 Excel 表格風:Format-Table (縮寫 ft)

這是最常用的。當資料欄位不多,想要一目了然時使用。

ls | ft -AutoSize

-AutoSize 會自動調整欄寬,不會留一大堆空白,這招很實用!


2️⃣ 手機版詳細清單風:Format-List (縮寫 fl)

當一個物件的屬性超級多(例如一個 Process 有幾十種資訊),表格會被擠爆,這時候就要用 List 模式,它會把每一筆資料變成一張「卡片」。

ls | fl

你會看到檔案的詳細資訊,包括建立時間、最後寫入時間等,變成直式列表。查錯誤訊息或詳細設定時必用。


3️⃣ 只看我想要的:Select-Object (縮寫 select)

這不是排版,這是「過濾」。就像 SQL 的 SELECT 語法。很多時候畫面亂是因為雜訊太多,我們先把雜訊砍掉,畫面就乾淨了。

ls | select Name, Length

4️⃣ 幫我排順序:Sort-Object (縮寫 sort)

亂七八糟的資料怎麼看?當然要排序!

ls | sort Length              # 由小排到大
ls | sort Length -Descending  # 由大排到小

🎩 組合技示範:找出前 5 大檔案

軟體開發有個原則叫 Chain of Responsibility (責任鏈模式),PowerShell 的管線就是這個概念。我們來把它們串起來:

ls | sort Length -Descending | select Name, Length -First 5 | ft -AutoSize

白話文翻譯:

  1. ls (列出檔案) → 丟給下一棒
  2. sort (依照長度由大排到小) → 丟給下一棒
  3. select (只取 Name 和 Length 欄位,且只拿前 5 筆) → 丟給下一棒
  4. ft (用表格自動調整寬度顯示出來)

💎 隱藏版神器:Out-GridView (縮寫 ogv)

如果你覺得打指令排版還是太累,微軟留了一手給 Windows 用戶。這個指令會彈出一個視窗化的表格,你可以直接用滑鼠點選排序、搜尋!

ps | ogv

試試看!它會把所有執行中的程式跳出一個視窗給你看,超級方便。


[!WARNING] 專業工程師的注意事項 在使用 Format-TableFormat-List 時,請務必記住:Presentation Layer (表現層) 永遠要在最後面

這兩個指令會把原本好用的「資料物件 (Data Object)」轉變成「格式化物件 (Format Object)」。

  • 錯誤示範: ls | ft | sort Length (先變成表格圖形,再排序長度,這時候它已經認不得什麼是長度了)
  • 正確觀念: 先做完所有運算 (排序、過濾),最後一步才做排版

觀念篇:PowerShell 的設計哲學

PowerShell 的設計哲學是基於 物件 (Object) 的,這點跟 Linux 的純文字流 (Text Stream) 很不一樣。

舉例來說,當你執行 ls (即 Get-ChildItem) 時,它回傳的不是一堆文字,而是一堆「檔案物件」。

  • 這意味著你可以對這些物件做「屬性存取」。
  • 例如:ls | Select-Object Name, Length (只列出檔名和大小)。

[!TIP] 給新手的忠告 千萬不要死記硬背!善用 Tab 鍵。在 PowerShell 裡打指令打到一半,按一下 Tab,它會自動幫你把指令或檔名補齊 (Auto-completion)。這才是工程師看起來打字很快的秘密。😏


  • first edition time: 2026-02-06
這是一份還在成長中的文章,會持續更新,歡迎訂閱追蹤我的部落格獲取最新資訊!