ทำงานหนักเกินไปกับสคริปต์ที่ยอดเยี่ยมของ Ingo Karstein ด้วยการรองรับ GUI เอาต์พุต GUI และอินพุตถูกเปิดใช้งานด้วยสวิตช์ตัวเดียว โปรแกรมสร้าง Windows จริงจะถูกสร้างขึ้น คอมไพล์ด้วยและกับ Powershell 5.x เท่านั้น ด้วยตัวเลือกส่วนหน้าแบบกราฟิก Win-PS2EXE
รุ่นโมดูล
คุณค้นหาเวอร์ชันที่ใช้สคริปต์ได้ที่นี่ (https://github.com/MScholtes/TechNet-Gallery)
ผู้เขียน : มาร์คุส สโคลส์
เวอร์ชัน: 1.0.14
วันที่: 15-09-2024
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.
คำสั่งอินพุต/เอาท์พุตพื้นฐานจะต้องเขียนใหม่ในภาษา C# สำหรับ PS2EXE ไม่ได้นำไปใช้คือ Write-Progress ในโหมดคอนโซล (งานมากเกินไป) และ Start-Transcript / Stop-Transcript (ไม่มีการใช้งานอ้างอิงที่เหมาะสมโดย Microsoft)
ตามค่าเริ่มต้นในเอาต์พุต PowerShell ของ commandlets จะถูกจัดรูปแบบบรรทัดต่อบรรทัด (เป็นอาร์เรย์ของสตริง) เมื่อคำสั่งของคุณสร้างเอาต์พุต 10 บรรทัดและคุณใช้เอาต์พุต GUI กล่องข้อความ 10 กล่องจะปรากฏขึ้นเพื่อรอการตกลง เพื่อป้องกันไม่ให้ไปป์นี้คำสั่งของคุณไปที่ comandlet Out-String สิ่งนี้จะแปลงเอาต์พุตเป็นอาร์เรย์สตริงเดียวที่มี 10 บรรทัด เอาต์พุตทั้งหมดจะแสดงในกล่องข้อความเดียว (เช่น: dir C: | Out-String)
PS2EXE สามารถสร้างไฟล์กำหนดค่าด้วยชื่อของไฟล์ปฏิบัติการที่สร้างขึ้น + ".config" ในกรณีส่วนใหญ่ไฟล์กำหนดค่าเหล่านั้นไม่จำเป็น แต่เป็นไฟล์ Manifest ที่บอกว่าควรใช้ .Net Framework เวอร์ชันใด เนื่องจากปกติแล้วคุณจะใช้ .Net Framework จริง ให้ลองเรียกใช้โปรแกรมปฏิบัติการของคุณโดยไม่มีไฟล์ปรับแต่ง
สคริปต์ที่คอมไพล์แล้วประมวลผลพารามิเตอร์เหมือนกับที่สคริปต์ต้นฉบับทำ ข้อจำกัดประการหนึ่งมาจากสภาพแวดล้อม Windows: สำหรับพารามิเตอร์ที่เรียกใช้งานได้ทั้งหมด พารามิเตอร์ทั้งหมดจะมีประเภท 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) หน้าต่างถัดไปจะเปิดขึ้นในเบื้องหลัง
เหตุผลก็คือเมื่อปิดหน้าต่างภายนอก หน้าต่างจะพยายามเปิดใช้งานหน้าต่างหลัก เนื่องจากสคริปต์ที่คอมไพล์ไม่มีหน้าต่าง หน้าต่างหลักของสคริปต์ที่คอมไพล์จึงถูกเปิดใช้งานแทน ซึ่งโดยปกติจะเป็นหน้าต่างของ Explorer หรือ Powershell
เพื่อแก้ไขปัญหานี้ $Host.UI.RawUI.FlushInputBuffer() จะเปิดหน้าต่างที่มองไม่เห็นซึ่งสามารถเปิดใช้งานได้ การเรียก $Host.UI.RawUI.FlushInputBuffer() ต่อไปนี้จะปิดหน้าต่างนี้ (และอื่นๆ)
ตัวอย่างต่อไปนี้จะไม่เปิดหน้าต่างในพื้นหลังอีกต่อไป เนื่องจากการเรียก "ipconfig | Out-String" ครั้งเดียวจะทำ:
$Host .UI.RawUI.FlushInputBuffer ()
ipconfig | Out-String
$Host .UI.RawUI.FlushInputBuffer ()
แปลงไฟล์จาก UTF-16 เป็น UTF-8 เพื่อให้ git diff
ละเว้นคีย์ควบคุมในคำขอสตริงที่ปลอดภัยในโหมดคอนโซล