2010-03-03 6 views
22

हम इस तरह के रूप में काम करने के लिए है कि कमांड लाइन चलाता है एक कस्टम क्रिया मिल गया है:WiX - CustomAction ExeCommand - छुपाएं कंसोल

<CustomAction Id="OurAction" 
       FileKey="OurInstalledExe.exe" 
       ExeCommand="our command line args" 
       Execute="deferred" 
       Return="check" /> 

समस्या है, तो उपयोगकर्ता एक कंसोल पॉपअप देखता है जब आदेश चलाता है।

कमांड लाइन को यूएसी ऊंचाई की आवश्यकता है, लेकिन किसी भी उपयोगकर्ता इंटरैक्शन की आवश्यकता नहीं है। हम फ़ाइल को सेटअप के साथ भी इंस्टॉल करते हैं, कस्टम एक्शन रन = "इंस्टॉलफाइल" के बाद चलता है।

हम उपयोगकर्ता को कंसोल देखने से कैसे रोक सकते हैं?

उत्तर

2

यदि आपके पास EXE फ़ाइल का स्रोत कोड है तो आप यही कर सकते हैं। कंसोल अनुप्रयोग के बजाय EXE प्रोजेक्ट Win32 एप्लिकेशन प्रोजेक्ट बनाएं।

आप EXE फ़ाइल के स्रोत कोड संशोधित नहीं कर सकते हैं, तो आप ऐसा कर सकते हैं:

  1. , एक CustomAction DLL
  2. बनाना DLL (WiX से) में एक CustomAction कॉलिंग प्रक्रिया निष्पादित करने के लिए से कंसोल विंडो छुपाएं।
+0

हमारे पास प्रक्रिया के स्रोत कोड तक कोई पहुंच नहीं है, हमने अन्यथा एक कस्टम कार्रवाई लिखी होगी। क्या यह एकमात्र तरीका है? यह एक गैर-ब्रेनर सेटिंग की तरह लगता है कि वाईएक्स होना चाहिए। प्रक्रिया शुरू करने के लिए मुझे कस्टम कार्रवाई क्यों लिखनी पड़ेगी? – jonathanpeppers

6

ध्यान दें कि यदि आपको यूएसी ऊंचाई की आवश्यकता है, तो आपको यह सुनिश्चित करना होगा कि यह एक स्थगित निष्पादन सीए है। कमांड लाइन तर्क जोड़े गए मैनुअल से उदाहरण यहां दिया गया है।

<CustomAction Id="QtExecDeferredExampleWithProperty_Cmd" Property="QtExecDeferredExampleWithProperty" 
       Value="&quot;[#MyExecutable.exe]&quot; /arguments" Execute="immediate"/> 
<CustomAction Id="QtExecDeferredExampleWithProperty" BinaryKey="WixCA" DllEntry="CAQuietExec" 
       Execute="deferred" Return="check" Impersonate="no"/> 
. 
. 
. 
<InstallExecuteSequence> 
    <Custom Action="QtExecDeferredExampleWithProperty_Cmd" After="CostFinalize"/> 
    <Custom Action="QtExecDeferredExampleWithProperty" After="TheActionYouWantItAfter"/> 
</InstallExecuteSequence> 
+0

धन्यवाद, हम पहले से ही यह कर रहे हैं। – jonathanpeppers

+1

यह समाधान आपकी रजिस्ट्री को नष्ट करने का जोखिम रखता है। मैं कमांड लाइन से अपने इंस्टॉलर्स को संकलित कर रहा हूं, और 'DllEntry = "CAQuietExec"' लाइन इंस्टॉलर को ठीक से स्थापित करने के कारण मेरी रजिस्ट्री को अपरिवर्तनीय स्थिति में डालती है, लेकिन फ़ाइलों को बाहर निकलने की आवश्यकता नहीं होती है। आखिरकार मैंने अपने वीएम को पुनर्जीवित करने से पहले इसे ठीक करने की कोशिश करने में कई घंटे बिताए। मुझे अंक बहाल करना चाहिए था, लेकिन निश्चित रूप से मैंने नहीं किया (मेरी वीएम की बेस सेटिंग्स संदिग्ध थीं)। अंत में छोड़ने से पहले यह मेरे समय के बर्बाद घंटे। सावधान रहे! – Shadoninja

0

तुम बस cmd.exe

ExeCommand="[SystemFolder]cmd.exe /C start MyExe.exe &amp; exit" 

आशा के लिए दूसरा आदेश 'प्रस्थान' जोड़ने के लिए, यह आप में मदद करता है

+0

आप अभी भी कंसोल पॉपअप असली त्वरित देखेंगे। यह बहुत अवांछनीय है, खराब यूआई डिज़ाइन की तरह लगता है, और बहुत "चॉप शॉप"। – jonathanpeppers

+1

2007 के बाद से विक्स का यह मुद्दा है। मुद्दा अभी भी तय नहीं हुआ है। Cmd का उपयोग करना मेरे लिए छोटे कार्यक्रमों में कामकाजी काम कर रहा है। मैंने इस्तेमाल किया Wix का उपयोग नहीं करते हैं। –

+1

ठीक है, स्वीकृत उत्तर कार्य करता है। कोई बदसूरत cmd पॉपअप के साथ। – jonathanpeppers

-1

है कि एक में एक चिकन और अंडे की समस्या का एक सा नहीं है इसे शुरू करने से पहले निष्पादन योग्य को कंसोल ऐप के रूप में चिह्नित किया जाना चाहिए, और यदि आप कंसोल पॉपिंग के बिना ऐसे एक्सई लॉन्च करना चाहते हैं, तो इसे सही झंडे के साथ अपनी प्रक्रिया बनाना होगा। यदि आपका इंस्टॉलर इन्हें प्रदान नहीं कर सकता है, तो बीच में एक तिहाई .exe का उपयोग करना संभव है। उदाहरण के लिए, कीबाज़ इंस्टॉलर पृष्ठभूमि में लगातार कंसोल ऐप्स चलाने के लिए this small utility लॉन्च करता है जिसमें कोई चमकती ब्लैक विंडो नहीं होती है।