c# - 已安装 msi 文件时确定 msiexec 退出代码

标签 c# .net windows-installer

我在另一个进程中启动 msiexec 并等待退出:

var p = new Process
{
    StartInfo =
    {
        FileName = "msiexec",
        Arguments = string.Format("/i \"{0}\" /qb", @"c:\install\setup.msi"),
        Verb = "runas"
    }
};
p.Start();
p.WaitForExit();
int exitCode = p.ExitCode;

如果之前没有安装 setup.msi,它会以静默模式安装并返回 0。这很正常。

但如果 setup.msi 已经安装(第二次启动此代码),则安装不会启动并返回代码 0 - 成功结果!但实际上文件并没有建立,因为产品已经安装好了。我如何确定这种情况?

最佳答案

您收到了 0 的退出代码,因为该产品已经安装并且您没有尝试安装新版本。换句话说,您的 MSI 没有新的产品代码和版本号,因此 MSIExec 安装程序将其视为重新配置并退出。我通过打开/log switch 测试了这一点并在安装我的一个 MSI 文件两次后读取输出。

MSI (c) (98:EC) [15:19:27:912]: Product: Product Name -- Configuration completed successfully. MSI (c) (98:EC) [15:19:27:912]: Windows Installer reconfigured the product. Product Name: Product Name. Product Version: 4.8.22. Product Language: 1033. Manufacturer: Manufacturer. Reconfiguration success or error status: 0.

如果您尝试安装产品的新版本并且您的 MSI 未配置为删除以前的版本,您将收到错误代码 1638。请在此处查看错误代码列表:MSDN

如果您想检查产品是否已经安装了现有的 MSI 信息(不是升级),您需要检查注册表:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\YourProductCode

如果事实证明它已安装(根据系统/注册表 - 可能文件已被删除但仍被认为已安装)您可以尝试使用 /x/uninstall 开关 然后重新安装。您还可以使用 /fa 开关进行修复并重新安装所有文件。

msiexec.exe/x ProductCode 将卸载它。然后你可以在那之后再次运行安装。 msiexec.exe/fa ProductCode 将修复所有文件。/f 开关有很多关于如何重新安装文件的不同选项,因此您最好阅读我在上面发布的 msiexec 开关文章的链接。

关于 msiexec 的一些其他注意事项:

/qb 显示一个基本的用户界面。您可能需要 /qn。 当我设置我的实时更新软件时遇到了一堆问题,我必须确保我通过使用

从 system32 调用了 msiexec
p.StartInfo.FileName == Path.Combine(System.Environment.ExpandEnvironmentVariables("%windir%\\system32"), "MSIExec.exe"); 

关于c# - 已安装 msi 文件时确定 msiexec 退出代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25739347/

相关文章:

c# - Reflection是否违反了封装原则?

c# - NCrunch 和 PostSharp 日志记录冲突

c# - 异步等待最佳实践

.net - Visual Studio安装程序项目自定义对话框

c# - 如何将命令行参数传递给 MSI 安装程序

installation - 编辑预先存在的 cab 文件/安装程序文件

c# - 此类型分配错误是 WCF 或 Windows Workflow Foundation 4.5 中的错误吗?

c# windows 服务内存问题(内存泄漏?)

.net - 是否可以将 Powershell 变量设置为固定的 N 个字符?

.net - 从实体连接字符串中提取连接字符串