Skrip hebat Ingo Karstein bekerja terlalu keras dengan dukungan GUI. Output dan input GUI diaktifkan dengan satu saklar, executable windows nyata dihasilkan. Kompilasi hanya dengan dan ke Powershell 5.x. Dengan front end grafis opsional Win-PS2EXE.
Versi modul.
Anda menemukan versi berbasis skrip di sini (https://github.com/MScholtes/TechNet-Gallery).
Pengarang: Markus Scholtes
Versi: 1.0.14
Tanggal: 15-09-2024
PS C: > Install-Module ps2exe
atau unduh dari sini: https://www.powershellgallery.com/packages/ps2exe/.
Invoke-ps2exe .source.ps1 . target.exe
atau
ps2exe .source.ps1 . target.exe
mengkompilasi "source.ps1" ke dalam target.exe yang dapat dieksekusi (jika ".target.exe" dihilangkan, output ditulis ke ".source.exe").
atau mulai Win-PS2EXE untuk front end grafis dengan
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)
Eksekusi yang dihasilkan memiliki parameter khusus berikut:
-? [] 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.
Perintah input/output dasar harus ditulis ulang dalam C# untuk PS2EXE. Tidak diterapkan adalah Write-Progress dalam mode konsol (terlalu banyak pekerjaan) dan Start-Transcript / Stop-Transcript (tidak ada implementasi referensi yang tepat oleh Microsoft).
Secara default dalam output PowerShell dari commandlet diformat baris per baris (sebagai array string). Ketika perintah Anda menghasilkan 10 baris keluaran dan Anda menggunakan keluaran GUI, 10 kotak pesan akan muncul masing-masing menunggu OK. Untuk mencegah hal ini, kirimkan perintah Anda ke comandlet Out-String. Ini akan mengubah output menjadi satu array string dengan 10 baris, semua output akan ditampilkan dalam satu kotak pesan (misalnya: dir C: | Out-String).
PS2EXE dapat membuat file config dengan nama executable yang dihasilkan + ".config". Dalam kebanyakan kasus, file konfigurasi tersebut tidak diperlukan, melainkan manifes yang memberitahukan versi .Net Framework mana yang harus digunakan. Karena Anda biasanya menggunakan .Net Framework yang sebenarnya, coba jalankan excutable Anda tanpa file konfigurasi.
Skrip yang dikompilasi memproses parameter seperti skrip asli. Satu batasan berasal dari lingkungan Windows: untuk semua executable, semua parameter memiliki tipe STRING, jika tidak ada konversi implisit untuk tipe parameter Anda, Anda harus mengonversi secara eksplisit dalam skrip Anda. Anda bahkan dapat menyalurkan konten ke file yang dapat dieksekusi dengan batasan yang sama (semua nilai yang disalurkan memiliki tipe STRING).
Jangan pernah menyimpan kata sandi dalam skrip kompilasi Anda! Seseorang cukup mendekompilasi skrip dengan parameter -ekstrak. Misalnya
Output.exe - extract:C:Output.ps1
akan mendekompilasi skrip yang disimpan di Output.exe.
Karena PS2EXE mengonversi skrip menjadi executable, variabel terkait skrip tidak tersedia lagi. Terutama variabel $PSScriptRoot kosong.
Variabel $MyInvocation diatur ke nilai lain selain dalam skrip.
Anda dapat mengambil skrip/jalur yang dapat dieksekusi secara independen dari yang dikompilasi/tidak dikompilasi dengan kode berikut (terima kasih kepada 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 = " . " } }
Ketika jendela eksternal dibuka dalam skrip dengan mode -noConsole (yaitu untuk Get-Credential atau untuk perintah yang memerlukan shell cmd.exe), jendela berikutnya dibuka di latar belakang.
Alasannya adalah saat menutup jendela eksternal, windows mencoba mengaktifkan jendela induk. Karena skrip yang dikompilasi tidak memiliki jendela, jendela induk dari skrip yang dikompilasi akan diaktifkan, biasanya jendela Explorer atau Powershell.
Untuk mengatasinya, $Host.UI.RawUI.FlushInputBuffer() membuka jendela tak terlihat yang dapat diaktifkan. Panggilan $Host.UI.RawUI.FlushInputBuffer() berikut menutup jendela ini (dan seterusnya).
Contoh berikut tidak akan lagi membuka jendela di latar belakang karena satu panggilan "ipconfig | Out-String" akan berfungsi:
$Host .UI.RawUI.FlushInputBuffer ()
ipconfig | Out-String
$Host .UI.RawUI.FlushInputBuffer ()
mengonversi file dari UTF-16 ke UTF-8 untuk memungkinkan git diff
abaikan kunci kontrol dalam permintaan string aman dalam mode konsol