private static MsiAction ParseMsiAction(CustomActionData data) { Func <string, bool> parse = (c) => !String.IsNullOrEmpty(c) && bool.Parse(c); MsiAction action = MsiAction.None; if (parse(data["FirstInstall"])) { action |= MsiAction.FirstInstall; } if (parse(data["Upgrading"])) { action |= MsiAction.Upgrading; } if (parse(data["RemovingForUpgrade"])) { action |= MsiAction.RemovingForUpgrade; } if (parse(data["Uninstalling"])) { action |= MsiAction.Uninstalling; } if (parse(data["Maintenance"])) { action |= MsiAction.Maintenance; } return(action); }
/// <summary> /// Convert an msi action to string. /// </summary> /// <param name="action">an msi action</param> /// <returns>one of i, x</returns> private string MsiActionToString(MsiAction action) { switch (action) { case MsiAction.Install: return("i"); case MsiAction.UnInstall: return("x"); default: throw new ArithmeticException(); } }
/// <summary> /// Install an MSI /// </summary> /// <param name="action">msi action</param> /// <param name="msiPath">path to the msi</param> /// <param name="msiArgs">additional msi parameters</param> /// <param name="logfile">resulting log file</param> private void MsiExec(string msiPath, string msiArgs, MsiAction action, out string logfile) { string msiAction = MsiActionToString(action); logfile = string.Format("{0}{1}.log", msiPath, msiAction); _msiexecProcess = this.VirtualMachineHost.RunProgramInGuest( "msiexec.exe", string.Format("/qn /{0} \"{1}\" /l*v \"{2}\" {3}", msiAction, msiPath, logfile, msiArgs), 0); if (_msiexecProcess.ExitCode == 3010) { // reboot required } else if (_msiexecProcess.ExitCode != 0) { throw new Exception(string.Format("{0} failed, return code: {1}", action, _msiexecProcess.ExitCode)); } }
/// <summary> /// Convert an msi action to string. /// </summary> /// <param name="action">an msi action</param> /// <returns>one of i, x</returns> private string MsiActionToString(MsiAction action) { switch (action) { case MsiAction.Install: return "i"; case MsiAction.UnInstall: return "x"; default: throw new ArithmeticException(); } }