可能对于您的情况,知道“/x”参数就足够了。对此有两点评论:更安全的是在命令行中添加“REBOOT=R”部分。您可以添加日志文件路径:
msiexec /x "..." /qn REBOOT=R /L*v "c:\mylogdir\mymsi.log"
其次,不要尝试将任何内容更改为“缓存”。你甚至不需要理解它。如果缓存的软件包被破坏,则无法再进行常规卸载,这可能会使计算机处于“需要支持”状态。
因为您的问题最初是在谈论 C# .. 您不必为此使用 msiexec :
a) 使用带有函数 MsiInstallProduct() 或 MsiConfigureProduct() 的原始 C/C++ API。MSDN 参考:
http: //msdn.microsoft.com/en-us/library/windows/desktop/aa370315 (v=vs.85).aspx
您必须使用互操作才能在 C# 中使用它。
或 b) 使用 Windows 安装程序对象。例如,这个相关案例已经在 stackoverflow 中得到解答:
Programmatically installed MSI packages
但使用此功能需要物理包,也用于卸载。稍微间接一点,这里是更好的卸载代码:
首先,在您的项目中添加对 COM 对象“Microsoft Windows Installer Object Library”的引用。
using WindowsInstaller;
public static class MyMsiLib
{
public static void Uninstall(string productCode)
{
Type type = Type.GetTypeFromProgID("WindowsInstaller.Installer");
Installer installer = (Installer)Activator.CreateInstance(type);
installer.UILevel=msiUILevelNone;
installer.ConfigureProduct(productCode, 0, msiInstallStateAbsent);
}
}
之前的 UILevel 属性在此处设置为硬编码,以确定您似乎想要的 UI 级别静默。其他属性也一样。请参阅上面链接中提到的 MSDN 文档。
当然,“真正的程序员”使用原始 API 而不是“安装程序对象”:-) 但对于小目的来说,这就足够了。而且更容易。