ইনো সেটআপ: পূর্ববর্তী ইনস্টল করা সংস্করণটি কীভাবে স্বয়ংক্রিয়ভাবে আনইনস্টল করবেন?


90

আমি ইনস্টলার তৈরি করতে ইনো সেটআপ ব্যবহার করছি।

আমি ইনস্টলারটি ওভাররাইট করার পরিবর্তে পূর্ববর্তী ইনস্টল করা সংস্করণটি স্বয়ংক্রিয়ভাবে আনইনস্টল করতে চাই। আমি এটা কিভাবে করবো?


4
নোট যে হিসাবে mlaan বলেন সেখানে সাধারণত একটি অ Inno সংস্করণ থেকে এসেছো আপগ্রেড যদি না আপনি একটি Inno ভিত্তিক সেটআপ এই কাজ করতে কোন প্রয়োজন নেই।
Deanna

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

4
@ নায়ারগডস কিন্তু ইনোসেটআপ ইনস্টলেশন শুরু হওয়ার আগে কিছু ফাইল / ফোল্ডার মুছে ফেলার বিকল্প ("ইনস্টলডিলিট" পতাকা) সরবরাহ করে যাতে আপনার এখনও পুরানো সংস্করণটি আনইনস্টল করার প্রয়োজন হবে না।
নিক

4
@ নিকজি: আবারও মামলার উপর নির্ভর করে। এটি হ'ল আদর্শ পরিস্থিতি, হ্যাঁ, এবং এখন পর্যন্ত সবচেয়ে পছন্দের পরিস্থিতিটি রয়েছে তবে বাস্তবে, আদর্শহীন পরিস্থিতি রয়েছে। এরকম একটি উদাহরণ সম্ভাব্য অনেকগুলি টার্গেট সংস্করণে, dll ফাইলগুলি নিবন্ধিত।
নায়ারগডস

উত্তর:


28

অ্যাপিআইডি দেওয়া (যেমন AppID- [Setup]সেকশনে আপনি যে মানটি ব্যবহার করেছেন ) দিয়ে আপনার রেজিস্ট্রি থেকে আনইনস্টল স্ট্রিং পড়তে সক্ষম হওয়া উচিত । এটি এর অধীনে পাওয়া যেতে পারে Software\Microsoft\Windows\CurrentVersion\Uninstall\{AppId}\( উভয়ই হতে পারে HKLMবা HKCUতাই, উভয়ই চেক করুন) যেখানে {AppId}আপনার ব্যবহৃত প্রকৃত মানের সাথে প্রতিস্থাপন করা উচিত। দেখুন UninstallStringঅথবা QuietUninstallStringমূল্যবোধ ও ব্যবহার Execআপনার থেকে এটি চালানোর জন্য ফাংশন InitializeSetup()ঘটনা ফাংশন।

আপডেট: এর[Run] সাথে একটি- অ্যাকশন এন্ট্রি ব্যবহার করে অ-কর্মক্ষম বিকল্প সমাধান সরিয়ে নিয়েছে {uninstallexe}- এটি নির্দেশকারী সমস্ত মন্তব্যকারীকে ধন্যবাদ!


+1, তবে অবশ্যই পুরানো আনইনস্টলার নামটি পড়তে স্ক্রিপ্টিংটি ব্যবহার করুন, কারণ অন্যথায় যদি ব্যবহারকারী দ্বারা কোনও পৃথক পথ প্রবেশ করানো হয় তবে এটি কাজ করবে না।
mghie

4
আমি মনে করি না যে [Run]বিভাগটির সমাধানটি কাজ করবে, কারণ এটি ইনস্টলেশন প্রক্রিয়াতে খুব দেরিতে চলে। ইনো সেটআপ ম্যানুয়াল থেকে: [রান] বিভাগটি isচ্ছিক, এবং প্রোগ্রামটি সফলভাবে ইনস্টল হওয়ার পরে কার্যকর করার জন্য বেশ কয়েকটি প্রোগ্রাম সুনির্দিষ্ট করে তবে সেটআপ প্রোগ্রামের আগে চূড়ান্ত ডায়ালগটি প্রদর্শিত হয়।
ক্রেগ ম্যাককুইন

দয়া করে এই পোস্টটি সম্পাদনা করুন এবং [চালান] অংশটি সরান, এটি কার্যকর হয় না। দ্বিতীয় অংশটি যদিও কাজ করে। আপনাকে ধন্যবাদ :-)
সাওলিয়াস Žemaitaitis

11
একটি সতর্কতা: bit৪ বিট উইন্ডোজে একটি 32 বিট অ্যাপ্লিকেশনটির জন্য, পথটি `সফটওয়্যার \ ওয়াও 6432 নোড, মাইক্রোসফ্ট, উইন্ডোজ \ কারেন্টভিশন \ আনইনস্টল \ {অ্যাপআইডি}` আনডল করুন
অ্যাড্রিয়ান কক্স

4
@ অ্যাড্রিয়ান: যদিও এটি শারীরিক স্তরে সঠিক হতে পারে তবে আমি মনে করি যে ইনো দ্বারা ব্যবহৃত উইনিপিআই-কলগুলি ইতিমধ্যে এটির যত্ন নেবে - কমপক্ষে যদি সেটআপ.এক্সই নিজেই 32 বিটি প্রক্রিয়া হয়।
অলিভার জিজন

114

আমি নিম্নলিখিত ব্যবহার করেছি। আমি নিশ্চিত না যে এটি করার সহজতম উপায় তবে এটি কার্যকর হয়।

এটি ব্যবহার করে {#emit SetupSetting("AppId")}যা ইনো সেটআপ প্রিপ্রোসেসরের উপর নির্ভর করে। যদি আপনি এটি ব্যবহার না করেন তবে আপনার অ্যাপ্লিকেশন আইডিটিকে সরাসরি কাট-পেস্ট করুন।

[Code]

{ ///////////////////////////////////////////////////////////////////// }
function GetUninstallString(): String;
var
  sUnInstPath: String;
  sUnInstallString: String;
begin
  sUnInstPath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#emit SetupSetting("AppId")}_is1');
  sUnInstallString := '';
  if not RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString) then
    RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString);
  Result := sUnInstallString;
end;


{ ///////////////////////////////////////////////////////////////////// }
function IsUpgrade(): Boolean;
begin
  Result := (GetUninstallString() <> '');
end;


{ ///////////////////////////////////////////////////////////////////// }
function UnInstallOldVersion(): Integer;
var
  sUnInstallString: String;
  iResultCode: Integer;
begin
{ Return Values: }
{ 1 - uninstall string is empty }
{ 2 - error executing the UnInstallString }
{ 3 - successfully executed the UnInstallString }

  { default return value }
  Result := 0;

  { get the uninstall string of the old app }
  sUnInstallString := GetUninstallString();
  if sUnInstallString <> '' then begin
    sUnInstallString := RemoveQuotes(sUnInstallString);
    if Exec(sUnInstallString, '/SILENT /NORESTART /SUPPRESSMSGBOXES','', SW_HIDE, ewWaitUntilTerminated, iResultCode) then
      Result := 3
    else
      Result := 2;
  end else
    Result := 1;
end;

{ ///////////////////////////////////////////////////////////////////// }
procedure CurStepChanged(CurStep: TSetupStep);
begin
  if (CurStep=ssInstall) then
  begin
    if (IsUpgrade()) then
    begin
      UnInstallOldVersion();
    end;
  end;
end;

বিকল্প

"সংস্করণ তুলনার জন্য ইনো সেটআপ স্ক্রিপ্ট নমুনা" এই ব্লগ পোস্টটিও দেখুন যা আরও এক ধাপ এগিয়ে যায় এবং পূর্বে ইনস্টল হওয়া কোনও সংস্করণের সংস্করণ সংখ্যাটি পড়ে এবং সেই সংস্করণ নম্বরটি বর্তমান ইনস্টলেশন প্যাকেজের সাথে তুলনা করে।


4
আমার ব্লগ পোস্ট উল্লেখ করার জন্য ধন্যবাদ। এই পোস্টের সম্পূর্ণ নমুনা এখানে উপলব্ধ, কোড. google.com/p/lextudio/source/browse/trunk/trunk/setup/…
লি

এখানে কেবলমাত্র অনুপস্থিত জিনিস হ'ল HKLM এর পরিবর্তে HKCU এর অধীনে একটি আনইনস্টল-প্রবেশের জন্য সমর্থন।
অলিভার জিজন

4
আমি যদি কোনও ব্যবহারকারী অ্যাপ্লিকেশন ইনস্টল করে বিশেষত বর্তমান ব্যবহারকারীর প্রশাসক হন তবে আনইনস্টল করার ক্ষমতা যুক্ত করার পরামর্শ দিতে পারি? ... UserSIDs: TArrayOfString; I: Integer; ... if not RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString) then if isAdminLoggedOn() and RegGetSubkeyNames( HKEY_USERS, '', UserSIDs ) then for I := 0 to GetArrayLength( UserSIDs ) - 1 do begin if RegQueryStringValue( HKEY_USERS, UserSIDs[I] + '\' + sUnInstPath, 'UninstallString', sUnInstallString ) then break; end;
টেরেন্স

4
দুর্দান্ত সমাধান, ভাল কাজ করে। তবে এটি ইনস্টলেশন চলাকালীন "উইন্ডোজ [সফ্টওয়্যার নাম] আনইনস্টল করা" দেখায় window এই উইন্ডোটি পপিং হওয়া থেকে বাঁচানো কি সম্ভব? কারণ আমার সফ্টওয়্যারটির ইনস্টলেশনটি এত দ্রুত যে ইনস্টল উইন্ডোটি আনইনস্টল উইন্ডোটির আগে বন্ধ হয়ে যায় এবং এটি অদ্ভুত দেখাচ্ছে ...
André Santaló

4
@ আন্দ্রেসন্তালó / সিলেটের পরিবর্তে / ভার্জিলিটি ব্যবহার করুন
গৌতম জৈন

7

যদি আপনি "কেবলমাত্র পুরানো আইকনগুলি সরাতে চান" (কারণ আপনার পরিবর্তন / আপডেট হয়েছে) আপনি এটি ব্যবহার করতে পারেন:

; attempt to remove previous versions' icons
[InstallDelete]
Type: filesandordirs; Name: {group}\*;

এটি "ইনস্টলেশনের শুরুতে" চালিত হয় তাই মূলত পুরানো আইকনগুলি সরিয়ে দেয় এবং এটি সম্পূর্ণরূপে সম্পন্ন হওয়ার পরে আপনার নতুনগুলি সেখানে ইনস্টল হবে।

আইকন অনুসারে "কোনও কিছু পরিবর্তিত হওয়ার" ক্ষেত্রে প্রতিটি ইনস্টল দিয়ে আমি এটি করি (এটি যাইহোক পুনরায় ইনস্টল হয়ে যায়)।


আপনার আইকনগুলির জন্য যদি আপডেট থাকে তবে কেবল সেগুলি ওভাররাইট করে দিন। এগুলি সরানোর দরকার নেই। ঠিক আছে, আপনি যদি এগুলি সরাতে চান তবে আপনি এই বিকল্পটি ব্যবহার করতে পারেন। এটা সঠিক উপায়। যাইহোক, আপনি যে লোকটির সাথে কথা বলছিলেন (ম্যালান, মার্তিজান লান) তিনি ইনো সেটআপ লেখক এবং আমার মনে হয় তিনি জানেন যে তিনি কী সম্পর্কে কথা বলছেন :-)
টিলামা

4
হ্যাঁ, আপনি যখন নাম পরিবর্তন করতে চান বা আপনার প্রয়োজন এমন একটি আইকন সরিয়ে নিতে চান তখনই। উদাহরণস্বরূপ, যদি ভি 5 এর একটিতে "রান" নামকরণ করা হয় এবং ভি 6 এর নাম পরিবর্তন করে "বুনো বেসিক" করা হয় যদি কোনও ব্যবহারকারী ভি 5 ইনস্টল করে থাকে তবে ভি 6, তারা 2 আইকন দিয়ে শেষ করবে, যখন আপনি সত্যই 1 টি চান ("বেসিক চালান")। সুতরাং এই কৌশলটি প্রয়োজনীয় হয়ে ওঠে (পুরানো আইকনগুলি অপসারণ করার জন্য ইনসোসেটআপের ডিফল্ট আচরণ পরিবর্তন করার জন্য @ মিলান +1 + এবং এটির প্রয়োজন নেই ...)
রোজারডপ্যাক

6

ইনো সেটআপ ব্যবহার করার সময়, পূর্ববর্তী সংস্করণটি আনইনস্টল করার কোনও কারণ নেই যদি না সংস্করণটি অন্য কোনও ইনস্টলার প্রোগ্রাম দ্বারা ইনস্টল না করা হয়। অন্যথায় আপগ্রেডগুলি স্বয়ংক্রিয়ভাবে পরিচালনা করা হয়।


7
আমাদের প্রোগ্রাম কাঠামোর পরিবর্তন পেয়েছে, সুতরাং পুরানো সংস্করণটি আনইনস্টল করা দরকার।
কোয়ান মাই

11
না এটি হয় না, আপনি কোনও আপডেটের সময় কাঠামোগত পরিবর্তন পরিচালনা করতে আপনার স্ক্রিপ্টে এন্ট্রি যুক্ত করতে পারেন।
mlaan

@ এমলান এবং এগুলি কী হবে?
mythofechelon

4
আপনি কেবল [InstallDelete]পুরানো ফাইল / ডিরেক্টরিগুলি সরাতে কোনও বিভাগ ব্যবহার করতে পারেন। এরপরে নতুন ফাইলগুলি ইনস্টলেশনের সময় সঠিক স্থানে স্থাপন করা হবে।
ডাইসকগ

4
আপনি যদি ডিএলএক্সপ্রেসের মতো তৃতীয় পক্ষের লাইব্রেরিটি আপগ্রেড করেন, যার ডিএলএল নামে সংস্করণ নম্বর রয়েছে (যেমন 15.1 এর আগে ইনস্টল করা হয়েছে এবং এখন 15.2 এখন রয়েছে) তবে আপনি পুরানো সংস্করণটি সরাতে চান। আইএমএইচও এটি একটি ভাল কারণ।
টমাস ওয়েলার

2

ক্রেগ ম্যাককুইন সরবরাহ করেছেন উত্তর সম্পূর্ণভাবে কার্যকর। যদিও, আমি এই মন্তব্যগুলি যুক্ত করব:

  • {#emit SetupSetting("AppId")}কোড, আমার জন্য কাজ করে না তাই আমি শুধু আমার অ্যাপ আইডি যোগ করুন।
  • আমি আমার আনইনস্টলেশন প্রোগ্রামটি সম্পাদন করতে চাইনি, কারণ আমার কাছে অ্যাপডেটা / ফোল্ডারে থাকা একটি আইএনআই কনফিগারেশন ফাইল রয়েছে যা আনইনস্টলার দ্বারা সরানো হয় এবং নতুন সংস্করণ ইনস্টল করার সময় আমি এটি মুছতে চাই না। সুতরাং, আমি প্রোগ্রামটি ইনস্টল করা ডিরেক্টরিটি সরিয়ে ফেলতে ক্রেগ ম্যাককুইনের প্রদত্ত কোডটি কিছুটা সংশোধন করেছি, এর পথটি পুনরুদ্ধার করার পরে।

সুতরাং, ক্রেগ ম্যাককুইনের কোড সম্পর্কিত, পরিবর্তনগুলি হ'ল:

  • InstallLocationকীটির পরিবর্তে কীটি পুনরুদ্ধার করুন UninstallString
  • এর DelTreeপরিবর্তে ফাংশনটি ব্যবহার করুনExec(sUnInstallString, ...)

1

যে কেউ GetUninstallString()ভিতরে প্রস্তাবনাটি ভিতরে আনইনস্টল করার জন্য বাধ্যতামূলকভাবে CurStepChanged()ডিস্ক ক্যাচিংয়ের সমস্যাগুলি ব্যবহার করে তার জন্য নীচে দেখুন একটি সম্পর্কিত সমাধানের জন্য যা বাস্তবে মোছার জন্য আনইনস্টলারের এক্সেস্টিলেশন পরে কিছুক্ষণ অপেক্ষা করে!

নির্দোষ-সেটআপ নিয়ে ডিস্ক ক্যাচিংয়ের সমস্যা?


0

আপনি [কোড] বিভাগে একটি আনইনস্টলার চালাতে পারেন। বিদ্যমান আনইনস্টলারের পথ কীভাবে পাবেন তা আপনাকে খুঁজে বের করতে হবে। সরলতার জন্য যখন আমি আমার অ্যাপ্লিকেশনগুলি ইনস্টল করি তখন আমি একটি রেজিস্ট্রি স্ট্রিংয়ের মান যুক্ত করি যা আনইনস্টলারযুক্ত ফোল্ডারে নির্দেশ করে এবং কেবল ইনিশালাইজ উইজার্ড কলব্যাকে আনইনস্টলারটি সম্পাদন করে।

মনে রাখবেন যে ইনো সেটআপ আনইনস্টলারের নামগুলি হ'ল আনইনএন.এক্সই ফর্মের সমস্ত, আপনার কোডটিতে এটি অ্যাকাউন্টে নেওয়া উচিত।


0

আমি @ ক্রেন ম্যাক-কুইন কোডটি সম্পাদনা করেছি, আমার মনে হয় এই কোডটি আরও ভাল কারণ বিভিন্ন প্রকল্পে পরিবর্তন করার দরকার নেই:

[Code]
function GetNumber(var temp: String): Integer;
var
  part: String;
  pos1: Integer;
begin
  if Length(temp) = 0 then
  begin
    Result := -1;
    Exit;
  end;
    pos1 := Pos('.', temp);
    if (pos1 = 0) then
    begin
      Result := StrToInt(temp);
    temp := '';
    end
    else
    begin
    part := Copy(temp, 1, pos1 - 1);
      temp := Copy(temp, pos1 + 1, Length(temp));
      Result := StrToInt(part);
    end;
end;

function CompareInner(var temp1, temp2: String): Integer;
var
  num1, num2: Integer;
begin
    num1 := GetNumber(temp1);
  num2 := GetNumber(temp2);
  if (num1 = -1) or (num2 = -1) then
  begin
    Result := 0;
    Exit;
  end;
      if (num1 > num2) then
      begin
        Result := 1;
      end
      else if (num1 < num2) then
      begin
        Result := -1;
      end
      else
      begin
        Result := CompareInner(temp1, temp2);
      end;
end;

function CompareVersion(str1, str2: String): Integer;
var
  temp1, temp2: String;
begin
    temp1 := str1;
    temp2 := str2;
    Result := CompareInner(temp1, temp2);
end;

function InitializeSetup(): Boolean;
var
  oldVersion: String;
  uninstaller: String;
  ErrorCode: Integer;
  vCurID      :String;
  vCurAppName :String;
begin
  vCurID:= '{#SetupSetting("AppId")}';
  vCurAppName:= '{#SetupSetting("AppName")}';
  //remove first "{" of ID
  vCurID:= Copy(vCurID, 2, Length(vCurID) - 1);
  //
  if RegKeyExists(HKEY_LOCAL_MACHINE,
    'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + vCurID + '_is1') then
  begin
    RegQueryStringValue(HKEY_LOCAL_MACHINE,
      'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + vCurID + '_is1',
      'DisplayVersion', oldVersion);
    if (CompareVersion(oldVersion, '{#SetupSetting("AppVersion")}') < 0) then      
    begin
      if MsgBox('Version ' + oldVersion + ' of ' + vCurAppName + ' is already installed. Continue to use this old version?',
        mbConfirmation, MB_YESNO) = IDYES then
      begin
        Result := False;
      end
      else
      begin
          RegQueryStringValue(HKEY_LOCAL_MACHINE,
            'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + vCurID + '_is1',
            'UninstallString', uninstaller);
          ShellExec('runas', uninstaller, '/SILENT', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
          Result := True;
      end;
    end
    else
    begin
      MsgBox('Version ' + oldVersion + ' of ' + vCurAppName + ' is already installed. This installer will exit.',
        mbInformation, MB_OK);
      Result := False;
    end;
  end
  else
  begin
    Result := True;
  end;
end;

-1

আমি নিশ্চিত কিছু একটা ভুলে যাচ্ছি। নতুন ফাইল লক্ষ্য নির্দেশিকাতে অনুলিপি করা আগে পুরাতন ইনস্টলেশন অপসারণের ঘটে। তারপরে আনইনস্টলার এগুলি মুছে ফেলে ডিরেক্টরিটি সরিয়ে দেয়।


4
আপনি কী বলতে চাইছেন তা আমি নিশ্চিত নই, তবে মনে রাখবেন যে এটি সবসময় কেবল ফাইল অনুলিপি করার বিষয়ে নয়। কল্পনা করুন যে আপনি নিজের পণ্যটি ইনস্টল করেছেন, যা পরবর্তী প্রকাশের সাথে পুরোপুরি পরিবর্তিত ফাইল কাঠামো নিয়ে আসে, যেখানে অনেকগুলি মূল ফাইল সরিয়ে ফেলা হয়েছিল এবং নতুন ফাইলগুলির বিভিন্ন নাম রয়েছে এবং বিভিন্ন ডিরেক্টরিতে সঞ্চিত রয়েছে। আপগ্রেড করার সহজতম উপায় কী হবে? এটি কি পূর্ববর্তী সংস্করণটি আনইনস্টল করা হবে না?
টিএলামা

আমি ড্রাইভার ইনস্টল করতে INNO ব্যবহার করি এবং এর সাথে অ্যাপ্লিকেশন রয়েছে। স্বাভাবিকভাবেই, আসল ড্রাইভার ইনস্টলেশন / অপসারণ সরাসরি আইএনএনও দ্বারা করা হয় না। বরং INNO ড্রাইভার ইনস্টলার / রিমুভার অ্যাপটি অনুলিপি করে তারপরে এটি চালায়। আনইনস্টল একইভাবে সম্পন্ন: INNO ড্রাইভার রিমুভার চালায়, তারপরে ফাইলগুলি মুছে দেয়।
শউল

-8

[রান] বিভাগটি ব্যবহার করবেন না, তবে [আনইনস্টলআরুন]। প্রকৃতপক্ষে, [রান] এর অধীনে প্রোগ্রামটি ইনস্টলের পরে কার্যকর করা হয়, যার ফলে ইনস্টলেশনের পরে আপনার প্রোগ্রামটি আনইনস্টল করে: - | পরিবর্তে, [আনইনস্টলআরুন] বিভাগটি ইনস্টলেশনের আগে মূল্যায়ন করা হয় ।


4
[UninstallRun]প্রশ্নের সমাধান নয়।
ক্রেগ ম্যাককুইন

-8

এই লিঙ্কটি অনুসরণ করুন: http://news.jrsoftware.org/news/innosetup/msg55323.html

ইনিশিয়ালসেটআপ () ফাংশনে, পুরানো পুরাতন সংস্করণ আনইনস্টল করার জন্য ব্যবহারকারীকে অনুরোধ করার পরে আপনি "এমএসআইএক্সইসি / এক্স {আপনার প্রোগ্রামের আইডি call" কল করতে পারেন


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