
पावरशेल स्क्रिप्ट्स को एक्जीक्यूटेबल्स में संकलित करने का मॉड्यूल
Ingo Karstein के महान स्क्रिप्ट का अतिरिक्त कार्य, GUI समर्थन के साथ। GUI आउटपुट और इनपुट एक स्विच से सक्रिय होते हैं, वास्तविक विंडोज़ निष्पादन योग्य बनाए जाते हैं। केवल 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 या x64 = केवल 32-बिट या 64-बिट रनटाइम के लिए संकलित करें
lcid = संकलित निष्पादन योग्य के लिए स्थान आईडी। यदि निर्दिष्ट नहीं है तो वर्तमान उपयोगकर्ता संस्कृति का उपयोग करें
STA या MTA = 'सिंगल थ्रेड अपार्टमेंट' या 'मल्टी थ्रेड अपार्टमेंट' मोड
noConsole = परिणामी निष्पादन योग्य कंसोल विंडो के बिना एक विंडोज फॉर्म्स ऐप होगा
conHost = विंडोज टर्मिनल के बजाय कंसोल के रूप में कॉनहोस्ट के साथ प्रारंभ करने के लिए बाध्य करें (रीडायरेक्शन अक्षम करता है)
UNICODEEncoding = कंसोल मोड में आउटपुट को UNICODE के रूप में एन्कोड करें
credentialGUI = कंसोल मोड में क्रेडेंशियल संकेत देने के लिए GUI का उपयोग करें
iconFile = संकलित निष्पादन योग्य के लिए आइकन फ़ाइल नाम
embedFiles = एम्बेड करने के लिए फ़ाइलें हैश के रूप में दी जाती हैं, हैश की कुंजी में निकाली जाएंगी, स्रोत फ़ाइल नाम अद्वितीय होने चाहिए
(जैसे -embedFiles @{'Targetfilepath'='Sourcefilepath'} )
title = शीर्षक जानकारी (विंडोज एक्सप्लोरर के गुण संवाद के विवरण टैब में प्रदर्शित)
description = विवरण जानकारी (प्रदर्शित नहीं, लेकिन निष्पादन योग्य में एम्बेडेड)
company = कंपनी जानकारी (प्रदर्शित नहीं, लेकिन निष्पादन योग्य में एम्बेडेड)
product = उत्पाद जानकारी (विंडोज एक्सप्लोरर के गुण संवाद के विवरण टैब में प्रदर्शित)
copyright = कॉपीराइट जानकारी (विंडोज एक्सप्लोरर के गुण संवाद के विवरण टैब में प्रदर्शित)
trademark = ट्रेडमार्क जानकारी (विंडोज एक्सप्लोरर के गुण संवाद के विवरण टैब में प्रदर्शित)
version = संस्करण जानकारी (विंडोज एक्सप्लोरर के गुण संवाद के विवरण टैब में प्रदर्शित)
configFile = कॉन्फ़िग फ़ाइल लिखें (<outputfile>.exe.config)
noOutput = परिणामी निष्पादन योग्य कोई मानक आउटपुट उत्पन्न नहीं करेगा (वर्बोज़ और सूचना चैनल शामिल हैं)
noError = परिणामी निष्पादन योग्य कोई त्रुटि आउटपुट उत्पन्न नहीं करेगा (चेतावनी और डीबग चैनल शामिल हैं)
noVisualStyles = उत्पन्न विंडोज GUI एप्लिकेशन के लिए विज़ुअल स्टाइल अक्षम करें (केवल -noConsole के साथ)
exitOnCancel = जब Read-Host इनपुट बॉक्स में रद्द करें या "X" चुना जाता है तो प्रोग्राम से बाहर निकलें (केवल -noConsole के साथ)
DPIAware = यदि डिस्प्ले स्केलिंग सक्रिय है, तो GUI नियंत्रण यदि संभव हो तो स्केल किए जाएंगे (केवल -noConsole के साथ)
requireAdmin = यदि UAC सक्षम है, तो संकलित निष्पादन योग्य केवल उन्नत संदर्भ में चलेगा (यदि आवश्यक हो तो UAC संवाद प्रकट होता है)
supportOS = नवीनतम विंडोज संस्करणों के कार्यों का उपयोग करें (अंतर देखने के लिए [Environment]::OSVersion निष्पादित करें)
virtualize = एप्लिकेशन वर्चुअलाइजेशन सक्रिय है (x86 रनटाइम को बाध्य करता है)
longPaths = यदि OS पर सक्षम है तो लंबे पथ (> 260 वर्ण) सक्षम करें (केवल विंडोज 10 के साथ काम करता है)
एक उत्पन्न निष्पादन योग्य में निम्नलिखित आरक्षित पैरामीटर होते हैं:
-? [<MODIFIER>] निष्पादन योग्य के अंदर स्क्रिप्ट का Powershell सहायता पाठ। वैकल्पिक पैरामीटर संयोजन
"-? -detailed", "-? -examples" या "-? -full" का उपयोग उपयुक्त सहायता पाठ प्राप्त करने के लिए किया जा सकता है।
-debug निष्पादन योग्य को डीबग करने के लिए बाध्य करता है। यह "System.Diagnostics.Debugger.Launch()" को कॉल करता है।
-extract:<FILENAME> निष्पादन योग्य के अंदर पावरशेल स्क्रिप्ट निकालता है और इसे FILENAME के रूप में सहेजता है।
स्क्रिप्ट निष्पादित नहीं की जाएगी।
-wait स्क्रिप्ट निष्पादन के अंत में यह "Hit any key to exit..." लिखता है और कोई कुंजी दबाने की प्रतीक्षा करता है।
-end निम्नलिखित सभी विकल्प निष्पादन योग्य के अंदर स्क्रिप्ट को पास किए जाएंगे।
पिछले सभी विकल्प निष्पादन योग्य द्वारा स्वयं उपयोग किए जाते हैं और स्क्रिप्ट को पास नहीं किए जाएंगे।
PS2EXE का उपयोग पावरशेल कोर के साथ किया जा सकता है। ऐसा करने के लिए बस ऊपर बताए अनुसार पावरशेल कोर में मॉड्यूल PS2EXE स्थापित करें। लेकिन चूंकि .Net Core कंपाइलर के साथ नहीं आता है, इसलिए .Net Framework के कंपाइलर का उपयोग किया जाता है (.Net Framework और Powershell 5.1 विंडोज में शामिल हैं)।
इस कारण PS2EXE केवल Powershell 5.1 संगत स्क्रिप्ट को संकलित कर सकता है और .Net 4.x बाइनरी उत्पन्न करता है, लेकिन फिर भी बिना किसी निर्भरता के प्रत्येक समर्थित विंडोज OS पर सीधे उपयोग किया जा सकता है।
पैरामीटर -embedFiles और उसके बाद फ़ाइलों के पथों के साथ एक हैश तालिका का उपयोग करके उन फ़ाइलों को संकलित निष्पादन योग्य में एम्बेड किया जाएगा। निष्पादन योग्य के स्टार्टअप पर वे फ़ाइलें निर्दिष्ट पथों पर डिस्क पर लिखी जाएंगी, जैसे -embedFiles @{'Targetfilepath1'='Sourcefilepath1';'Targetfilepath2'='Sourcefilepath2'}। स्रोत फ़ाइल नाम अद्वितीय होने चाहिए। निरपेक्ष और सापेक्ष पथों की अनुमति है। लक्ष्य पथों के लिए '.\' से शुरू होने वाले सापेक्ष पथ को निष्पादन योग्य के सापेक्ष माना जाता है, अग्रणी '.\' के बिना रनटाइम पर वर्तमान पथ के सापेक्ष माना जाता है। स्टार्टअप पर यदि आवश्यक हो तो निर्देशिकाएं स्वचालित रूप से बनाई जाती हैं। लक्ष्य पथ में cmd.exe संकेतन में पर्यावरण चर जैसे %TEMP% या %APPDATA% का रनटाइम पर विस्तार किया जाता है। एम्बेडेड फ़ाइलों में से एक बनाने में विफलता संकलित निष्पादन योग्य के निष्पादन को तुरंत रोक देगी।
PS2EXE के लिए मूल इनपुट/आउटपुट कमांड को C# में फिर से लिखना पड़ा। कंसोल मोड में Write-Progress (बहुत अधिक काम) और Start-Transcript/Stop-Transcript (Microsoft द्वारा कोई उचित संदर्भ कार्यान्वयन नहीं) लागू नहीं किए गए हैं।
डिफ़ॉल्ट रूप से पावरशेल में कमांडलेट के आउटपुट को लाइन दर लाइन (स्ट्रिंग्स की एक सरणी के रूप में) स्वरूपित किया जाता है। जब आपका कमांड 10 लाइनों का आउटपुट उत्पन्न करता है और आप GUI आउटपुट का उपयोग करते हैं, तो 10 संदेश बॉक्स दिखाई देंगे, प्रत्येक एक OK की प्रतीक्षा करेगा। इसे रोकने के लिए अपने कमांड को कमांडलेट 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 शेल की आवश्यकता होती है) तो अगली विंडो पृष्ठभूमि में खोली जाती है।
इसका कारण यह है कि बाहरी विंडो बंद करने पर विंडोज मूल विंडो को सक्रिय करने का प्रयास करता है। चूंकि संकलित स्क्रिप्ट में कोई विंडो नहीं है, इसलिए संकलित स्क्रिप्ट की मूल विंडो सक्रिय हो जाती है, आमतौर पर एक्सप्लोरर या पावरशेल की विंडो।
इसे हल करने के लिए, $Host.UI.RawUI.FlushInputBuffer() एक अदृश्य विंडो खोलता है जिसे सक्रिय किया जा सकता है। $Host.UI.RawUI.FlushInputBuffer() का अगला कॉल इस विंडो को बंद करता है (और इसी प्रकार)।
निम्न उदाहरण अब पृष्ठभूमि में एक विंडो नहीं खोलेगा जैसा कि "ipconfig | Out-String" का एक एकल कॉल करेगा:
$Host.UI.RawUI.FlushInputBuffer()
ipconfig | Out-String
$Host.UI.RawUI.FlushInputBuffer()