PowerShellスクリプトが実行できない場合の対処法

こんにちは。
けいぞうです。

PowerShellのスクリプト(ps1)ファイルが何故か動いてくれないことが稀に良くあります。

その代表的な原因と対処方法を解説します。

[目次]

スクリプトの実行ポリシーが有効になっていない場合

ps1ファイルを実行すると以下のようなメッセージが出る場合は、スクリプトの実行ポリシーが有効になっていないと考えられます。

.\<ファイル名> : このシステムではスクリプトの実行が無効になっているため、ファイル <フルパス> を読み込むことができません。詳細については、「about_Execution_Policies」(http
s://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
.\<ファイル名>
~~
+ CategoryInfo : セキュリティ エラー: (: ) []、PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess

Windowsでは、ps1ファイルの実行が初期設定では無効になっています。ps1ファイルの実行を許すかどうかの設定を「実行ポリシー」と呼びます。

実行ポリシーの確認

実行ポリシーは、以下のコマンドレットを打てば確認できます。

Get-ExecutionPolicy

上記のエラーになった人は「Restricted」が返ってきたはずです。

実行ポリシーを変更する

細かい話は一旦抜きにして、以下の方法で実行ポリシーを変更して、ps1ファイルを実行できるようにすることができます。

PowerShellを管理者として起動します。

以下のコマンドを実行します。

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

確認メッセージが表示されるので「Y」を打ってEnter

これで実効ポリシーが変更されました。

試しにもう一度Getで実行ポリシーを確認してみてください。

「RemoteSigned」が返ってくればOKです。

この状態で、お目当てのps1ファイルを実行してみてください。実行できるようになっていると思います。

スクリプトがロックされている場合

実行ポリシーを「RemoteSigned」に設定すると

Web上からダウンロードされたスクリプトが、信頼された発行元によって署名されていることを要求する

という状態になります。

ダウンロードしてきたps1ファイルが信頼されていないと判断されて、スクリプトにロックがかかった状態になっていることがあり、それが原因でps1が実行できないことがあります。

ロックされているかどうかは、ps1ファイルを右クリックしてプロパティで確認することができます。

Webからダウンロードしてきたサンプルファイルなどはこのような状態になることが多いです。

この場合は、「許可する」にチェックを入れてOKを押せばロックを解除できます。

詳細説明

実効ポリシーを「RemoteSigned」に変更すれば実行できると説明しましたが、ポリシーは「RemoteSigned」以外にもあります。

ポリシー説明
Restricted
(既定値)
スクリプトは実行されない
AllSigned全てのスクリプトは発行元により署名されていることを要求する
RemoteSignedWeb上からダウンロードしてきたすべてのスクリプトは発行元により署名されていることを要求する
Unrestricted全てのスクリプトを実行する(ただし、確認を求められる)
Bypass確認なしで全てのスクリプトを実行する
Undefined現在のScopeから割り当てられている実行ポリシーを削除する

「Scope」という単語が出てきましたが、実は実行ポリシーはScope毎に割り当てられています。

Set-ExecutionPoricyコマンドでは、規定値で「LocalMachine」がScopeになっているので、このコンピュータ全体の実行ポリシーを変更したことになります。

Scope説明
Process現在実行中のプロセスのみが割り当て範囲となる
CurrentUser現在実行中のユーザーに対してのみが割り当て範囲となる
LocalMachineコンピュータ全てのユーザーに対してが割り当て範囲となる

例えば、以下のようにコマンドを実行すれば、一時的なポリシーの変更だけでps1ファイルを実行することができます。

Write-Host “Y” | Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process
.\<実行したいps1ファイル>

「Write-Host “Y”」を頭につけてパイプで繋げば、1行で確認メッセージに「Y:はい」を入力することができます。その後に実行したいps1ファイルを実行してあげればOKです。

こうすれば、このプロセスが破棄された後は、元の実行ポリシーに戻るので、違う環境で実行する可能性があるスクリプトを開発する場合はこの手法をオススメします。