কেবলমাত্র আনইনস্টল (এমএসআই এর মাধ্যমে) ঘটে এমন কোনও ওয়াইএক্স কাস্টম অ্যাকশন কীভাবে যুক্ত করবেন?


161

আনইনস্টল করে পুরো ডিরেক্টরি মুছতে আমি কোনও এমএসআই ইনস্টলার ( ওয়াইএক্সের মাধ্যমে তৈরি ) সংশোধন করতে চাই ।

আমি ওয়াইএক্স-এ থাকা বিকল্পগুলি RemoveFileএবং RemoveFolderবিকল্পগুলি বুঝতে পারি, তবে এগুলি ইনস্টলেশনের পরে তৈরি সামগ্রীতে থাকা পুরো ফোল্ডারটিকে পুনরাবৃত্তভাবে মুছতে যথেষ্ট শক্তিশালী নয়।

আমি ওয়াক্স আনইনস্টল করার সময় ফাইলগুলি সরিয়ে ফেলার অনুরূপ স্ট্যাক ওভারফ্লো প্রশ্নটি লক্ষ্য করেছি , তবে আমি ভাবছিলাম যে ফোল্ডারটি মোছার জন্য ব্যাচ স্ক্রিপ্টে একটি কল ব্যবহার করে এটি আরও সহজভাবে করা যায় কিনা।

এটি ওয়াইএক্স ব্যবহার করে আমার প্রথমবার, এবং আমি এখনও কাস্টম ক্রিয়াকলাপের হ্যাং পাচ্ছি । আনইনস্টল করে একটি ব্যাচ স্ক্রিপ্ট চালাবে এমন কাস্টম অ্যাকশনের একটি মৌলিক উদাহরণ কী হবে?

উত্তর:


188

সম্পাদনা : সম্ভবত এখনই নীচে উত্তরটি দেখুন


দীর্ঘদিন ধরে এই বিষয়টি মাথা ব্যথা করে চলেছে। আমি অবশেষে এটি সন্ধান। অনলাইনে কয়েকটি সমাধান রয়েছে, তবে এর মধ্যে কোনওটিই কার্যকরী নয়। এবং অবশ্যই কোনও ডকুমেন্টেশন নেই। সুতরাং নীচের চার্টে বেশ কয়েকটি বৈশিষ্ট্য রয়েছে যা ব্যবহার করার পরামর্শ দেওয়া হয় এবং বিভিন্ন ইনস্টলেশন পরিস্থিতির জন্য তাদের যে মান রয়েছে:

বিকল্প পাঠ

সুতরাং আমার ক্ষেত্রে আমি এমন সিএ চেয়েছিলাম যা কেবল আনইনস্টলগুলিতে চলবে - আপগ্রেড নয়, মেরামত বা সংশোধন করবে না। উপরের টেবিল অনুসারে আমাকে ব্যবহার করতে হয়েছিল

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

এবং এটা কাজ করে!


25
এই চার্টের মানগুলি কি সঠিক? আপনাকে কেন REMOVE = "সমস্ত" যুক্ত করতে হবে? আপগ্রেডিং প্রোডাক্টকোডটি কেবল একটি আনইনস্টল (চার্ট অনুসারে) এর ক্ষেত্রে সত্য, সুতরাং (আপগ্রেডিংপ্রডাক্টকোড নয়) এবং (সরান = "সমস্ত") কেবল একটি আনইনস্টলগুলিতে সত্য হবে। অপসারণ = "সমস্ত" অপ্রয়োজনীয় বলে মনে হচ্ছে।
টড রোপগ

2
আমি @ টোডরোপোগের সাথে একমত - উদাহরণ এবং সত্যের টেবিলটি একমত বলে মনে হচ্ছে না। এটা কি সত্য?
টিম লং

19
সত্যের টেবিলটি কিছুটা ভুল। আপগ্রেডিং প্রোডাক্ট কোডটি প্রথম ইনস্টলের জন্যও সত্য
নীল

2
সাধারণ পরিস্থিতি: alekdavis.blogspot.ru/2013/05/…
KindDragon

1
দয়া করে নিশ্চিত করুন: ইনস্টল করা এবং ইনস্টল করা আলাদা জিনিস, কেবল ইনস্টলড উইন্ডোজ ইনস্টলার দ্বারা সেট করা থাকে। আমি মনে করি না যে ইনস্টলটি কাজ করে।
মিশা উইডেনম্যান

140

ইয়ালুনের উত্তর নিয়ে একাধিক সমস্যা রয়েছে , সম্পত্তির নামগুলিও সংবেদনশীল, Installedসঠিক বানানটি ( INSTALLEDকাজ করবে না)। উপরের টেবিলটি এমন হওয়া উচিত:

এখানে চিত্র বর্ণনা লিখুন

একটি সম্পূর্ণ মেরামতের ধরে নেওয়া এবং সম্পত্তিগুলির প্রকৃত মানগুলি আনইনস্টল করা হতে পারে:

এখানে চিত্র বর্ণনা লিখুন

Wix এক্সপ্রেশন সিনট্যাক্স ডকুমেন্টেশন বলেছেন:

এই অভিব্যক্তিগুলিতে, আপনি সম্পত্তির নাম ব্যবহার করতে পারেন (মনে রাখবেন যে তারা কেস সংবেদনশীল)।

বৈশিষ্ট্যগুলি উইন্ডোজ ইনস্টলার গাইডে নথিভুক্ত করা হয়েছে (যেমন ইনস্টল করা )

সম্পাদনা: প্রথম টেবিলের ছোট সংশোধন; স্পষ্টতই "আনইনস্টল" ঠিক REMOVEসত্তার সাথেই ঘটতে পারে True


3
সরান পরিবর্তন জন্য সেট করা মনে হচ্ছে
szx

2
'আপগ্রেড' কলামটি কি পুরানো সংস্করণের আনইনস্টল ক্রম বা নতুন সংস্করণের ইনস্টল সিকোয়েন্সের সময়?
নিক তিমি

1
@ নিক ভার্যালী: আমি এটির জন্য কিছুক্ষণ সন্ধান করিনি তবে আমি বিশ্বাস করি যে "আপগ্রেড" বিকল্পটি তখনই ইনস্টলকৃত সংস্করণের চেয়ে বড় সংস্করণ ইনস্টল করার সময় is
ahmd0

1
@ অহমড0, অবশ্যই আছে। কিন্তু এখানে একটি নেস্টেড ইনস্টল রয়েছে যা রিয়েলএক্সেস্টিং প্রডাক্টগুলির মধ্যে ঘটে যাগুলির সম্পূর্ণ আলাদা বৈশিষ্ট্য রয়েছে। এটি আপনার 'আপগ্রেড' কলামে রয়েছে। বাকি আপগ্রেডগুলি 'ইনস্টল' কলামের মতো ident
নিক তিমি 21

1
@ নিকওয়ালি: পূর্ববর্তী সংস্করণের আনইনস্টলারটি কার্যকর করার সময় অপসারণের বিকল্পটি মেজর আপগ্রেডগুলির জন্য, যেমন 1.0.0 থেকে 2.0.0 নয়, 1.0.0 থেকে 1.1.0 নয়। নতুন সংস্করণগুলিতে মেজর আপগ্রেড করার সময় একটি কাস্টম অ্যাকশন চালানোর জন্য আপনাকে সেই সংস্করণ আপগ্রেডের জন্য আপনার আপগ্রেড এমএসআই টেবিলের মধ্যে নির্ধারিত অ্যাকশনপ্রপার্টিটি উল্লেখ করতে হবে। symantec.com/connect/articles/msi-upgrade-overview msdn.microsoft.com/en-us/library/aa372379%28v=vs.85%29.aspx
Chaoix

48

আপনি এটি একটি কাস্টম ক্রিয়া দিয়ে করতে পারেন। আপনি এর অধীনে আপনার কাস্টম ক্রিয়ায় একটি রিফ্রান্স যোগ করতে পারেন <InstallExecuteSequence>:

<InstallExecuteSequence>
...
  <Custom Action="FileCleaner" After='InstallFinalize'>
          Installed AND NOT UPGRADINGPRODUCTCODE</Custom>

তারপরে আপনাকে নিজের ক্রিয়াকে নীচেও সংজ্ঞায়িত করতে হবে <Product>:

<Product> 
...
  <CustomAction Id='FileCleaner' BinaryKey='FileCleanerEXE' 
                ExeCommand='' Return='asyncNoWait'  />

যেখানে ফাইলক্লেয়ারেক্সেক্স একটি বাইনারি (আমার ক্ষেত্রে সামান্য সি ++ প্রোগ্রাম যা কাস্টম ক্রিয়া করে) যা এর অধীনে সংজ্ঞায়িতও রয়েছে <Product>:

<Product> 
...
  <Binary Id="FileCleanerEXE" SourceFile="path\to\fileCleaner.exe" />

এটির আসল কৌশলটি Installed AND NOT UPGRADINGPRODUCTCODEকাস্টম অ্যাকশনের শর্ত, আপনার ক্রিয়াটি প্রতিটি আপগ্রেডে চালিত হবে (যেহেতু একটি আপগ্রেড সত্যই একটি আনইনস্টল তখন পুনরায় ইনস্টল করুন)। আপনি যদি ফাইলগুলি মুছতে থাকেন তবে আপগ্রেড করার সময় আপনি সম্ভবত এটি চান না।

পাশের নোটটিতে: আমি ক্রিয়াকলাপের জন্য সি ++ প্রোগ্রামের মতো কিছু ব্যবহার করার ঝামেলার মধ্য দিয়ে যাওয়ার পরামর্শ দিচ্ছি, এটি সরবরাহ করে এমন শক্তি এবং নিয়ন্ত্রণের কারণে ব্যাচের স্ক্রিপ্টের পরিবর্তে - এবং আপনি "সেমিডি প্রম্পট" উইন্ডোটিকে ঝলকানো থেকে আটকাতে পারবেন আপনার ইনস্টলার চালিত।


3
25 upvotes কিন্তু গৃহীত উত্তর নয়। ইনস্টলারদের বিশ্বের আপনাকে স্বাগতম! :)
ক্রিস্টোফার পেইন্টার

4
এটি আসলে কাজ করে না। আপনি যখন নিজের ফাইল ফ্লেইনারে ইনস্টল করা একটি ফাইলক্লেয়ার.এক্স্সি এক্সিকিউট করতে চান, এটি একটি মুরগি ও ডিমের সমস্যা CustomActionহবে : "মৃত্যুর পরে 'ইনস্টলফাইনালাইজ' কার্যকর করা হবে। এই মুহুর্তে, সমস্ত ফাইল ইনস্টলেশন ফোল্ডার থেকে সরানো হবে। FileCleaner.exe। সুতরাং আপনি এটি একটি কাস্টম অ্যাকশনের মাধ্যমে কার্যকর করতে সক্ষম নন। এই উত্তরটি কেবল ভুল। আমি 42 টি উর্ধ্বতন সম্পর্কে ভাবছি!
সাইমন

40

ব্যাচ স্ক্রিপ্টের সবচেয়ে বড় সমস্যা হ'ল রোলব্যাক পরিচালনা করা যখন ব্যবহারকারী ক্লিক বাতিল করেন (বা আপনার ইনস্টলের সময় কিছু ভুল হয়ে যায়)। এই পরিস্থিতিটি হ্যান্ডেল করার সঠিক উপায় হ'ল একটি কাস্টম অ্যাকশন তৈরি করা যা সরানফিলস সারণিতে অস্থায়ী সারি যুক্ত করে। এইভাবে উইন্ডোজ ইনস্টলার আপনার জন্য রোলব্যাক কেসগুলি পরিচালনা করে। সমাধানটি দেখলে এটি অত্যন্ত উন্মুক্ত is

যাইহোক, আনইনস্টল করার সময় কেবলমাত্র কোনও ক্রিয়াকলাপ চালানোয় একটি শর্ত উপাদান যুক্ত করুন:

REMOVE ~= "ALL"

~ = বলুন তুলনামূলক সংবেদনশীল (যদিও আমি মনে করি সবসময় বড় হয়)। দেখুন অবস্থা সিনট্যাক্স সম্পর্কে এমএসআই SDK এর ডকুমেন্টেশন দেখুন।

পিএস: এমন কোনও ঘটনা ঘটেনি যেখানে বসে বসে ভাবলাম, "ওহ, ব্যাচ ফাইল কোনও ইনস্টলেশন প্যাকেজে একটি ভাল সমাধান হতে পারে।" প্রকৃতপক্ষে, কোনও ব্যাচ ফাইল রয়েছে এমন একটি প্যাকেজ প্যাকেজ সন্ধান করা কেবল আমাকে ফেরত দেওয়ার জন্য পণ্যটি ফিরে আসতে উত্সাহিত করবে।


আমি একটি ব্যাচের স্ক্রিপ্ট ব্যবহার করতে চলেছিলাম এবং তারপরে পিএস বিভাগটি দেখেছি। আমাকে বাঁচানোর জন্য ধন্যবাদ:) মুছে ফেলুন ~ = "সমস্ত" আমার পক্ষে কাজ করেছে।
আরনম্ব

12

এখানে এমন বৈশিষ্ট্যের একটি সেট রয়েছে যা আমি অন্তর্নির্মিত স্টাফের চেয়ে ব্যবহারের জন্য আরও স্বজ্ঞাত বোধ করি। শর্তগুলি উপরের আহমড0 দ্বারা সরবরাহিত সত্যের টেবিলের ভিত্তিতে তৈরি।

<!-- truth table for installer varables (install vs uninstall vs repair vs upgrade) https://stackoverflow.com/a/17608049/1721136 -->
 <SetProperty Id="_INSTALL"   After="FindRelatedProducts" Value="1"><![CDATA[Installed="" AND PREVIOUSVERSIONSINSTALLED=""]]></SetProperty>
 <SetProperty Id="_UNINSTALL" After="FindRelatedProducts" Value="1"><![CDATA[PREVIOUSVERSIONSINSTALLED="" AND REMOVE="ALL"]]></SetProperty>
 <SetProperty Id="_CHANGE"    After="FindRelatedProducts" Value="1"><![CDATA[Installed<>"" AND REINSTALL="" AND PREVIOUSVERSIONSINSTALLED<>"" AND REMOVE=""]]></SetProperty>
 <SetProperty Id="_REPAIR"    After="FindRelatedProducts" Value="1"><![CDATA[REINSTALL<>""]]></SetProperty>
 <SetProperty Id="_UPGRADE"   After="FindRelatedProducts" Value="1"><![CDATA[PREVIOUSVERSIONSINSTALLED<>"" ]]></SetProperty>

এখানে কিছু নমুনা ব্যবহার রয়েছে:

  <Custom Action="CaptureExistingLocalSettingsValues" After="InstallInitialize">NOT _UNINSTALL</Custom>
  <Custom Action="GetConfigXmlToPersistFromCmdLineArgs" After="InstallInitialize">_INSTALL OR _UPGRADE</Custom>
  <Custom Action="ForgetProperties" Before="InstallFinalize">_UNINSTALL OR _UPGRADE</Custom>
  <Custom Action="SetInstallCustomConfigSettingsArgs" Before="InstallCustomConfigSettings">NOT _UNINSTALL</Custom>
  <Custom Action="InstallCustomConfigSettings" Before="InstallFinalize">NOT _UNINSTALL</Custom>

সমস্যা:

  • UPGRADINGPRODUCTCODE সরানএক্সেস্টিং প্রডাক্টস ক্রিয়াকলাপের সময় সেট করা আছে, সুতরাং আপনি যে কোনও কাস্টম ক্রিয়াকলাপ আগে চালিত করবেন তা এটি কোনও আপগ্রেড https://docs.microsoft.com/en-us/windows/desktop/Msi/upgradingproductcode জানতে পারবে না

এটি একটি দুর্দান্ত সমাধান। প্যাচ এবং এমএসপ্যাচক্রিমোভ শর্তগুলিও বিবেচনা করতে ভুলবেন না।
গ্রেট জ্যাক্স

আপনার সত্য সারণীতে, আপনি কি আহমদ0 দ্বারা ব্যবহৃত ইউপিগ্র্যাডিংপ্রডাক্টকোডের পরিবর্তে প্রিভিউসভিউশনসনস্টলযুক্ত ব্যবহার করতে চান? আমি এমএসআই সম্পত্তি রেফারেন্স পৃষ্ঠাতে ( ডকস.মাইক্রোসফট.ইন / উইন্ডস / উইন্ডো 32 / msi / property-references ) প্রিভিওউসভারশনসিন্টল এর কোনও রেফারেন্স দেখছি না ।
প্যাট্রিক

আপনার সম্পত্তিগুলির জন্য বেশ কয়েকটি পূর্বাভাস আহমাদ0 এর সারণীতে সমস্ত সারি বিবেচনা করে না (ইনস্টল করা, পুনরায় ইনস্টল করুন, আপগ্রেডিংপ্রডাক্টকোডে এবং সরান)। আপনি দয়া করে কেন ব্যাখ্যা করবেন?
প্যাট্রিক

0

আমি C ++ DLL এ আলাদাভাবে কোডেড কাস্টম অ্যাকশন ব্যবহার করেছি এবং এই বাক্য গঠনটি ব্যবহার করে আনইনস্টল করার জন্য উপযুক্ত ফাংশনটি কল করতে DLL ব্যবহার করেছি:

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

উপরের কোড ব্লকটি ব্যবহার করে, আমি আনইনস্টল করে সি ++ ডিএলএল সংজ্ঞায়িত কোনও ফাংশন চালাতে সক্ষম হয়েছি। এফওয়াইআই, আমার আনইনস্টল ফাংশনটিতে বর্তমান ব্যবহারকারী ডেটা এবং রেজিস্ট্রি এন্ট্রি ক্লিয়ারিং সম্পর্কিত কোড ছিল had

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.