這是一張有關標題為 加快 PowerShell 設定載入速度的方法 的圖片

加快 PowerShell 設定載入速度的方法

檢查防毒軟體設定,告別長時間載入設定檔,加快開發效率。

前言

安裝 PowerShell 後,我們常常會額外安裝一些擴充功能,例如:

  1. PSFzf:提供模糊搜尋。
  2. zoxide:快速導航檔案系統。
  3. posh-git:提供 Git 命令提示和自動完成。
  4. Oh My Posh:強化 PowerShell 提示樣式。
  5. 等…

這些外掛程式可以按照各自的安裝方式整合到 PowerShell。

然而,最終可能會導致載入變慢的問題,每次開啟 PowerShell 都需要很長時間載入。

載入時間花了約 2 秒左右

本篇文章將說明並記錄我的解決過程。

確定問題

首先在 PowerShell 中,輸入以下命令以編輯 PowerShell 的使用者設定檔(Profile):

1
2
# 沒有安裝 VS Code,請使用 notepad。
code $PROFILE

可以看到目前的安裝配置如下,分別載入 PSFzf 與 zoxide 兩個模組。

1
2
3
4
5
6
Set-PsFzfOption -PSReadlineChordProvider 'Ctrl+t' -PSReadlineChordReverseHistory 'Ctrl+r'
Set-PSReadLineKeyHandler -Key Tab -ScriptBlock { Invoke-FzfTabCompletion }

Invoke-Expression (& { (zoxide init powershell | Out-String) })

function grep { $input | out-string -stream | select-string $args }

當開啟 PowerShell,可以看到載入時間約 2000 毫秒。透過 pwsh --noProfile,暫時忽略 Profile 檔案的載入,以評估是不是因載入所導致的問題。

1
2
3
4
5
PowerShell 7.4.3
Loading personal and system profiles took 2074ms.

PS C:\Users\Wells> pwsh --noProfile
PS C:\Users\Wells>

會發現載入的時間變快了。表示由於載入配置檔所導致。

參考 PowerShell 官方的 Issue,會發現有人也有類似情況發生,其中關閉防毒軟體後,載入速度就正常了。

防毒軟體的影響

我使用的防毒軟體為 Bitdefender,它提供了 掃描惡意指令碼(Scan scripts) 的功能。關閉這個功能後,載入速度恢復正常。在此,我關閉了 Bitdefender 的防禦功能(Bitdefender Shield)進行測試,會發現關閉後載入速度也有所改善。

解決方法

我們可以將信任的腳本位置加入至例外清單。首先,使用 Everything 工具進行關鍵字搜尋(如 psfzf 或 zoxide),可以找到以下路徑:

1
2
c:\users\<user>\documents\powershell\modules
c:\users\<user>\appdata\local\microsoft\winget\packages\ajeetdsouza.zoxide_microsoft.winget.source_8wekyb3d8bbwe

將這些路徑加入 Bitdefender 的例外清單後,每次開啟新的 PowerShell 視窗,載入速度應在 500 毫秒以內。

將 PowerShell 模組路徑加入排除清單

然而,像 posh-git 這類模組,即便關閉防毒軟體,本身載入速度就很慢。因此,即使將其加入防毒軟體的例外清單,也無法改善載入讀取速度。

參考文獻

  1. Loading personal and system profiles took so very long · PowerShell/PowerShell
主題 Stack 由 Jimmy 設計