web-dev-qa-db-ja.com

Visual Studioセットアッププロジェクトで、アンインストールスクリプトを生成するにはどうすればよいですか?

Visual Studioセットアッププロジェクトがあります。インストール時に、アプリケーションフォルダーにアンインストールバッチファイルを作成します。ユーザーが製品をアンインストールする場合は、[プログラムの追加と削除]に移動するか、uninstall.cmdをダブルクリックします。内容は次のとおりです。

%windir%\system32\msiexec /x {CC3EB7BF-DD82-48B9-8EC5-1B0B62B6D285}

GUID Visual StudioのセットアッププロジェクトからのProductCodeがあります。

ProductCode

しかし、アップグレードが正しく機能するためには、新しいMSIを作成するたびに、バージョン番号を増分する必要があります。また、バージョン番号を増やす場合は、ProductCodeの新しいGuidも生成する必要があります。つまり、静的なuninstall.cmdファイルを変更する必要があります。

ビルド時にProductCodeを含むバッチファイルを動的に生成するにはどうすればよいですか?

27
Cheeso

これは、uninstall.cmdを作成するために私が作成したスクリプトです。インストール時にカスタムアクションとして実行されます。

var fso, ts;
var ForWriting= 2;
fso = new ActiveXObject("Scripting.FileSystemObject");

var parameters = Session.Property("CustomActionData").split("|"); 
var targetDir = parameters[0];
var productCode = parameters[1];

ts = fso.OpenTextFile(targetDir + "uninstall.cmd", ForWriting, true);

ts.WriteLine("@echo off");
ts.WriteLine("goto START");
ts.WriteLine("=======================================================");
ts.WriteBlankLines(1);
ts.WriteLine(" Uninstall.cmd");
ts.WriteBlankLines(1);
ts.WriteLine("=======================================================");
ts.WriteBlankLines(1);
ts.WriteLine(":START");
ts.WriteLine("@REM The uuid is the 'ProductCode' in the Visual Studio setup project");
ts.WriteLine("%windir%\\system32\\msiexec /x " + productCode);
ts.WriteBlankLines(1);
ts.Close();

結果は、常に現在のProductCodeが含まれているcmdファイルです。

これの欠点は、?uninstall.cmdを作成するスクリプトがインストールディレクトリに残ることです。大きな問題ではありませんが、インストールディレクトリ内のゴミは好きではありません。 「createInstaller.js」を自己削除することはまだ試みていません。うまくいくかもしれません。

[〜#〜] edit [〜#〜]:はい、createInstaller.jsの自己削除を正常に機能させます。

私は自分の答えを受け入れます!

4
Cheeso

私はこの解決策を見つけました ここ

「Visual Studio 2005/2008を使用すると、セットアッププロジェクトのアンインストールオプションを追加するためにコードを記述する必要はありません(そうするためのコードを記述できる人がいることはわかっています)

1)Setup Project –> File System windows –>右クリック“ File machine on Target machine” –> Add a Special Folder、select System Folder;

2)このシステムフォルダーにファイルを追加します。ローカルのSystem32フォルダーからmsiexec.exeを参照して追加します。このファイルのデフォルトプロパティを次のようにオーバーライドします。

条件:=インストールされていません(「インストールされていません」と同じように、同じケースとすべてを入力してください)、Permanent:= True、System:= True、Transitive:= True、Vital:= False。

3)「Users Program Menu」の下に新しいショートカットを作成し、ステップ1で作成したシステムフォルダにターゲットを設定し、msiexec.exeをポイントします。ショートカットの名前を「アプリケーションのアンインストール」に変更します。 Argumentsプロパティを/ x {space} [ProductCode]に設定します。

4)プロジェクトをビルドします。msiexecを除外する必要があるという警告を無視します。除外しないと、セットアッププロジェクトがビルドされません。

「インストールされていません」状態とPermananet:= Trueは、msiexec.exeが存在しない場合にのみ、インストールの一部としてシステムフォルダーに配置され、アンインストール時に削除されないことを確認します。その警告を無視してそれを実行するだけでかなり安全です。

(SlapHeadの説明に基づく) "

65
Ben

私は this を作成しました:

Uninstall.batファイルをプロジェクトに追加します。ファイルの内容は次のとおりです。

msiexec.exe /x %1

そのバッチファイルへのショートカットを作成し(たとえば、ユーザーのプログラムメニューで)、ショートカットのプロパティで、引数の横に指定します:[ProductCode]

11
MPelletier

バッチファイルのアプローチのわずかなバリエーション。コマンドウィンドウを表示したくない場合は、wscriptファイルを使用してください。引数に前と同じように[ProductCode]を指定します

<job>
<?job debug="true" error="true" ?>
<script language="JScript">
    var arg = [];
    for (var i=0; i<WSH.Arguments.length; i++) {
        arg.Push( WSH.Arguments.Item(i) );
    }

    if (arg.length>0) {
        var productcode = arg[0];
        var v = new ActiveXObject("Shell.Application");
        v.ShellExecute("msiexec.exe", "/x "+productcode, "", "open", 10);
    }

    WSH.Quit(0);
</script>
</job>
2
locksmith

コマンドプロンプトのフラッシュやコマンドプロンプト自体が表示されないように、承認された回答と鍵屋の回答を組み合わせて使用​​しました。このようにすることの1つの利点は、ショートカットを作成して引数を設定する必要がないことです。

私のcreateUninstaller.jsファイル:

var fso, ts;
var ForWriting= 2;
fso = new ActiveXObject("Scripting.FileSystemObject");

var parameters = Session.Property("CustomActionData").split("|"); 
var targetDir = parameters[0];
var productCode = parameters[1];

ts = fso.OpenTextFile(targetDir + "Uninstall.js", ForWriting, true);

ts.WriteLine("var v = new ActiveXObject(\"Shell.Application\");");
ts.WriteLine("v.ShellExecute(\"msiexec.exe\", \"/x "+productCode+"\", \"\", \"open\",10);");
ts.Close();

このファイルは、コミットアクション「ディレクトリ」にカスタムアクションとして追加されます。実際にこのカスタムアクションにアクセスするには、セットアッププロジェクトを右クリックし、[表示]> [カスタムアクション]> [コミット[ディレクトリ]を右クリック]> [カスタムアクションを追加]をクリックします。作成したcreateUninstaller.jsファイルを検索して追加する必要があります。

次に、createUninstaller.jsに変数targetDirおよびproductCodeを読み取らせるために、
セットアッププロジェクトのカスタムアクションの「コミット」ディレクトリにあるcreateUninstaller.jsファイルを右クリックして、プロパティウィンドウに移動します。プロパティには、「CustomActionData」プロパティが表示されます。そこにコピーして貼り付けます[TARGETDIR] | [ProductCode]
そしてVOILA!これで、Uninstall.jsファイルが追加され、ダブルクリックするとすぐに機能します。

1
Merv

この質問には既に回答済みですが、次の内容のバッチファイルを作成しました。

start msiexec.exe /x %1

"start"を使用すると、アンインストールプロセス中にコマンドプロンプトが開いたままにならず、%1が実行時にバッチファイルに渡す最初の引数に置き換えられます。

バッチファイルをアプリケーションフォルダーに追加し、バッチファイルを指すメニューショートカットを作成しました。ショートカットを右クリックして[プロパティウィンドウ]を選択した場合。そこで、Argumentsプロパティに次のテキストを追加します。

[ProductCode]

インストーラーをビルドして実行すると、バッチファイルを呼び出し、アプリケーションのそのバージョンがビルドされたときと同じように製品コードを渡すスタートメニューのショートカットができます。ユーザーに、製品をアンインストールするかどうかを尋ねるプロンプトが表示されます。

このソリューションの唯一の欠点は、ユーザーがアプリケーションフォルダーを参照してバッチファイルをダブルクリックすると、アンインストーラーがインストールパッケージが存在しないというエラーを表示することです。

1
Jela

アプリケーションを削除するには、[ProductCode]をパラメーターとして使用し、アプリケーション自体からmsiexecを呼び出します。アンインストーラーの作成に関する詳細なガイドについては、このブログを確認してください: http://endofstream.com/ creating-uninstaller-in-a-visual-studio-project /

1
Peter

セットアップを生成するたびに、常に製品コードを変更します。アンインストーラーショートカットを作成すると、コマンドラインの引数渡しテクニックを使用してカットをソートできます。そこには、常に「/ u製品コード」の製品コードが書き込まれます。

このコードをprogram.csファイルのメインメソッドに入れます

[STAThread]
        static void Main()
        {
            bool flag = true;
            string[] arguements = Environment.GetCommandLineArgs();
            foreach (string str in arguements)
            {
                if ((str.Split('='))[0].ToLower() == "/u")
                {
                    if (MessageBox.Show("Do you want to uninstall job board", "Are you Sure?", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        flag = false;
                        RemoveRegSettings();
                        RemoveIniFile();
                        string guid = str.Split('=')[1];
                        string path = Environment.GetFolderPath(Environment.SpecialFolder.System);
                        ProcessStartInfo si = new ProcessStartInfo(path + @"\msiexec.exe", "/i" + guid);
                        Process.Start(si);
                        Application.Exit();
                        return;
                    }
                }
            }
            //

            //************************************************
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
0
Thomas