0

プロセスを使用してuninstallStringを実行すると問題が発生します。すべての場合に機能するとは限りません。どのような場合でも実行される一般的な手順が必要です。

  • 私のアイデアの1つは、アンインストール文字列を解析することでした

コード:

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();
  • 私の2番目のアイデアは:

コード:

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

それでも、すべてのケースをカバーするわけではありません。

すべてのケースの一般的な解決策は何ですか?

4

3 に答える 3

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;
                       }
于 2011-09-05T10:26:58.123 に答える
0

2 番目のアイデアは、技術的には機能するはずです (Windows インストーラーを使用するすべてのプログラムで)。ただし、適切なアンインストール文字列を取得する必要があります。問題は、アンインストール文字列が正しくないことだと思います。

以下を参照して、アンインストール文字列のレジストリを照会できるはずです。

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

上記のセクションには、アンインストールできるすべてのプログラムのエントリが含まれている{NameOfApplication} 必要があります。詳細については、「レジストリ キーのアンインストール」を参照してください。

于 2011-09-04T07:06:36.613 に答える
-1

これが私のコードで、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;
    }
于 2015-02-28T09:59:02.937 に答える