2011-09-04 110 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; 
    }