2011-02-08 6 views
5

वाईएक्स DirectorySearch में यह निर्धारित करने के लिए उपयोग किया जा सकता है कि लक्ष्य कंप्यूटर पर कोई विशिष्ट निर्देशिका मौजूद है या नहीं। लेकिन मुझे समझ में नहीं आता कि यह निर्धारित करने के लिए एक सतत तरीका है कि निर्देशिका मौजूद नहीं है।इंस्टॉल समय पर किसी निर्देशिका की उपस्थिति का पता लगाना

उदाहरण के लिए:

<Property Id="INSTALLDIR" Secure="yes"> 
    <RegistrySearch Id='InstallDir' Type='directory' 
    Root='HKLM' Key='Software\Company\Product\Install' Name='InstallPath'/> 
</Property> 
<Property Id='IS_INSTALLED' Secure='yes'> 
    <DirectorySearch Id='IsInstalled' Path='[INSTALLDIR]' /> 
</Property> 

जब दोनों रजिस्ट्री कुंजी और निर्देशिका मौजूद, IS_INSTALLED संपत्ति पथ DirectorySearch द्वारा लौटाए को तैयार है।

जब निर्देशिका मौजूद नहीं है, IS_INSTALLED "सी: \" पर सेट प्रतीत होता है।

है की तरह एक शर्त:

<Condition>NOT (IS_INSTALLED = "C:\")</Condition> 

कि निर्देशिका मिला था पता लगाने के लिए एक विश्वसनीय तरीका है? क्या कोई बेहतर तरीका है?

उत्तर: यहाँ WiX mrnxs answer के आधार पर कोड है कि मैं

<Property Id="PRODUCT_IS_INSTALLED" Secure="yes"> 
    <RegistrySearch Id='RegistrySearch1' Type='directory' 
    Root='HKLM' Key='Software\Company\Product\Version\Install' Name='Path'> 
    <DirectorySearch Id='DirectorySearch1' Path='[PRODUCT_IS_INSTALLED]'/> 
    </RegistrySearch> 
</Property> 

<CustomAction Id='SET_INSTALLDIR' 
       Property='INSTALLDIR' 
       Value='[PRODUCT_IS_INSTALLED]'/> 

<InstallExecuteSequence> 
    <Custom Action='SET_INSTALLDIR' After='AppSearch'></Custom> 
</InstallExecuteSequence> 

उत्तर

4

आमतौर पर ऐसा होता है जब संपत्ति को संपत्ति-आधारित फ़ोल्डर के रूप में उपयोग किया जाता है। इस मामले में CostFinalize कार्रवाई स्वचालित रूप से संपत्ति को वैध पथ पर सेट करती है (उदाहरण के लिए "सी: \") ताकि फ़ोल्डर को विंडोज इंस्टालर द्वारा उपयोग किया जा सके।

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

  • के लिए

    • उपयोग कोई कस्टम गुण (उदाहरण के लिए एक प्रकार 51 custom action (स्वरूपित पाठ के साथ सेट संपत्ति) का उपयोग ट पथ को यह गुण सेट करने के लिए "[ProgramFilesFolder] MyCompany \ MyProduct ")
    • , खोज
    • उपयोग अपनी खोज संपत्ति

    उदाहरण के लिए करने के लिए फ़ोल्डर गुण सेट करने के लिए एक और प्रकार 51 कस्टम क्रिया के लिए एक और संपत्ति का उपयोग अपने से अगर आर्क IS_INSTALLED है आपका फ़ोल्डर IS_INSTALLED_PATH का उपयोग कर सकता है। IS_INSTALLED_PATH को डिफ़ॉल्ट पथ पर सेट किया जा सकता है और ऐपशर्च एक्शन के बाद यदि आप कुछ खोज पाते हैं तो आप इसे IS_INSTALLED पर सेट कर सकते हैं।

    इस तरह आप कंडीशनिंग के लिए उपयोग कर सकते हैं:

    IS_INSTALLED 
    

    या

    NOT IS_INSTALLED 
    
  • +0

    हाय कॉस्मीन, विवरण के लिए धन्यवाद। मेरी समस्या यह है कि आपके कदमों में से एक अनिवार्य रूप से मुझे अपने प्रारंभिक प्रश्न के साथ छोड़ देता है। आप कहते हैं "... यदि आप कुछ खोज पाते हैं तो आप इसे IS_INSTALLED पर सेट कर सकते हैं"। ऐपशर्च हमेशा "कुछ" ढूंढता प्रतीत होता है भले ही यह ओएस ड्राइव की जड़ है। –

    +0

    खोज संपत्ति केवल रूट ड्राइव पर सेट है यदि वह संपत्ति आपके एमएसआई में किसी फ़ोल्डर से जुड़ी है। यदि आप उस संगठन को हटाते हैं (उदाहरण के लिए फ़ोल्डर के लिए किसी अन्य प्रॉपर्टी का उपयोग करके), तो खोज संपत्ति खाली होनी चाहिए जब उसे कुछ भी नहीं मिलता है। असल में, आपकी खोज संपत्ति का उपयोग केवल खोज के द्वारा किया जाना चाहिए ताकि यह सुनिश्चित किया जा सके कि यह आपके इच्छित तरीके से निर्धारित है। –

    0

    Understaing AppSearch के RegLocator और DrLocator पैटर्न स्वीकार किए जाते हैं एक छोटे से मुश्किल हो सकता है है। मैं एक पल के लिए स्थिति को अनदेखा कर रहा हूं और यह पुष्टि करने के लिए इंस्टॉल कर रहा हूं कि ऐपशर्च आपके इच्छित गुणों को सही ढंग से सेट कर रहा है। पहले उस अंत में मिलने वाली समस्याओं को ठीक करें। जब यह काम करता है तो संपत्ति रजिस्ट्री के मूल्य या निर्देशिका के पथ पर सेट की जाएगी।

    तो फिर तुम उपयोग करने के लिए सक्षम होना चाहिए:

    <Condition>IS_INSTALLED/> <!-- it's not important what the value is, just that it exists --> 
    <Condition>Not IS_INSTALLED/> 
    

    Btw, मैं संपत्ति INSTALLDIR उपयोग करने से बचें होगा। मेरे इंस्टॉलर (इंस्टालशिल्ड) में जिनके पास इंस्टॉलेशन के मुख्य फोकल पॉइंट के रूप में विशेष अर्थ है।

    0

    एक और दृष्टिकोण इस किया जा सकता है, इस में आप अनुक्रम स्थापित जारी रख सकते हैं आप कहीं से INSTALLDIR सेट करना चाहते हैं अन्यथा, यदि SystemDir और RegisteryDir समान नहीं है

    <Property Id="RegisteryDir" Secure="yes"> 
    <RegistrySearch Id='InstallDir' Type='directory' 
    Root='HKLM' Key='Software\Company\Product\Install' Name='InstallPath'/> 
    </Property> 
    <Property Id='SystemDir' Secure='yes'> 
    <DirectorySearch Id='IsInstalled' Path='[RegisteryDir]' /> 
    </Property> 
    <CustomAction Id="SET_INSTALL_DIR" Property="INSTALLDIR" Value="[SystemDir] /> 
    
    <InstallExecuteSequence> 
    <Custom Action='SET_INSTALLDIR' After='AppSearch'> 
    SystemDir AND SystemDir=RegisteryDir 
    </Custom> 
    </InstallExecuteSequence> 
    
    संबंधित मुद्दे