2011-09-04 69 views
0

我有一个问题,执行uninstallString使用过程,它不会在所有情况下工作。 我需要一个在任何情况下都能运行的通用程序。使用c执行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); 
     } 
    } 
} 

但它仍不会涵盖所有情况。

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

+0

你描述你已经尝试什么,但没有什么地方出了错。你是否想要替换添加/删除程序对话框? –

+0

在命令行过程中直接执行uninstallstring键中的值时,会出现什么问题?卸载必须没有用户干预? – NoviceProgrammer

回答

0

在技术上,您的第二个想法应该适用于所有使用Windows Installer的程序。但是,您需要获取正确的卸载字符串。我怀疑问题是您的卸载字符串不正确。

您应该能够通过观察来查询卸载字符串注册表:

HKLM\Software\Microsoft\Windows\Currentversion\Uninstall\{NameOfApplication}\UninstallString 

上面注{NameOfApplication}应该有可卸载的所有节目的入口部分。有关详细信息,请参阅Uninstall Registry Key

+0

是的,我知道这是uninstallString注册表路径。 但仍然我的第二个想法不会涵盖所有的casses。 微软正在做什么来卸载软件(MSI和nonMSI)? – Roy

+0

@罗伊:微软没有 - 我的软件没有显示在控制面板中 - 但是,其他软件*应该放入卸载字符串中。这是控制面板用于查找要卸载的软件的全部内容。例如,“CutePDF”不使用MSI,因此我系统上的卸载字符串是“C:\ Program Files(x86)\ Acro Software \ CutePDF Writer \ Setup64.exe/uninstall” –

0
//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; 
         } 
0

这里是我的代码,用同样的方式做了罗伊,也许是垃圾简单:

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; 
    }