إرهاق البرنامج النصي الرائع لـ Ingo Karstein بدعم من واجهة المستخدم الرسومية. يتم تنشيط إخراج وإدخال واجهة المستخدم الرسومية باستخدام مفتاح واحد، ويتم إنشاء ملفات تنفيذية حقيقية للنوافذ. يتم التجميع فقط مع 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.
كان لا بد من إعادة كتابة أوامر الإدخال/الإخراج الأساسية في لغة C# لـ PS2EXE. لم يتم تنفيذ برنامج Write-Progress في وضع وحدة التحكم (الكثير من العمل) و Start-Transcript / Stop-Transcript (لا يوجد تطبيق مرجعي مناسب بواسطة Microsoft).
افتراضيًا، يتم تنسيق مخرجات الأوامر في powershell سطرًا لكل سطر (كمصفوفة من السلاسل). عندما ينشئ أمرك 10 أسطر من المخرجات وتستخدم مخرجات واجهة المستخدم الرسومية، سيظهر كل منها 10 مربعات رسائل في انتظار الموافقة. لمنع هذا التوجيه، أمرك إلى سلسلة Out-String comandlet. سيؤدي هذا إلى تحويل الإخراج إلى مصفوفة سلسلة واحدة مكونة من 10 أسطر، وسيتم عرض جميع المخرجات في مربع رسالة واحد (على سبيل المثال: dir C: | Out-String).
يمكن لـ PS2EXE إنشاء ملفات تكوين باسم الملف القابل للتنفيذ الذي تم إنشاؤه + ".config". في معظم الحالات، لا تكون ملفات التكوين هذه ضرورية، فهي عبارة عن بيان يوضح إصدار .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 (أي للحصول على بيانات الاعتماد أو لأمر يحتاج إلى غلاف 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
تجاهل مفاتيح التحكم في طلب السلسلة الآمنة في وضع وحدة التحكم