為什麼會出現 PowerShell 執行原則錯誤?
在使用 PowerShell 自動化管理系統時,執行 .ps1
指令碼是常見的需求。例如,執行 Hyper-V 虛擬機器備份的指令碼時,可能會遇到以下錯誤:
錯誤訊息
PS C:\Users\user> Hyper-V-Backup.ps1 Hyper-V-Backup.ps1 : 因為這個系統上已停用指令碼執行,所以無法載入 C:\Program Files\WindowsPowerShell\Scripts\Hyper-V-Ba ckup.ps1 檔案。如需詳細資訊,請參閱 about_Execution_Policies,網址為 https:/go.microsoft.com/fwlink/?LinkID=135170。 位於 線路:1 字元:1 + Hyper-V-Backup.ps1 + ~~~~~~~~~~~~~~~~~~ + CategoryInfo : SecurityError: (:) [], PSSecurityException + FullyQualifiedErrorId : UnauthorizedAccess
這是因為 PowerShell 的 執行原則(Execution Policy) 阻止了指令碼的執行。這項設定是為了防止惡意指令碼執行,但在安全的環境下,您可以根據需求進行調整。
什麼是 PowerShell 執行原則(Execution Policy)?
PowerShell 的執行原則是用來控制指令碼執行的安全機制,常見的設定如下:
- Restricted(預設):禁止執行任何指令碼。
- RemoteSigned:允許本地指令碼執行,但網路下載的指令碼需要簽章。
- Unrestricted:允許執行所有指令碼,但會提示安全警告。
解決方法:如何設定 PowerShell 執行原則
以下是三種解決方案,適合不同的情境需求:
方法 1:暫時繞過執行原則
這是最快捷的解決方案,適用於臨時執行一次指令碼的情況。
在 PowerShell 中執行:
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
這只對當前 PowerShell 視窗生效,關閉後執行原則會恢復。
執行您的指令碼:
.\Hyper-V-Backup.ps1
方法 2:永久修改執行原則
如果您需要經常執行指令碼,可以修改系統的執行原則。
- 以系統管理員身份開啟 PowerShell。
- 查看當前執行原則:powershell複製程式碼
Get-ExecutionPolicy
設置執行原則為 RemoteSigned
(推薦):
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine
確認修改是否成功:
Get-ExecutionPolicy
方法 3:僅針對某個指令碼繞過執行原則
如果您希望執行單一指令碼時不受執行原則限制,可以使用以下命令:
powershell -ExecutionPolicy Bypass -File "C:\Program Files\WindowsPowerShell\Scripts\Hyper-V-Backup.ps1"
安全性注意事項
- Restricted 是最安全的模式,但可能限制日常自動化操作。
- RemoteSigned 是推薦的選項,可允許執行本地指令碼並增加對未知指令碼的保護。
- Unrestricted 雖然方便,但應僅在完全信任的環境中使用。
請務必確保指令碼來源安全,以防止執行惡意程式碼。
常見問題解答
Q1:如何確認目前的執行原則?
執行以下命令:
Get-ExecutionPolicy
Q2:如何恢復為預設執行原則?
執行以下命令將執行原則設為 Restricted
:
Set-ExecutionPolicy -ExecutionPolicy Restricted -Scope LocalMachine
Q3:這些設定會影響其他使用者嗎?
執行原則的作用範圍可以是:
- Process:僅影響當前 PowerShell 視窗。
- CurrentUser:僅影響目前的使用者。
- LocalMachine:影響整台機器的所有使用者。
總結
當 PowerShell 報錯「系統已停用指令碼執行」時,問題通常與執行原則設定有關。您可以選擇暫時繞過、永久修改或針對特定指令碼繞過執行原則來解決問題。建議根據實際需求選擇合適的方法,同時注意執行指令碼的安全性。
《AWS CDK 完全學習手冊:打造雲端基礎架構程式碼 IaC》
第 12 屆 iT 邦幫忙鐵人賽 DevOps 組冠的《用 CDK 定 義 AWS 架構》
第 11 屆 iT 邦幫忙鐵人賽《LINE bot 好好玩 30 天玩轉 LINE API》
一個熱愛分享的雲端工程師!