PowerShellスクリプトはさまざまな方法で呼び出すことができますが、すべてに共通の欠点があります。それは、通常のWindowsプログラム(EXE)のように簡単に実行することはできないということです。おそらく、スクリプトのコードを編集できないようにしたいのか、ユーザーがスクリプトを簡単に実行できるようにしたいのかもしれません。PS1をEXEに変換する方法を学びましょう。
このチュートリアルでは、PS1からEXEへの変換ツールを使用する方法を学び、それらを比較して自分の好みに最適なものを選ぶことができます。
必要条件
このチュートリアルでは、ステップバイステップの手順でPS1をEXEに変換する方法を説明するため、いくつかのツールが示されます。以下の要件をすべて満たしていることを確認してください。
- A Windows computer with an administrator privileges
- Windows 7、8.1、および10では、オペレーティングシステムのインストール時にPowerShellがすでに含まれています。一部のスクリプトはPowerShell 3.0で実行できますが、PowerShell 5.1またはPowerShell 7を使用する方がはるかに良いです。
- PowerShellの実行ポリシーがスクリプトの実行を許可するように設定されていること
PS2EXE
PS2EXEユーティリティは、最初にリストにあるツールです。PS2EXEは、作者Ingo Karsteinによると、「PowerShellスクリプトを別の言語に変換しない。C#で書かれた軽量なPowerShellホストでスクリプトをカプセル化し、動的に生成されたC#のソースコードをメモリにコンパイルしてEXEファイルにします。」とのことです。
PS2EXEの始まりについては、Ingo Karsteinのブログを参照してください。このモジュールの開発は2017年頃に停止しましたが、Markus ScholtesがPS2EXEの進化を担当し、GUIバージョンも作成しました。
PS2EXEモジュールのインストール
PS2EXEはPowerShellスクリプトとして始まり、Markus Scholtesが開発を引き継いだ際にモジュールが利用可能になりました。スクリプトを実行可能ファイルに変換するために、PowerShellギャラリーからモジュールをインストールする必要があります。
以下の手順に従って、PS2EXEモジュールをインストールしてください。
- 管理者としてPowerShellコンソールを開きます。
2. Install-Module
コマンドを実行して、PowerShell Galleryからモジュールをダウンロードしてインストールします。
3. プロンプトに信頼できないリポジトリについての表示がある場合は、Yと入力してEnterキーを押します。心配しないでください。このメッセージは無害です。
コマンドラインを使用してPS1をEXEに変換する
PS2EXEには、PowerShellスクリプトをEXEに変換する2つの方法があります。コマンドラインとGUIの使用方法についてまず説明しましょう。
単一のPowerShellスクリプトをコマンドラインを使用してEXEに変換するには、単一の行でメインのPS2EXEコマンド(Invoke-PS2EXE
)を指定し、変換するスクリプトのパスと作成するEXEのパスを指定します。
target.exeを実行すると、source.ps1スクリプトで定義されたコードが実行されます。スクリプトを変換する際にNoConsole
パラメータを使用しなかった場合、target.exeファイルを実行するとPowerShellコンソールが表示されます。
コンソールを非表示にする
前の例では、target.exeを実行すると、通常のPowerShellコンソールが表示されます。ほとんどの場合、これは望ましくありません。それを防ぐために、以下のようにEXEを作成する際にNoConsole
パラメータを使用できます。

また、EXEをx86またはx64ランタイムのみでコンパイルすることもできます。他の利用可能なパラメータについては、GitHubリリースページで確認できます。
PS2EXE-GUIツールを使用してPS1をEXEに変換する
コマンドラインが苦手な場合、PS2EXEモジュールを使用したGUIも利用できます。GUIバージョンは、ほぼ同じ機能を提供します。
GUIバージョンでは、PS2EXEを使用してPS1をEXEに変換するのに数回のクリックしか必要ありません。さらに、コマンドラインとは異なり、ファイルエクスプローラのブラウズダイアログボックスからソースファイル(PS1)を選択できます。
GUIバージョンを実行するには、コンピュータに.NET 4.xが必要です。.NET 3.5xしかない場合、.NET 3.5x向けのPS2EXE-GUIを別途ダウンロードすることができます。
上記で既にPS2EXE PowerShellモジュールをインストール済みであると仮定して、ファイルエクスプローラを開き、以下のいずれかのPS2EXEモジュールフォルダに移動し、モジュールバージョンを表すフォルダを開きます。
Windows 32ビット:C:\ Program Files(x86)\WindowsPowerShell\Modules\ps2exe\<version>
Windows 64ビット:C:\ Program Files\WindowsPowerShell\Modules\ps2exe\<version>
これらのフォルダ内には、Win-PS2EXE.exeという名前のファイルがあります。
- C:\ Program Files\WindowsPowerShell\Modules\ps2exe\<version>\Win-PS2EXE.exeユーティリティを開きます。
2. ソースファイルボックスの右側にある省略記号をクリックして、変換したいPS1スクリプトを検索します。
3. ターゲットファイルの値を定義し、.exeファイル拡張子を含めるようにします。
4. スクリプトのためのパラメータを使用するための、パラメータのGUI表現のカスタマイズを選択してください。これは、コマンドラインバージョンと同様に、スクリプトで使用できるものです。
5. 変換プロセスを開始するには、コンパイルをクリックしてください。

6. コンパイルボタンをクリックすると、PS2EXEがPowerShellセッションを開き、変換を実行します。完了後、Enterを押すか、コンソールウィンドウを閉じてください。

注意: PS2EXEでコンパイルされた一部の実行可能ファイルは、ウイルス対策ソフトウェアによってウイルスと誤検知される場合があります。このような場合は、誤検知をウイルス対策ソフトウェアのベンダーに報告してください。
PS1からEXEへの変換
PS1からEXEへの変換は、F2KO Softwareによって開発された別の無料のデスクトップアプリケーションで、PS1をEXEファイルに変換することができます。PS1 to Exeは、PS2EXEとは異なり、シンプルなスクリプトエディタを備えたGUIツールです。
PS2EXEと同様に、PS1 to ExeにもGUIバージョンとコマンドラインバージョンの両方があります。ただし、PowerShellコンソールの代わりに、コマンドプロンプト内でコマンドを実行する必要があります。
残念ながら、F2KOのウェブサイトはまだ存在していますが、そこからPS1 to EXEをダウンロードする方法はないようです。幸いなことに、このツールのダウンロード可能なインストーラがインターネット上で広まっています。
PS1 to EXEを実行して使用する方法を説明しましょう。
GUIを使用してPS1をEXEに変換する
Ps1 to Exeをインストールして起動すると、シンプルなスクリプトエディタが表示されます。このスクリプトエディタ内でスクリプトを作成して保存し、変換するためのボタンをクリックすることができます。
Ps1 to Exeはドットソースをサポートしており、以下のコマンドラインで別のPS1ファイルを呼び出すことができます。
PS1 to EXEを使用してスクリプトをEXEに変換するには、以下の手順を実行します:
- デスクトップからPS1 to EXEツールを開きます。
2. ファイルをクリックし、変換したいスクリプトを見つけて開きます。
スクリプトを開いた後、コンパイルされたEXEの実行方法を設定します。画面の右側には、3つのタブがあります。それぞれのタブには、異なる設定オプションがあります。

3. 依存するスクリプトを追加するには、埋め込みタブをクリックして、追加をクリックします。
4. 変換オプションを確定したら、トップツールバーの変換ボタンをクリックしてスクリプトをEXEに変換します。

コマンドラインを使用してPS1をEXEに変換するには、以下の手順を実行します:
コマンドラインを使用する場合は、PS1 to EXE CLIと呼ばれるps1_to_exe.exeを使用しますが、使用方法は少し複雑です。
PS1 to EXEを開いた状態で:
- 管理者としてコマンドプロンプトを開きます。
2. 作業ディレクトリをPS1 to EXEのインストールフォルダに変更します。
3. 今度はps1_to_exeを実行して、PS1を実行可能ファイルに変換します。
以下のコマンドには、コンパイルされたEXEファイル内に依存スクリプトが含まれ、実行可能ファイルのターゲットプラットフォームが64ビットのWindows OSに設定されます。
以下は、実際の変換プロセスと出力の詳細のデモンストレーションです。

IExpress 2.0
もしも別のツールをダウンロードしたくない場合は、ラッキーです。古い学校のIExpressユーティリティが利用できます。IExpressは、ファイルをパッケージ化したり、ソフトウェアのインストーラを作成するために通常使用される組み込みのWindowsアプリケーションです。
実は、IExpressはPS1をEXEに変換するだけでなく、依存ファイルをすべて1つの実行可能ファイルにコンパイルすることもできます!
単純なPowerShellスクリプトをEXEに変換するには:
- IExpressを管理者として開く必要があります。Windows*+R*キーを押して実行ダイアログボックスを開き、iexpressと入力してCtrl+Shift+Enterキーを押します。

2. IExpressのウェルカムページで、新しい自己解凍ディレクティブファイルを作成を選択し、パッケージの構成に進むために次へをクリックします。 自己解凍ディレクティブ(SED)ファイルは、インストールパッケージを構築する際に使用されるオプションを制御するファイルです。設定ファイルと考えてください。

3. ファイルを抽出してインストールコマンドを実行するオプションを選択し、次へをクリックします。ソフトウェアインストーラを作成している場合、このオプションはパッケージに含めるファイルを抽出します。また、実行可能ファイルを実行する際にスクリプトを実行するためのカスタムコマンドを記述することもできます。

4. パッケージのタイトルを入力し、次へをクリックします。このパッケージのタイトルは、インストール中にユーザーが表示されるすべてのプロンプトに表示されます。
このパッケージのタイトルは、ソフトウェアインストーラを作成している場合にのみ適用されます。この場合、タイトルは重要ではありません。

6. 次に、プロンプトなしを選択します。 プロンプトなしを選択すると、EXEを実行する際に不要なダイアログボックスでユーザーにプロンプトが表示されません。

6. パッケージを作成するプロジェクトがエンドユーザーライセンス契約(EULA)を必要とする場合、実行時に表示するライセンスを追加することもできます。ただし、このデモでは、ライセンスを表示しないオプションを選択し、次へをクリックします。

7. 今度は、追加をクリックし、このEXEに含めるすべてのスクリプトを参照してください。呼び出すメインスクリプトと、スクリプトが参照する依存スクリプトや他のファイルも含めるようにしてください。

8. 起動するインストールプログラムウィンドウで、powershell.exeエンジンのパスをFile
パラメータを使用して指定します。また、ExecutionPolicy
パラメータをBypass
に設定して、事前に構成された実行ポリシーがスクリプトの実行を妨げないようにしてください。

9. 次に、EXEウィンドウの実行時の動作を定義できます。バックグラウンドで実行する場合は、非表示を選択して次へをクリックしてください。 非表示が最も一般的なウィンドウの動作です。

10. バックグラウンドで単にEXEを実行するだけなので、完了メッセージは必要ありません。 メッセージなしを選択し、次へをクリックしてください。

11. 今度は作成したいEXEのパスを選択してください。ここではいくつかの異なるオプションを有効にすることもできます。完了したら、次へをクリックしてください。
- ユーザーからファイル抽出の進行状況アニメーションを非表示にする-バックグラウンドでEXEを実行する場合は、このオプションを無効にしたままにしておいてください。
- パッケージ内の長いファイル名を使用してファイルを保存する-EXEを実行するときの抽出プロセス中に長いファイル名をサポートするためのオプションです。Win 95でパッケージを実行し、インストール中にINFファイルを使用する場合は、このオプションを無効にしておく必要があります。

12. スクリプトが完了した後にEXEが再起動を呼び出す場合は、ここで常に再起動を選択できます。オプションを選択した後、次へをクリックしてください。

13. 今度はセルフ抽出ディレクティブ(SED)ファイルを保存を選択し、次へをクリックしてください。SEDファイルを保存すると、後でウィザードで提供したオプションを変更することができます。SEDファイルには、これまでに提供されたすべての値の回答が含まれています。

14. 今すべてが残っているのは、パッケージをコンパイルすることです。 次へをクリックすると、プロセスログが表示されます。パッケージの作成を完了するには、完了をクリックし、設定は完了です。
管理者権限の実行が必要な場合
もしスクリプトが管理者として実行される必要がある場合、IExpressではそのようなオプションを提供していませんが、それはまだ可能です。
IExpressを実行する前に、以下のコードをコピーしてスクリプトの先頭に貼り付けてください。このコードスニペットは、スクリプトが管理者として実行されているかどうかをチェックします。もし実行されていない場合、自動的にスクリプトを管理者権限で再実行します。
実行時にEXEのウィンドウを表示または非表示にする方法に応じて、ウィンドウのスタイルパラメータの**を変更する必要があることを覚えておいてください。
ISE ステロイド
もし PowerShell ISEでスクリプトを書くことが好きなら、このツールはあなたのスタイルに合っています。ISE ステロイドは、多くのISE機能を追加したPowerShellモジュールとしてパッケージ化されたPowerShell ISEエディタの拡張機能です。
ISE Steroidsには多くの機能がありますが、ここではスクリプトをEXEに変換する機能について詳しく説明します。
- ISE Steroidsが既にインストールされていることを前提として、PowerShell ISEを開きます。
2. 統合コンソールで、Start-Steroids
を実行して拡張機能を実行し、Steroidsを読み込みます。
3. エディタウィンドウでスクリプトを開いたり新しいスクリプトを作成します。このチュートリアルでは、このファイルを使用します。
4. スクリーンショットのように、ツール —> コードをEXEに変換のオプションをクリックします。

5. 以下のような小さなウィンドウで、生成されるEXEに適用するすべてのオプションを定義します。これらのオプションは、EXEファイルのプロパティと動作を設定するためのパラメータです。

6. オプションをすべて設定したら、アプリケーションを作成ボタンをクリックします。ISE Steroidsは、ターゲットパスを選択するように求めます。その後、PS1をEXEに変換する作業は完了です。
次のエディターは、Visual Studio CodeとPowerShell Pro Toolsです。
次のエディターとして、Visual Studio (VS) Codeを紹介します。VS Codeは、PowerShell ISEの推奨される代替品であり、多くのPowerShell開発者に受け入れられています。
VS CodeにはPowerShellスクリプトをEXEに変換するためのネイティブな方法はありませんが、PowerShell Pro Tools拡張機能を使用することで実現できます。PowerShell Pro Tools拡張機能は、スクリプトをEXEに変換するだけでなく、スクリプトをパッケージ化したり、GUIデザイナーを含めたりするのに役立ちます。
PowerShell Pro Toolsを使用するには、.NET 4.6.2(またはそれ以降)の開発者パックと.NET Core 1.0以降が必要です。
このデモンストレーションでは、Get-LatestAppLog3.ps1とAppLogsComplete.ps1を使用します。
前提条件として、VS CodeとPowerShell Pro Tools拡張機能がインストールされているものとします:
- VS Codeを開き、EXEに変換するPowerShellスクリプトを開きます。
2. VS Codeの右上隅にあるスクリプトをEXEとしてパッケージ化ボタンをクリックします(以下の画像参照)。

3. スクリプトからEXEを作成する際、PowerShell Pro Toolsは現在のワークスペースのルートにpackage.psd1ファイルを作成します。

4. package.psd1ファイルの中には、スクリプトの正確なパスがRootキーに自動的に入力されます。以下に示すように、Output Pathキーを定義して、EXEを保存するパスを指定します。

5. スクリプトからEXEを作成すると、画面下部のOutputペインにさまざまなログメッセージが表示されます。スクリプトのコンパイル中にエラーが発生した場合は、ここに表示されます。

同じEXE内の他のスクリプトのコンパイル
メインスクリプト内で呼び出される依存スクリプトがある場合、PowerShell Pro Tools拡張機能がそれらを処理できます。そのためには、PowerShell Pro ToolsはEXEに含めたいスクリプトをdot-sourceする必要があります。
以下のGet-LatestAppLog3.ps1スクリプトは、コンパイルするメインスクリプトです。これの内部で、AppLogsComplete.ps1スクリプトを実行します。PowerShell Pro Toolsが依存するAppLogsComplete.ps1ファイルを含めるためには、スクリプトをdot sourceするか、現在のスクリプトのスコープに取り込む必要があります。

依存するスクリプトをドットソース化した後、パッケージスクリプトをExeに変換をクリックして、スクリプトを実行可能ファイルに変換します。
PowerGUI
PowerGUIは、元々のPowerShellスクリプトエディタの一つでした。長い間忘れられてしまったようですが、まだウェブ上でコピーを見つけることができます。なぜ長い間忘れられたPowerShellスクリプトエディタについて話すのかというと、組み込みのPS1からEXEへの変換機能があるからです!
PowerGUIのウェブサイトはもう存在しませんが、Softpediaのようなサイトでコピーを見つけることができます。
PS1スクリプトをEXEにコンパイルする
PowerGUIをインストールした後、起動するとスタートページが表示されます。スクリプトのコンパイルを開始するためには、ツールバーから新しいスクリプトを作成するか、既存のスクリプトを開くことができます。以下のスクリーンショットに示すように。

スクリプトに満足したら、ツールメニューをクリックします。そして、スクリプトのコンパイルを選択するか、キーボードでCtrl+F9を押します。

今、変換後にEXEが実行される方法を設定します。スクリプトのコンパイルウィンドウには、EXEの動作について選択できるさまざまなオプションがあります。
- 参照ボタンをクリックして、変換したいPS1を見つけます。
2. PowerGUIは、Microsoft .NET Framework 3.5から.NET Framework 4.0までのターゲットフレームワークをサポートしています。
3. 背景でEXEを実行する場合は、スクリプトの実行時にPowerShellコンソールウィンドウを表示しないオプションを無効にします。
4. 他のファイルを含める必要がある場合は、依存関係ボタン(左下)をクリックすることもできます。通常、スクリプトが依存する他のPowerShellスクリプトです。
5. 設定に満足したら、PS1をEXEに変換するためにOKをクリックします。

ちなみに、PowerGUIにはEXEの実行方法を制御する上での欠点があります。PowerGUIはパラメータの追加など、多くのオプションを提供していません。
また、PowerGUIは著作権、バージョン、説明などの情報を埋め込むオプションも提供していません。他のPS1からEXEへの変換ツールとは異なります。しかし、それほど気にならないのであれば、PowerGUIはおすすめです。
PowerShell Studio
PS1からEXEへの変換ツールのリストを締めくくるために、最も機能豊富なPowerShell IDEの1つであるSapien TechnologiesのPowerShell Studioで終わりましょう。PowerShell Studioは、純粋なPowerShell IDEとして設計されており、PS1をEXEに変換する能力のみを示すことは不公平です。ただし、スペースには限りがあります!
Visual Studio CodeのPowerShell Pro Toolsと同様に、PowerShell Studioもスクリプトのパッケージングに厳しい要件があります。例えば、.NET Framework 4.8、PowerShell 7用の.NET 5、およびVisual Studio 2015-2019 Runtimeなどです。
PowerShell Studioがインストールされていると仮定し、PowerShell Studioを開き、新しいPowerShellスクリプトを作成するか既存のスクリプトを開きます。このチュートリアルでは、Get-LatestAppLog3.ps1スクリプトを使用します。
設定のナビゲーション
PowerShell Studioでスクリプトを変換する前に、変換後のEXEの動作を変更するための豊富な方法を先に学ぶ必要があります。
ウィンドウの右上隅にあるパッケージボタンをクリックし、設定を選択します。これにより、スクリプトパッケージャーウィンドウが開き、利用可能なオプションを定義できます。

スクリプトパッケージャーの各オプションは、EXEファイルの出力方法に重要な役割を果たします。これらのオプションは、以下のセクションでスクリーンショット付きで説明されています。
スクリプトエンジン
スクリプトエンジンセクションでは、ターゲットプラットフォームとスクリプトエンジンを指定して実行可能ファイルをコンパイルします。
ターゲットを選択してください。32ビット版または64ビット版のWindowsを選択するか、柔軟性を持たせるために両方を選択することができます。PowerShell Studioは、ここで選択した各プラットフォーム用にEXEファイルを作成します。

出力設定
このセクションでは、コンパイル後のEXEファイルの出力方法を設定するオプションがあります。
- 出力ファイル – 生成されるEXEの名前です。
拡張子(.exe)はファイルに自動的に設定されるため、含めないでください。
- 出力フォルダ – PowerShell Studioが実行可能ファイルを保存する場所です。
- 外部スクリプトの解決と組み込み – メインスクリプトに依存するスクリプトがある場合は、このオプションをチェックしてください。これを有効にしない場合、実行可能ファイルをコンパイルする際に外部スクリプトは無視されます。
常に依存するスクリプトがメインスクリプトと同じフォルダにあることを確認してください。
- 署名 – EXEに署名するための証明書を検索する場所です。証明書にパスワードが設定されている場合は、それも入力してください。

アイコンファイル
アイコンは、アプリケーションを区別するのに役立ちます。また、アイコンファイルセクションでは、実行可能ファイルにアイコンを追加するオプションがあります。
アイコンファイルを追加するには、ファイルの追加ボタンをクリックするか、アイコンファイルをアイコンファイルセクションにドラッグアンドドロップしてください。

制約
制約セクションでは、EXEの実行を許可するための条件を含めるか除外することができます。
このフィールドでオペレーティングシステムをチェックすると、そのオペレーティングシステム上でのみEXEが実行されるようになります。同様に、特定のユーザーがログインしている必要がある、コンピューターが特定のMACアドレスを持っている必要があるなどの条件を定義することもできます。
以下の例では、EXEの実行タイミングを完全に制御することができます。

バージョン情報
PowerShell StudioがEXEを作成すると、そのEXEにはさまざまなファイル属性があります。 バージョン情報セクションでは、それらの属性を定義することができます。
ここでは、ファイルバージョン、製品バージョン、著作権などの属性を設定することができます。利用可能な属性は以下で確認できます。

ビルドオプション
最後に、ビルドオプションセクションがあります。このセクションでは、カスタムのビルド前またはビルド後のコマンドを追加して実行することができます。このオプションでは、スクリプトを実行可能ファイルにコンパイルする前後にPowerShellコマンドを実行します。
たとえば、PowerShell StudioがEXEの作成を完了した後にコードを実行したい場合は、新規(挿入)ボタンをクリックしてビルド後のコマンドボックスに移動します。ビルド前およびビルド後のコマンドの両方には、PowerShellコマンドを直接入力することができます。
また、ファイルの追加(省略記号)ボタンをクリックし、別のアプリケーションまたはPowerShellスクリプトを選択することもできます。

すべての設定を完了したら、OKをクリックしてスクリプトを実行可能ファイルにパッケージ化します。ファイルの場所は自動的に開かれ、実行可能ファイルを確認できます。
外部のPowerShellスクリプトの依存関係を考慮する
A PowerShell script sometimes isn’t a self-contained unit. A script can also call other scripts. When converting to an EXE, some of the tools discussed here do not automatically find these dependent scripts and compile them.
スクリプトが他のスクリプトへの参照を含んでおり、そのスクリプトをEXEに変換するとパスが変わることがあります。その場合、EXE内のPowerShellコードは依存するスクリプトを見つけることができず、失敗します。
おそらく、同じフォルダ内の他のスクリプトを呼び出すスクリプトを変換したい場合があります。PowerShellコンソールでスクリプトを実行すると、すべてのスクリプトは同じ作業ディレクトリにあるため、問題ありません。しかし、スクリプトをEXEに変換すると、この動作が壊れる可能性があります。
PS1をEXEに変換するつもりで、そのスクリプトが同じディレクトリ内の他のスクリプトを呼び出す場合は、以下のコードスニペットをスクリプトの先頭に追加してください。
以下のコードスニペットは、メインスクリプトから実行される外部スクリプトのパスを解決します。ただし、両方のスクリプトが同じディレクトリにある場合に限ります。
機能の比較
PowerShellスクリプトからEXEを作成する方法についてまだ決めていない場合は、以下の表を参照してください。この表は、各ツールの機能を一覧表示し、どのツールをPS1からEXEに変換するための選択肢とするかを決定するのに役立ちます。
