
وحدة لتجميع نصوص باورشيل إلى ملفات تنفيذية
إصدار محسّن من النص الرائع لـ Ingo Karstein مع دعم واجهة المستخدم الرسومية. يتم تفعيل الإخراج والإدخال الرسومي بمفتاح واحد، ويتم إنشاء ملفات تنفيذية حقيقية لنظام ويندوز. يقوم بتجميع النصوص البرمجية المتوافقة مع Powershell 5.x فقط. مع واجهة أمامية رسومية اختيارية Win-PS2EXE.
إصدار الوحدة.
يمكنك العثور على الإصدار النصي هنا (https://github.com/MScholtes/TechNet-Gallery).
المؤلف: Markus Scholtes
الإصدار: 1.0.18
التاريخ: 2026-06-06
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] '<file_name>' [[-outputFile] '<file_name>']
[-prepareDebug] [-x86|-x64] [-lcid <id>] [-STA|-MTA] [-noConsole] [-conHost] [-UNICODEEncoding]
[-credentialGUI] [-iconFile '<filename>'] [-$embedFiles <hashtable>] [-title '<title>'] [-description '<description>']
[-company '<company>'] [-product '<product>'] [-copyright '<copyright>'] [-trademark '<trademark>']
[-version '<version>'] [-configFile] [-noOutput] [-noError] [-noVisualStyles] [-exitOnCancel]
[-DPIAware] [-requireAdmin] [-supportOS] [-virtualize] [-longPaths]
inputFile = نص Powershell الذي تريد تحويله إلى ملف تنفيذي (يجب أن يكون الملف بترميز UTF8 أو UTF16)
outputFile = اسم أو مجلد الملف التنفيذي الهدف، الافتراضي هو inputFile بامتداد '.exe'
prepareDebug = إنشاء معلومات مفيدة لتصحيح الأخطاء
x86 or x64 = التجميع لبيئة تشغيل 32 بت أو 64 بت فقط
lcid = معرف الموقع للملف التنفيذي المُجمّع. ثقافة المستخدم الحالية إذا لم يتم تحديده
STA or MTA = وضع 'Single Thread Apartment' أو 'Multi Thread Apartment'
noConsole = سيكون الملف التنفيذي الناتج تطبيق نماذج ويندوز بدون نافذة وحدة تحكم
conHost = فرض البدء مع conhost كوحدة تحكم بدلاً من Windows Terminal (يعطل إعادة التوجيه)
UNICODEEncoding = تشفير المخرجات كـ UNICODE في وضع وحدة التحكم
credentialGUI = استخدام واجهة رسومية لمطالبة بيانات الاعتماد في وضع وحدة التحكم
iconFile = اسم ملف الأيقونة للملف التنفيذي المُجمّع
embedFiles = الملفات المضمنة تُعطى كـ hash، سيتم استخراجها إلى مفتاح hash، يجب أن تكون أسماء الملفات المصدر فريدة
(مثال: -embedFiles @{'Targetfilepath'='Sourcefilepath'} )
title = معلومات العنوان (معروضة في علامة التبويب 'تفاصيل' في مربع حوار خصائص مستكشف ويندوز)
description = معلومات الوصف (غير معروضة، ولكن مضمنة في الملف التنفيذي)
company = معلومات الشركة (غير معروضة، ولكن مضمنة في الملف التنفيذي)
product = معلومات المنتج (معروضة في علامة التبويب 'تفاصيل' في مربع حوار خصائص مستكشف ويندوز)
copyright = معلومات حقوق النشر (معروضة في علامة التبويب 'تفاصيل' في مربع حوار خصائص مستكشف ويندوز)
trademark = معلومات العلامة التجارية (معروضة في علامة التبويب 'تفاصيل' في مربع حوار خصائص مستكشف ويندوز)
version = معلومات الإصدار (معروضة في علامة التبويب 'تفاصيل' في مربع حوار خصائص مستكشف ويندوز)
configFile = كتابة ملف التكوين (<outputfile>.exe.config)
noOutput = لن يُنتج الملف التنفيذي الناتج مخرجات قياسية (يشمل قناة verbose والمعلومات)
noError = لن يُنتج الملف التنفيذي الناتج مخرجات أخطاء (يشمل قناة التحذير والتصحيح)
noVisualStyles = تعطيل الأنماط المرئية لتطبيق واجهة ويندوز رسومية (فقط مع -noConsole)
exitOnCancel = يخرج البرنامج عند تحديد 'إلغاء' أو 'X' في مربع إدخال Read-Host (فقط مع -noConsole)
DPIAware = إذا تم تفعيل تحجيم العرض، سيتم تحجيم عناصر التحكم في الواجهة الرسومية إذا أمكن (فقط مع -noConsole)
requireAdmin = إذا كان UAC مفعّلاً، يعمل الملف التنفيذي المُجمّع فقط في سياق مرتفع (يظهر مربع حوار UAC إذا لزم الأمر)
supportOS = استخدام وظائف أحدث إصدارات ويندوز (نفّذ [Environment]::OSVersion لرؤية الفرق)
virtualize = تفعيل افتراضية التطبيق (فرض بيئة تشغيل x86)
longPaths = تمكين المسارات الطويلة (> 260 حرفاً) إذا كانت مفعّلة على نظام التشغيل (يعمل فقط مع ويندوز 10)
للملف التنفيذي المُنشأ المعاملات المحجوزة التالية:
-? [<MODIFIER>] نص المساعدة لـ Powershell الخاص بالنص البرمجي داخل الملف التنفيذي. يمكن استخدام تركيبة المعامل الاختيارية
"-? -detailed" أو "-? -examples" أو "-? -full" للحصول على نص المساعدة المناسب.
-debug يُجبر الملف التنفيذي على أن يكون في وضع التصحيح. يستدعي "System.Diagnostics.Debugger.Launch()".
-extract:<FILENAME> يستخرج النص البرمجي لـ Powershell داخل الملف التنفيذي ويحفظه كـ FILENAME.
لن يتم تنفيذ النص البرمجي.
-wait في نهاية تنفيذ النص البرمجي يكتب "Hit any key to exit..." وينتظر الضغط على مفتاح.
-end سيتم تمرير جميع الخيارات التالية إلى النص البرمجي داخل الملف التنفيذي.
جميع الخيارات السابقة تُستخدم من قبل الملف التنفيذي نفسه ولن يتم تمريرها إلى النص البرمجي.
يمكن استخدام PS2EXE مع Powershell Core. للقيام بذلك، ما عليك سوى تثبيت الوحدة PS2EXE في Powershell Core كما هو موضح أعلاه. ولكن نظرًا لأن .Net Core لا تأتي مع مترجم، يتم استخدام مترجم .Net Framework (يتم تضمين .Net Framework و Powershell 5.1 في ويندوز).
لهذا السبب، يمكن لـ PS2EXE فقط تجميع النصوص البرمجية المتوافقة مع Powershell 5.1 وينتج ملفات ثنائية .Net 4.x، ولكن لا يزال من الممكن استخدامها مباشرة على أي نظام تشغيل ويندوز مدعوم بدون تبعيات.
باستخدام المعامل -embedFiles متبوعًا بجدول تجزئة مع مسارات للملفات، سيتم تضمين تلك الملفات في الملف التنفيذي المُجمّع. عند بدء تشغيل الملف التنفيذي، ستتم كتابة تلك الملفات على القرص إلى المسارات المحددة، مثال: -embedFiles @{'Targetfilepath1'='Sourcefilepath1';'Targetfilepath2'='Sourcefilepath2'}. يجب أن تكون أسماء الملفات المصدر فريدة. المسارات المطلقة والنسبية مسموحة. بالنسبة للمسارات الهدف، المسار النسبي الذي يبدأ بـ '.\' يُفسر على أنه نسبي للملف التنفيذي، وبدون '.\' البادئة على أنه نسبي للمسار الحالي في وقت التشغيل. يتم إنشاء الدلائل تلقائيًا عند بدء التشغيل إذا لزم الأمر. في المسار الهدف، يتم توسيع متغيرات البيئة بتدوين cmd.exe مثل %TEMP% أو %APPDATA% في وقت التشغيل. سيؤدي الفشل في إنشاء أحد الملفات المضمنة إلى إيقاف تنفيذ الملف التنفيذي المُجمّع فورًا.
كان لا بد من إعادة كتابة أوامر الإدخال/الإخراج الأساسية بلغة C# لـ PS2EXE. غير المنفذة هي Write-Progress في وضع وحدة التحكم (عمل كثير) و Start-Transcript/Stop-Transcript (لا توجد تطبيق مرجعي مناسب من مايكروسوفت).
افتراضيًا، في Powershell، يتم تنسيق مخرجات cmdlets سطرًا بسطر (كمصفوفة من السلاسل). عندما يُنتج أمرك 10 أسطر من المخرجات وتستخدم مخرجات واجهة رسومية، ستظهر 10 مربعات رسائل كل منها في انتظار تأكيد. لمنع ذلك، قم بتوجيه الأمر الخاص بك إلى cmdlet Out-String. سيؤدي هذا إلى تحويل المخرجات إلى مصفوفة سلسلة واحدة تحتوي على 10 أسطر، وسيتم عرض جميع المخرجات في مربع رسالة واحد (مثال: dir C:\ | Out-String).
يمكن لـ PS2EXE إنشاء ملفات تكوين باسم الملف التنفيذي المُنشأ + ".config". في معظم الحالات، هذه الملفات التكوينية ليست ضرورية، فهي بيان يخبر بإصدار .Net Framework الذي يجب استخدامه. نظرًا لأنك ستستخدم عادةً .Net Framework الحالي، حاول تشغيل ملفك التنفيذي بدون ملف التكوين.
تقوم النصوص البرمجية المُجمّعة بمعالجة المعاملات بنفس الطريقة التي يفعلها النص البرمجي الأصلي. هناك قيد واحد يأتي من بيئة ويندوز: بالنسبة لجميع الملفات التنفيذية، جميع المعاملات لها النوع STRING، إذا لم يكن هناك تحويل ضمني لنوع المعامل الخاص بك، يجب عليك التحويل صراحةً في النص البرمجي الخاص بك. يمكنك حتى توجيه المحتوى إلى الملف التنفيذي بنفس القيد (جميع القيم المُوجّهة لها النوع STRING).
لا تقم بتخزين كلمات المرور أبدًا في النص البرمجي المُجمّع! يمكن للمرء ببساطة إلغاء تجميع النص البرمجي باستخدام المعامل -extract. على سبيل المثال
Output.exe -extract:C:\Output.ps1
سوف يقوم بإلغاء تجميع النص البرمجي المخزن في Output.exe. ولاحظ: النص البرمجي (عن قصد) مخزن بنص واضح في الملف التنفيذي!
نظرًا لأن PS2EXE يحول نصًا برمجيًا إلى ملف تنفيذي، فإن المتغيرات المتعلقة بالنص البرمجي لم تعد متاحة. يتم تعيين المتغير $MyInvocation لقيم أخرى غير تلك الموجودة في النص البرمجي.
خاصة المتغير $PSScriptRoot فارغ - يمكنك استخدام $ScriptRoot كبديل.
يمكنك الحصول على $PSScriptRoot بشكل مستقل عن كونه مُجمّعًا/غير مُجمّع باستخدام سطر الكود التالي:
if (!$PSScriptRoot) { $PSScriptRoot = $ScriptRoot }
عند فتح نافذة خارجية في نص برمجي في وضع -noConsole (مثلًا لـ Get-Credential أو لأمر يحتاج إلى قذيفة cmd.exe) يتم فتح النافذة التالية في الخلفية.
السبب في ذلك هو أنه عند إغلاق النافذة الخارجية، يحاول ويندوز تنشيط النافذة الأم. نظرًا لأن النص البرمجي المُجمّع لا يحتوي على نافذة، يتم تنشيط النافذة الأم للنص البرمجي المُجمّع بدلاً من ذلك، عادةً نافذة مستكشف الملفات أو Powershell.
للتحايل على ذلك، يقوم $Host.UI.RawUI.FlushInputBuffer() بفتح نافذة غير مرئية يمكن تنشيطها. الاستدعاء التالي لـ $Host.UI.RawUI.FlushInputBuffer() يغلق هذه النافذة (وهكذا).
المثال التالي لن يفتح نافذة في الخلفية بعد الآن كما ستفعل استدعاء واحد لـ "ipconfig | Out-String":
$Host.UI.RawUI.FlushInputBuffer()
ipconfig | Out-String
$Host.UI.RawUI.FlushInputBuffer()