我们使用Install4J作为当前版本的软件,并在安装过程中静默安装MySQL 5.1。
对于我们软件的下一个版本,如果是升级,我想删除MySQL 5.1并安装5.5。理想情况下,卸载应该是静默的,但不是一个硬性要求。我设法让它在32位Windows XP上工作,但在64位Windows 7上没有。这就是我目前所拥有的:

String[] uninstallKeys = WinRegistry.getSubKeyNames(RegistryRoot.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall");
for( String uninstallKey : uninstallKeys )
{
  Object displayVersion = WinRegistry.getValue(RegistryRoot.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" + uninstallKey, "DisplayVersion" );
  Object displayName = WinRegistry.getValue(RegistryRoot.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" + uninstallKey, "DisplayName" );
  if( displayVersion != null && displayVersion.toString().equals(installedMysqlVersion)
                  && displayName != null && displayName.toString().startsWith("MySQL Server") )
  {
    Util.logInfo( null, "Found match, uninstall key: " + uninstallKey );
    context.setVariable( "mysqlUninstallKey", uninstallKey );
    break;
 }
}

这将把MySQL Server 5.1的产品代码放入mysqlUninstallKey变量中。在此步骤之后,我有一个带有以下设置的“运行可执行文件或批处理文件”步骤:
可执行文件:msiexec.exe
工作目录:${installer:sys.system32Dir}
参数:/I{installer:mysqlUninstallKey}
这将(在32位Windows XP上)运行MySQL服务器的安装程序,然后用户必须手动选择“删除”。
在64位Windows7上,它只显示一个对话框,显示所有命令行标志及其说明,因此msiexec.exe正在启动,但无法识别传入它的参数。
知道怎么回事吗?或者我做的完全错了还有更好的办法?
我使用Install4j 4.2.8。

最佳答案

多亏了“马库斯·亚当斯”的评论,我才明白了。在install4j的“Run executable or batch file”操作中,需要使用“/qn”、“/x”和“{installer:mysqlUninstallKey}”作为单独的参数。如果将1个参数与空格一起使用,则它不起作用。它可以在32位和64位上工作。

09-03 20:42