28

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

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

GUIDは、VisualStudioのセットアッププロジェクトからのProductCodeです。

製品コード

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

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

4

8 に答える 8

67

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

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

1) Setup Project –> File System windows –> File System on Target machine を右クリック –> Special Folder を追加し、System Folder を選択します。

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

条件:=インストールされていません (「インストールされていません」と同じように入力してください)、永続:=True、システム:=True、推移的:=True、重要:=False.

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

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

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

(SlapHeadの説明に基づく)"

于 2009-09-02T11:55:50.590 に答える
10

私はちょうどこの仕事をしました:

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

msiexec.exe /x %1

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

于 2011-04-23T14:26:56.797 に答える
4

これは私が書いた、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」の自動削除はまだ試していません。それはうまくいくかもしれません。

編集: はい、createInstaller.js の自己削除を正常に機能させます。

私は私自身の答えを受け入れるつもりです!

于 2009-08-31T08:42:41.267 に答える
2

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

<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>
于 2012-01-27T04:12:59.350 に答える
1

この質問は既に回答されていることは承知していますが、私が行ったことは、次の内容のバッチ ファイルを作成することでした。

start msiexec.exe /x %1

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

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

[ProductCode]

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

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

于 2013-03-07T13:34:31.517 に答える
1

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

于 2010-08-30T19:04:52.573 に答える
0

セットアップを生成するたびに、常に製品コードを変更します。アンインストーラーのショートカットを作成すると、コマンドライン引数を渡してカットをソートする方法が見つかります。そこには常に「/u product code」と書きますが、ここには必ず書く必要がある製品コードです。

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

[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);
于 2013-01-29T12:50:57.080 に答える