PowerShellを実行すると「このシステムではスクリプトの実行が無効になっているため、ファイル XXX.ps1 を読み込むことができません。」エラーが出ることがあります。
今回はその回避方法を見ていこうと思います。
現象の再現
コマンドからソースコードを実行すると下記の通りエラーが発生します。
ソースコード
下記のコマンドでソースコード「writeOutput.ps1」を実行します。
- コマンド
powershell -File "writeOutput.ps1"
- ファイル名:writeOutput.ps1
# 文字列出力
Write-Output "Hello,World!"
実行結果
PS C:\temp> powershell -File "writeOutput.ps1"
このシステムではスクリプトの実行が無効になっているため、ファイル C:\temp\writeOutput.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
+ CategoryInfo : セキュリティ エラー: (: ) []、ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnauthorizedAccess
原因
今回エラーになった原因は、PowerShellの実行ポリシーが「Restricted」となっているからです。
自分のマシンの実行ポリシー設定がRestrictedか検証したい場合は、下記のコマンドを入力すれば確認できます。
Get-ExecutionPolicy
また、上記のコマンドの実行例は下記のとおりとなります。
実行時に設定できるポリシーの代表的な値は下記のとおりです。
設定値 | 説明 |
---|---|
Restricted | 個々のコマンドを許可しますが、スクリプトは許可しません。 |
AllSigned | スクリプトを実行できます。ローカル コンピューター上に記述するスクリプトを含め、すべてのスクリプトと構成ファイルが信頼された発行元によって署名されている必要があります。 |
RemoteSigned | スクリプトを実行できます。ローカル コンピューターに書き込まれ、インターネットからダウンロードされないスクリプトではデジタル署名は必要ありません。 |
Unrestricted | 署名されていないスクリプトを実行できます。 悪意のあるスクリプトを実行するリスクがあります。 |
Bypass、Defaultなどもありますが、詳細は公式ページにあるのでここでは省略します。
解決方法
では実行ポリシーをどのように指定してPowerShellを実行すればよいでしょうか。
具体的には大きく2つありますが、下記の方法で「Restricted」以外のポリシーを変更すればよいです。
PowerShellコマンドにExecutionPolicy パラメータの追加
1つ目の方法としては、PowerShellコマンドに-ExcecutionPolicyを付加することで、実行時のみ一時的にポリシーを変更させます。
powershell -ExecutionPolicy RemoteSigned -File "writeOutput.ps1"
試しに冒頭で示したwriteOutput.ps1に対して、このコマンドを叩くと*.ps1ファイルの実行が確認できます。
Set-ExecutionPolicyによるポリシー変更
2つ目の方法はSet-ExecutionPolicyによって、あらかじめポリシー変更してしまうことです。
Set-ExecutionPolicy RemoteSigned
ただし、これをやると恒久的変更になってしまいます。
ポリシーの戻し忘れが発生したり、人に配布する際に相手のマシンの実行ポリシーを変更させるためお勧めできません。
一時的に変更する場合は下記のコマンドで、現在のプロセスのみポリシー変更するのがよいでしょう。
Set-ExecutionPolicy RemoteSigned -Scope Process
こちらも実際に実行してみました。
警告は出ますが、冒頭で示したwriteOutput.ps1が実行できていることが確認できます。
また、一度ウィンドウを閉じるとプロセスが終了します。
再度Get-ExecutionPolicyを実行すると、ポリシーが元に戻っていることも確認できました。
以上です。