使用c#执行UninstallString

本文关键字:UninstallString 执行 使用 | 更新日期: 2023-09-27 18:07:21

我有一个问题来执行uninstallString使用进程,它不会在所有情况下工作。我需要一个在任何情况下都能运行的通用过程。

    我的一个想法是解析卸载字符串
代码:

int indexOfExe = uninstallString.ToLower().IndexOf(".exe") + 4;
string exeFile = uninstallString.Substring(0, indexOfExe).Trim();
string args = uninstallString.Substring(indexOfExe, uninstallString.Length - indexOfExe).Trim();
if (args.Length > 0)
{
    procStartInfo.FileName = exeFile;
    procStartInfo.Arguments = args;
}
else
{
    procStartInfo.FileName = exeFile;
    procStartInfo.Arguments = "";
}
procStartInfo.Verb = "runas";
procStartInfo.CreateNoWindow = true;
procStartInfo.UseShellExecute = false ;
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo = procStartInfo;
proc.Start();
proc.WaitForExit();
    我的第二个想法是:
代码:

if (uninstallString.Contains("msiexec"))
{
    uninstallString = uninstallString.Replace("'"", "");
    uninstallString = RegistryHandler.getCommandInCommaAndArgumentsOutside(uninstallString);
}
else
{
    procStartInfo.FileName = "cmd";
    string[] words = uninstallString.Split("/".ToCharArray());
    if (uninstallString.StartsWith(@"""") && words.Count() == 1)
    {
        procStartInfo.FileName = uninstallString;
        procStartInfo.Arguments = "";
    }
    else
    {
        //procStartInfo.Arguments = "/c " + "'"" + uninstallString + "'"";
        if ((uninstallString.StartsWith(@"""") && words.Count() > 1))
        {
            procStartInfo.Arguments = "/c " + uninstallString;
        }
        else
        {
            procStartInfo.Arguments = "/c " + RegistryHandler.getCommandInCommaAndArgumentsOutsideByExe(uninstallString);
        }
    }
}

但仍不能涵盖所有情况。

所有情况的通用解决方案是什么?

使用c#执行UninstallString

从技术上讲,你的第二个想法应该是可行的(对于所有使用Windows Installer的程序)。但是,您需要获得适当的卸载字符串。我怀疑问题是你的卸载字符串不正确。

您应该能够通过查看

来查询注册表中的卸载字符串:
HKLM'Software'Microsoft'Windows'Currentversion'Uninstall'{NameOfApplication}'UninstallString

上面标记为{NameOfApplication} 的部分应该有一个可以卸载的所有程序的条目。

//i wrote this code, which is working in most of the cases :
//----------------------------------------------------------------------------------------------          
            if (uninstallString.Contains("msiexec"))
                {
                uninstallString = uninstallString.Replace("'"", "");
                uninstallString = RegistryHandler.getCommandInCommaAndArgumentsOutside(uninstallString);
                }
                else
                {
                  if (uninstallString.StartsWith(@""""))
                     {
                     int indexOfLastComma = uninstallString.IndexOf("'"", 1) + 1;
                     procStartInfo.FileName = uninstallString.Substring(0, indexOfLastComma);
                     procStartInfo.Arguments = uninstallString.Substrin(indexOfLastComma,uninstallString.Length - indexOfLastComma));
                     }
                     else
                     {
                      procStartInfo.FileName = "cmd.exe";
                      procStartInfo.Arguments = "/c " + RegistryHandler.getCommandInCommaAndArgumentsOutsideByExe(uninstallString); 
                      }     
}
//----------------------------------------------------------------------------------------------

          public static string getCommandInCommaAndArgumentsOutsideByExe(string command)
                 {
                   int ind = 0;
                   string[] prms = command.Split(' ');
                   ind = prms[0].Length; //command.IndexOf(".exe") + 4;
                   int exeLocationIndex = command.IndexOf(".exe") + 4;
                   string cmd = command.Substring(0, exeLocationIndex);
                   string arguments = command.Substring(command.IndexOf(".exe") + 4, command.Length - exeLocationIndex);
                   return "'"" + cmd + "'"" + arguments;
                       }

下面是我的代码,使用与Roy相同的方式,可能更简单:

  private string SwitchCondition(string uninstallstring)
    {
        if (uninstallstring.Substring(0, 1).Equals("'"") |
            uninstallstring.ToLower().Contains("msiexec") |
            uninstallstring.Contains("~"))
        {
            Debug.WriteLine(uninstallstring);
        }
        else if (uninstallstring.ToLower().IndexOf(".exe") > 0)
        {
            uninstallstring = "'"" + uninstallstring.Insert(uninstallstring.ToLower().IndexOf(".exe") + 4, "'"");
            Debug.WriteLine("Contains .exe" + uninstallstring);
        }
        else
        {
            uninstallstring = "'"" + uninstallstring + "'"";
            Debug.WriteLine("Case end " + uninstallstring);
        }
        return uninstallstring;
    }