tech.guitarrapc.cóm

C#, PowerShell, Unity, Cloud, Serverless Technical Update and Features

PowerGUI ScriptEditorでps1とdllをコンパイルして実行可能形式(.exe)にする

PowerGUIを使うと、ScriptEditorでps1をコンパイルすることが出来ます。 この時、Add-Typeなどで参照しているdllもexe内部に含めることも出来ます。 これにより、ps1のソースを触られたくない場合に隠したり、参照ファイルを纏めたりする事が出来ます。 更に通常なら、ps1を実行するときはスクリプトファイル実行をSet-ExecutionPolicyでレジストリで許可が必要です。 が、コンパイルしたexeなら中身はps1ですがGet-ExecutionPolicyがRestrictedでも実行可能です。 また、PowerShellではバックグラウンドで複数のコマンドを非同期に実行は出来ます。 が、複数のfunctionを非同期に実行ができない(?)のか、どうしても分かりませんでした。 しかし、Start-ProcessならcmdのStartのように非同期に実行します。 これによって、複数のexeを実行することができます。 とはいえ、コンパイルしてもps1が最適化されるわけではありませんので、実行速度があがったりはしません。 残念。

コンパイルしてみる

PowerGUIのScritpEditorを起動してツールバーのTools | Complie Scriptから実行します。 PowerGUI Compile

コンパイルオプション

コンパイル画面の説明です。 Conpilation欄
Executable name and path 生成するexeファイルのパスと名前を指定します。 Show PowerShell Console window when the script is executed 有効にするとexe実行時にPowerShell Console画面を表示します。 無効にすると表示しないため、Task ManagerのProcessからしか実行を確認できません。 また、仮にエラーが出ていても気づきませんので注意です。 Close PowerShell Console window after script execution 2を有効にしていないとチェックボックスを選べません。 このオプションを有効にしていると、exe実行後に自動的にPowerShell Consoleを閉じます。
Secutiry欄
Protect script source code with a password exe内部のSourceCodeを触ろうとしたときに、パスワードを聞いてくるようになります。
CompileOption また、コンパイル画面左下にあるDependenciesボタンで依存ファイルを一緒にコンパイルできます。
PowerShell file Browseで参照するps1を指定します。 また、参照するファイルタイプを「全て」にすれば、dllも参照に追加出来ます。 Addで、選択したファイルを参照に追加します。 Removeで、追加していた参照を除けます。
Compile_Dependency dllの追加例 Depencendy_dll 参照はaddで追加します。 dependency_add

コンパイル実行

必要な設定後にコンパイルを実行します。 この時、同一ファイル名が存在した場合は警告がでます。 samefile コンパイル後にフォルダを見てみると…この通りexeファイルが出来ています。 exe

ファイルを実行してみる

今回のサンプルは、次回の記事であるSmallBasicのdllを参照してMMLを鳴らすモノです。 実行すると、ファイル名のProcessが起動、PowerShellConsoleが起動して、スクリプト通り音楽が流れました。 また、exe実行からスクリプト実行まで時間差があるのはps1を実行した時と同様です。もはや…宿命でしょうか…。 PowerShellexe

コンパイルしたexeファイルはExecutionPolicyがRestrictedでも実行できる

これは喜ぶべき…何でしょうか。 さて、判断は人ソレぞれでしょうが配布には便利ですし、用途としては望ましいと思われます。 通常、ExecutionPolicyがRestricted(OSの初期状態)では、ps1は実行できません。 Compilefile しかし、コンパイルしたexeファイルならRestictedの状態でも内部にコンパイルされたps1を実行できます。

exeファイルの中身は

exeファイルを解凍ソフトで解凍できます。 extract 中身には、ps1と参照したファイルが同一パスに存在しています。 inside そのため、ps1でAdd-Typeなどで参照ファイルパスを記述するときは注意が必要です。 例えばこのようにする必要があります。
Add-Type -Path ".\SmallBasicLibrary.dll"
また、ps1を閲覧する事もできます。 コンパイル時にパスワードを設定している場合、この際にパスワードを聞かれます。

まとめ

PowerGUIでコンパイルする事で、ps1を実行可能ファイル形式(exe)として配布でき利用者には使いやすくなります。 一方で、ps1のセキュリティが無効になる面も忘れないようにする必要があります。