解決 PowerShell 指令碼無法執行的問題:Hyper-V Backup 範例教學與執行原則設定指南

為什麼會出現 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:永久修改執行原則

如果您需要經常執行指令碼,可以修改系統的執行原則。

  1. 以系統管理員身份開啟 PowerShell。
  2. 查看當前執行原則: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 報錯「系統已停用指令碼執行」時,問題通常與執行原則設定有關。您可以選擇暫時繞過、永久修改或針對特定指令碼繞過執行原則來解決問題。建議根據實際需求選擇合適的方法,同時注意執行指令碼的安全性。