這次延續上次的腳本檔案,要說明如何執行 Windows PowerShell 腳本。
上次我們已經在「我的文件」中,建立了一個名稱為 today.ps1 腳本檔,卻在執行時,顯示如下的錯誤訊息:
之所以如此,是因為安全性的考量,在沒有更改過設定之前,是不允許執行 Windows PowerShell 的腳本檔。這就是所謂的**「執行原則」**。在預設狀態下,執行原則的設定值是 Restricted,也就是說你根本不能執行任何的 Windows PowerShell 腳本檔。
**「執行原則」**有下列 4 種:
Restricted :關閉腳本檔的執行功能,這是預設的設定值。
AllSigned :只允許執行受信任發行者簽署過的腳本檔。
RemoteSigned :在本機電腦所撰寫的腳本檔,不需要簽署就可執行;但是從網際網路(例如:email、MSN Messenger)下載的腳本檔就必須經過受信任發行者的簽署才能執行。
Unrestricted :任何腳本檔皆可被執行,但是於執行網際網路下載的腳本檔時,會先出現警告的提示視窗。
我們可以先利用 Get-ExecutionPolicy 來確認系統目前的指令檔執行限制為何:
Get-ExecutionPolicy
如果您在個人電腦上執行,為了方便實驗起見,可以把腳本檔的**「執行原則」**改成 Unrestricted。但要注意的是,這樣設定之後,請確認從網際網路所下載的腳本檔不會對年的電腦產生任何威脅,因為只要執行的權限夠,都有可能會執行危害系統的腳本檔。
如果是在上線的伺服器中,為了方便起見,建議把腳本檔的**「執行原則」**改成 RemoteSigned,這麼一來自己在本機建立的腳本檔於執行時,不會受到限制;但會限制來自網際網路的腳本檔。
以下面的指令來說,會把腳本檔的**「執行原則」**改為 Unrestricted:
Set-ExecutionPolicy Unrestricted
但是,為什麼執行上面的程式碼會出現如下的錯誤:
PS C:\Users\alexc\Documents> Set-ExecutionPolicy Unrestricted
執行原則變更
執行原則有助於防範您不信任的指令碼。如果變更執行原則,可能會使您接觸到
about_Execution_Policies 說明主題中所述的安全性風險。您要變更執行原則嗎?
[Y] 是(Y) [N] 否(N) [S] 暫停(S) [?] 說明 (預設值為 "Y"):
Set-ExecutionPolicy : 拒絕存取登錄機碼 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShel
l'。
位於 行:1 字元:20
+ Set-ExecutionPolicy <<<< Unrestricted
+ CategoryInfo : NotSpecified: (:) [Set-ExecutionPolicy], UnauthorizedAccessException
+ FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.SetExecutionPolicyComma
nd
PS C:\Users\alexc\Documents>
這是因為從 Windows Vista 之後所引進的使用者帳戶控制(UAC)作祟所造成的,誠如大家所熟知的,除非在執行程式時,明確地指定要以系統管理員身分執行,否則即便是帳戶是管理者,也會用標準的使用者身分來執行。因此欲解決上述的錯誤訊息,請由開始功能表中,在 Windows PowerShell 圖示上,按下滑鼠右鍵,選擇「以系統管理者身分執行」,接著執行 Set-ExecutionPolicy 去設定適當的**「執行原則」**即可。
Windows PowerShell 的腳本檔案之附檔名是 .ps1,假設我們要執行一個位於 C:\Users\alexc\Documents 目錄中,檔名為 today.ps1 腳本,可以直接在 Windows PowerShell 的命令列模式中,輸入如下的文字:
# 輸入完整的路徑與腳本的完整檔名
C:\Users\alexc\Documents\today.ps1
# 輸入完整的路徑與腳本的主檔名
C:\Users\alexc\Documents\today
如果目前所在的工作路徑剛好是 C:\Users\alexc\Documents,那就必須使用 1 個點(.)以及斜線(\)來提示目前的路徑:
# 使用腳本的完整檔名
.\today.ps1
# 使用腳本的主檔名
.\today