在我目前這台 Windows 10 電腦中,有兩個 Windows PowerShell 捷徑,分別是 Windows PowerShell 與 Windows PowerShell (x86) 這兩個,從捷徑名稱很容易看得出其差異,Windows PowerShell 這個是在 64 位元環境下使用的 PowerShell,可以載入 64 位元的各式 PSModules 或 PSSnapin 到執行環境中。而 Windows PowerShell (x86) 則是在 32 位元的 x86 架構下使用的 PowerShell,可以載入那些只支援 x86 架構的 PSModules 或 PSSnapin 到執行環境中。不過今天在我的電腦,又再次發生 Windows PowerShell (x86) 視窗開啟後,任何 Cmdlet 都無法執行的窘境,這個問題我在 4 個月前曾經遇過一次,當時花了我一個多小時才找到解法。但今天又花了我將近一個小時找出問題並修復他,真是太浪費時間了,因此我決心寫一篇文章,記錄這個詭異的靈異現象與更詭異的解決方法 (至今尚未能理解這個問題發生的原因)。
我們先來看看執行 Windows PowerShell (x86) 之後無法執行任何 Cmdlet 命令的畫面:
基本上,所有 PowerShell 內建的 Cmdlet 全部都消失了,完全無法執行。
每次遇到這種非常非常基本執行的問題,最困難的地方就是如何到 Google 輸入正確的關鍵字,經常就是一直查都查不到相關解答,因為這個問題太基礎了,連 dir 或 cd 這麼簡單的 alias 都無法執行,真的很難描述問題。
後來我用 Get-Module -All 搜尋所有的模組,發現在 Windows PowerShell (x86) 底下只有兩個模組可用:
而在 Windows PowerShell 底下卻有更多模組可用,原本預設該載入的內建模組都有正常載入:
發生問題的原因不明,尚待釐清!
目前只知道我所使用的好幾台電腦中,出現這個問題的機率非常低,上次遇到相同問題是在 4 個月前,今天遇到第 2 次,只是每次都花我不少時間解決,覺得很煩。
照理說,Windows PowerShell 會預設會從 C:\Windows\system32\WindowsPowerShell\v1.0\Modules 目錄下載入模組,而其他的模組會參考 $env:PSModulePath 環境變數的定義,依序載入個別目錄下的模組。如果你想得知目前你的環境變數下有多少預設載入的模組路徑,可以輸入以下命令:$env:PSModulePath -split ';'
解決方案
只要在無法執行任意 Cmdlet 的視窗中,輸入以下命令,問題就會自動修復:
$env:PSModulePath = $env:PSModulePath + ";C:\Windows\system32\WindowsPowerShell\v1.0\Modules\"
其實上述這段命令,只是將目前執行環境下的 PSModulePath 額外加上一個路徑而已,照理說重開 Windows PowerShell (x86) 視窗後,問題應該就會存在才對。但是,問題就真的這樣消失了,這個 $env:PSModulePath 環境變數依然沒有定義 C:\Windows\system32\WindowsPowerShell\v1.0\Modules\ 這個路徑,但是…
問題消失了!
問題消失了!
問題消失了!
為什麼啊啊啊啊啊啊啊啊? (抓頭)
如果你照著上述步驟還是無法修復問題,建議你直接去修改系統環境變數 PSModulePath 這一個,並且把 C:\Windows\system32\WindowsPowerShell\v1.0\Modules\ 這個路徑加入到清單中,問題應該也可以順利解決。
相關連結