Ingo Karstein の素晴らしいスクリプトを GUI サポートで酷使します。 GUI の出力と入力は 1 つのスイッチでアクティブになり、実際の Windows 実行可能ファイルが生成されます。 Powershell 5.x でのみコンパイルします。オプションのグラフィカル フロント エンド Win-PS2EXE を使用します。
モジュールのバージョン。
スクリプトベースのバージョンはここ (https://github.com/MScholtes/TechNet-Gallery) にあります。
著者: マルクス・ショルテス
バージョン: 1.0.14
日付: 2024-09-15
PS C: > Install-Module ps2exe
またはここからダウンロードします: https://www.powershellgallery.com/packages/ps2exe/。
Invoke-ps2exe .source.ps1 . target.exe
または
ps2exe .source.ps1 . target.exe
「source.ps1」を実行可能ファイル target.exe にコンパイルします (「.target.exe」を省略した場合、出力は「.source.exe」に書き込まれます)。
または、グラフィカル フロント エンドの Win-PS2EXE を起動します。
Win - PS2EXE
ps2exe [ - inputFile ] ' ' [[ - outputFile ] ' ' ]
[ - prepareDebug ] [ - x86 | - x64 ] [ - lcid < id > ] [ - STA | - MTA ] [ - noConsole ] [ - UNICODEEncoding ]
[ - credentialGUI ] [ - iconFile ' ' ] [ - title ' ' ] [ - description ' ' ]
[ - company ' ' ] [ - product ' ' ] [ - copyright ' ' ] [ - trademark ' ' ]
[ - version ' ' ] [ - configFile ] [ - noOutput ] [ - noError ] [ - noVisualStyles ] [ - exitOnCancel ]
[ - DPIAware ] [ - requireAdmin ] [ - supportOS ] [ - virtualize ] [ - longPaths ]
inputFile = Powershell script that you want to convert to executable (file has to be UTF8 or UTF16 encoded)
outputFile = destination executable file name or folder, defaults to inputFile with extension '.exe'
prepareDebug = create helpful information for debugging
x86 or x64 = compile for 32-bit or 64-bit runtime only
lcid = location ID for the compiled executable. Current user culture if not specified
STA or MTA = 'Single Thread Apartment' or 'Multi Thread Apartment' mode
noConsole = the resulting executable will be a Windows Forms app without a console window
UNICODEEncoding = encode output as UNICODE in console mode
credentialGUI = use GUI for prompting credentials in console mode
iconFile = icon file name for the compiled executable
title = title information (displayed in details tab of Windows Explorer's properties dialog)
description = description information (not displayed, but embedded in executable)
company = company information (not displayed, but embedded in executable)
product = product information (displayed in details tab of Windows Explorer's properties dialog)
copyright = copyright information (displayed in details tab of Windows Explorer's properties dialog)
trademark = trademark information (displayed in details tab of Windows Explorer's properties dialog)
version = version information (displayed in details tab of Windows Explorer's properties dialog)
configFile = write config file (.exe.config)
noOutput = the resulting executable will generate no standard output (includes verbose and information channel)
noError = the resulting executable will generate no error output (includes warning and debug channel)
noVisualStyles = disable visual styles for a generated windows GUI application (only with -noConsole)
exitOnCancel = exits program when Cancel or "X" is selected in a Read-Host input box (only with -noConsole)
DPIAware = if display scaling is activated, GUI controls will be scaled if possible (only with -noConsole)
requireAdmin = if UAC is enabled, compiled executable run only in elevated context (UAC dialog appears if required)
supportOS = use functions of newest Windows versions (execute [Environment]::OSVersion to see the difference)
virtualize = application virtualization is activated (forcing x86 runtime)
longPaths = enable long paths ( > 260 characters) if enabled on OS (works only with Windows 10)
生成された実行可能ファイルには、次の予約済みパラメータがあります。
-? [] Powershell help text of the script inside the executable. The optional parameter combination
"-? -detailed", "-? -examples" or "-? -full" can be used to get the appropriate help text.
-debug Forces the executable to be debugged. It calls "System.Diagnostics.Debugger.Launch()".
-extract: Extracts the powerShell script inside the executable and saves it as FILENAME.
The script will not be executed.
-wait At the end of the script execution it writes "Hit any key to exit..." and waits for a key to be pressed.
-end All following options will be passed to the script inside the executable.
All preceding options are used by the executable itself and will not be passed to the script.
基本的な入出力コマンドは PS2EXE 用に C# で書き直す必要がありました。コンソール モードでのWrite-Progress (作業が多すぎる) とStart-Transcript / Stop-Transcript (Microsoft による適切なリファレンス実装がない) は実装されていません。
PowerShell のデフォルトでは、コマンドレットの出力は 1 行ごとに (文字列の配列として) フォーマットされます。コマンドが 10 行の出力を生成し、GUI 出力を使用すると、それぞれ OK を待つ 10 個のメッセージ ボックスが表示されます。これを防ぐには、コマンドをコマンドレット Out-String にパイプします。これにより、出力が 10 行の 1 つの文字列配列に変換され、すべての出力が 1 つのメッセージ ボックスに表示されます (例: dir C: | Out-String)。
PS2EXE は、生成された実行可能ファイルの名前に「.config」を加えた構成ファイルを作成できます。ほとんどの場合、これらの構成ファイルは必要ありません。これらは、どの .Net Framework バージョンを使用するかを指示するマニフェストです。通常は実際の .Net Framework を使用するため、構成ファイルを使用せずに実行可能ファイルを実行してみてください。
コンパイルされたスクリプトは、元のスクリプトと同様にパラメーターを処理します。 Windows 環境による制限が 1 つあります。すべての実行可能ファイルで、すべてのパラメーターの型が STRING になります。パラメーターの型に暗黙的な変換がない場合は、スクリプト内で明示的に変換する必要があります。同じ制限を使用して、コンテンツを実行可能ファイルにパイプすることもできます (パイプされたすべての値の型は STRING です)。
コンパイルされたスクリプトにパスワードを保存しないでください。パラメータ -extract を使用してスクリプトを簡単に逆コンパイルできます。例えば
Output.exe - extract:C:Output.ps1
Output.exe に保存されているスクリプトを逆コンパイルします。
PS2EXE はスクリプトを実行可能ファイルに変換するため、スクリプト関連の変数は使用できなくなります。特に変数 $PSScriptRoot は空です。
変数 $MyInvocation は、スクリプト以外の値に設定されます。
次のコードを使用すると、コンパイル済み/未コンパイルに関係なく、スクリプト/実行可能ファイルのパスを取得できます (JacquesFS に感謝します)。
if ( $MyInvocation .MyCommand.CommandType -eq " ExternalScript " )
{ $ScriptPath = Split-Path - Parent - Path $MyInvocation .MyCommand.Definition }
else
{ $ScriptPath = Split-Path - Parent - Path ([ Environment ]::GetCommandLineArgs()[ 0 ])
if ( ! $ScriptPath ){ $ScriptPath = " . " } }
-noConsole モードのスクリプト (つまり、Get-Credential または cmd.exe シェルを必要とするコマンド) で外部ウィンドウが開かれると、次のウィンドウがバックグラウンドで開きます。
その理由は、外部ウィンドウを閉じるときに、ウィンドウが親ウィンドウをアクティブにしようとするためです。コンパイルされたスクリプトにはウィンドウがないため、代わりにコンパイルされたスクリプトの親ウィンドウ (通常はエクスプローラーまたは Powershell のウィンドウ) がアクティブになります。
これを回避するために、$Host.UI.RawUI.FlushInputBuffer() はアクティブ化できる非表示のウィンドウを開きます。次の $Host.UI.RawUI.FlushInputBuffer() の呼び出しにより、このウィンドウ (など) が閉じられます。
次の例では、「ipconfig | Out-String」を 1 回呼び出すとバックグラウンドでウィンドウが開かなくなります。
$Host .UI.RawUI.FlushInputBuffer ()
ipconfig | Out-String
$Host .UI.RawUI.FlushInputBuffer ()
git diff を許可するためにファイルを UTF-16 から UTF-8 に変換しました
コンソールモードでのセキュア文字列リクエストの制御キーを無視する