PowerShell Scriptを実行する方法忘備(管理者権限不要)
Introduction
ちょっと自分の作業を省力化したいときや、システム間のつなぎ部分であと1歩足りていない部分を補う際に、よくWindows batを使ってちょっとした処理を書く私ですが。。。最近bat特有の書き方・これまで経験してきたプログラミング言語とのお作法の違いにフラストレーションがたまり始め、別アプローチとしてPowerShellでスクリプトを書いてみました。
書いた後、意気揚々と実行しようとしたところ「PowerShellでこのシステムではスクリプトの実行が無効になっているため、ファイル xxx.ps1 を読み込むことができません。」と赤字で怒られてしまいました。
そういえば、PowerShellは直接実行できないようなセキュリティの設定がデフォルトでしたね。ということで対処法を調べます。
対応方法
最近、前置きが長くなりがちなので先に結論を。PowerShellをキックするbatを作りました。PowerShellを実行する際にオプションを指定することで上記事象を回避できますが、毎回オプションを書くのが面倒→batで省力化しましょ。
ExecPS.bat
@echo off
rem ------------------------------------------------
rem PowerShellスクリプト実行bat
rem 引数:psスクリプトのフルパス psスクリプトの引数
rem リターンCD:psスクリプトのリターンCD
rem ------------------------------------------------
set ARGS=%*
PowerShell -ExecutionPolicy RemoteSigned -File %ARGS%
exit /b %errorlevel%
実行時は、このbatの引数にPowerShellスクリプトファイルのパスと、PowerShellスクリプトの引数を渡して実行するだけ。
ExecPS.bat <PowerShellスクリプトファイルパス> <PowerShellスクリプトの引数>
例えばこんなPowerShellスクリプトを用意して、
Hello.ps1
Write-Host "Hello PowerShell Script!"
$p1 = $Args[0]
$p2 = $Args[1]
Write-Host("引数1:" + $p1)
Write-Host("引数2:" + $p2)
Exit 0
こう実行してあげると
ExecPS.bat Hello.ps1 12345 67890
Hello.ps1の処理が実行されて、結果が得られます。
Hello PowerShell Script!
引数1:12345
引数2:67890
この手順を実施する際、管理者権限は不要。
解説
先に述べた通り、PowerShellは初期状態ではスクリプトファイルから実行できないようなポリシー設定がかけられています。 ExecutionPolicyと呼ばれるもので、初期はファイルからの実行をすべて制限するRestricted
が指定されています。
このポリシーは実行都度オプションによって指定を変更することができるため、このbatでは、 -ExecutionPolicy RemoteSigned
とすることで、一時的に(この処理実行時のみ)ExecutionPolicyをRemoteSigned
としています。これにより自身が作成したローカル上のスクリプトを実行できるようになるという仕組み。
ExecutionPolicy自体を恒久的に変更してしまえば、都度この方法をとる必要はなくなりますが、恒久的な変更には管理者権限が必要になります。自分の個人PCであればやっちゃいますが、会社PCや共用PCだとちょっと気が引けますよね。そんなときはこのbat経由の方法が簡単かつ手間が少ないかと思います。
参考文献
Comments