wix एक वाईएक्स कस्टम एक्शन कैसे जोड़ें जो केवल अनइंस्टॉल(एमएसआई के माध्यम से) पर होता है?




windows-installer custom-action (4)

बैच स्क्रिप्ट के साथ सबसे बड़ी समस्या रोलबैक को संभालने पर है जब उपयोगकर्ता रद्द करता है (या आपके इंस्टॉल के दौरान कुछ गलत हो जाता है)। इस परिदृश्य को संभालने का सही तरीका कस्टमएक्शन बनाना है जो RemoveFiles तालिका में अस्थायी पंक्तियों को जोड़ता है। इस तरह विंडोज इंस्टालर आपके लिए रोलबैक मामलों को संभालता है। जब आप समाधान देखते हैं तो यह बेहद सरल है।

वैसे भी, अनइंस्टॉल के दौरान केवल एक क्रिया निष्पादित करने के लिए एक शर्त तत्व जोड़ें:

REMOVE ~= "ALL"

~ = कहते हैं केस असंवेदनशील तुलना करें (भले ही मुझे लगता है कि सभी हमेशा uppercaesd है)। अधिक जानकारी के लिए शर्तें सिंटैक्स के बारे में एमएसआई एसडीके दस्तावेज देखें।

पीएस: ऐसा कोई मामला कभी नहीं रहा है जहां मैं बैठ गया और सोचा, "ओह, बैच फ़ाइल एक इंस्टॉलेशन पैकेज में एक अच्छा समाधान होगा।" असल में, एक इंस्टॉलेशन पैकेज ढूंढना जिसमें बैच फ़ाइल है, केवल मुझे धनवापसी के लिए उत्पाद वापस करने के लिए प्रोत्साहित करेगी।

मैं अनइंस्टॉल करने पर पूरी निर्देशिका को हटाने के लिए एक एमएसआई इंस्टॉलर ( WiX के माध्यम से बनाया गया) को संशोधित करना चाहता हूं।

मैं RemoveFile में RemoveFile और RemoveFolder विकल्पों को समझता हूं, लेकिन ये इंस्टॉलेशन के बाद बनाई गई सामग्री वाले पूरे फ़ोल्डर को RemoveFile हटाने के लिए पर्याप्त मजबूत नहीं हैं।

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

यह मेरा पहला समय वाईएक्स का उपयोग कर रहा है, और मुझे अभी भी कस्टम कार्यों का लटका मिल रहा है। एक कस्टम कार्रवाई का मूल उदाहरण क्या होगा जो अनइंस्टॉल करने पर बैच स्क्रिप्ट चलाएगा?


मैंने सी ++ डीएलएल में अलग-अलग कस्टम एक्शन का इस्तेमाल किया और इस वाक्यविन्यास का उपयोग करके अनइंस्टॉल करने पर उपयुक्त फ़ंक्शन को कॉल करने के लिए डीएलएल का उपयोग किया:

<CustomAction Id="Uninstall" BinaryKey="Dll_Name" 
              DllEntry="Function_Name" Execute="deferred" />

उपरोक्त कोड ब्लॉक का उपयोग करके, मैं अनइंस्टॉल पर C ++ DLL में परिभाषित किसी भी फ़ंक्शन को चलाने में सक्षम था। एफवाईआई, मेरे अनइंस्टॉल फ़ंक्शन में क्लियरिंग वर्तमान उपयोगकर्ता डेटा और रजिस्ट्री प्रविष्टियों के संबंध में कोड था।


संपादित करें : शायद नीचे तुरंत जवाब देखें।

यह विषय लंबे समय तक सिरदर्द रहा है। मुझे अंत में यह समझ आ गया। कुछ समाधान ऑनलाइन हैं, लेकिन उनमें से कोई वास्तव में काम नहीं करता है। और निश्चित रूप से कोई दस्तावेज नहीं है। तो नीचे दिए गए चार्ट में कई गुण हैं जिनका उपयोग करने के लिए सुझाव दिया गया है और उनके पास विभिन्न स्थापना परिदृश्यों के लिए मूल्य हैं:

तो मेरे मामले में मैं एक सीए चाहता था जो केवल अनइंस्टॉल पर चलेगा - उन्नयन नहीं, मरम्मत या संशोधित नहीं। उपरोक्त तालिका के अनुसार मुझे उपयोग करना पड़ा

<Custom Action='CA_ID' Before='other_CA_ID'>
        (NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>

और यह काम किया!


यलुना के उत्तर के साथ कई समस्याएं हैं, संपत्ति के नाम भी केस संवेदनशील हैं, Installed सही वर्तनी है ( Installed नहीं INSTALLED जाएगा)। ऊपर दी गई तालिका यह होनी चाहिए:

एक पूर्ण मरम्मत और संपत्तियों के वास्तविक मूल्यों को अनइंस्टॉल करने के साथ-साथ यह भी हो सकता है:

वाईएक्स एक्सप्रेशन सिंटेक्स दस्तावेज कहता है:

इन अभिव्यक्तियों में, आप संपत्ति के नामों का उपयोग कर सकते हैं (याद रखें कि वे केस संवेदनशील हैं)।

गुण विंडोज इंस्टालर गाइड (जैसे Installed ) पर दस्तावेज किए गए हैं

संपादित करें: पहली तालिका में छोटे सुधार; स्पष्ट रूप से "अनइंस्टॉल" भी सही होने के साथ ही हो सकता है।