【问题标题】:Uninstalling an InstallShield Installscript MSI program using C# silently使用 C# 静默卸载 InstallShield Installscript MSI 程序
【发布时间】:2018-08-15 19:34:38
【问题描述】:

这将是非常特定于 InstallShield 的,所以我怀疑以前是否有人处理过这个问题,但我编写了一个批处理文件来卸载我们产品的早期版本,但它不起作用。 (我们总是在安装/升级之前卸载以前的版本,因为 InstallShield 中的升级似乎不起作用)。卸载 Installscript MSI 项目与典型的卸载非常不同,因为您需要“记录”卸载并将结果存储在文件中,即:

setup.exe /x /r /f1"C:\temp\UNINST.ISS"

这会将卸载映像存储在 c:\temp\UNINST.ISS 中,然后您需要将其传递给卸载程序以卸载产品:

setup.exe /s /f1"UNINST.ISS"

所以我对我们产品的所有早期版本都这样做了,然后编写了一个批处理脚本(产品代码为 {7F2A0A82-BB08-4062-85F8-F21BFC3F3708} 来执行如下所示的卸载:

echo Uninstalling 5.3.0
pause
if exist "C:\Program Files (x86)\InstallShield Installation Information\ {7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup.exe" (
    del /q "C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup-5.3.0.exe"
    copy /y "C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup.exe" "C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup-5.3.0.exe"
    cls
    echo Uninstalling 5.3.0
    "C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup-5.3.0.exe" /s /f1".\Uninstall response files\5.3.0\UNINST-5.3.0.ISS"
    :wait1
        timeout /t 3 /NOBREAK > nul
        tasklist | find /i "Setup-5.3.0.exe" >nul 2>nul
        if not errorlevel 1 goto wait1
)

echo Uninstalling 5.3.1...

问题是它不起作用。如果我从提升的 CMD 窗口执行卸载,它可以正常工作:

"C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup-5.3.0.exe" /s /f1".\Uninstall response files\5.3.0\UNINST-5.3.0.ISS"

但是当我执行批处理脚本时,它似乎只是通过卸载而不做任何事情。所以我想我会尝试编写一个简单的 C# 程序来执行此操作,但这也不起作用:

Console.Clear();
Console.WriteLine("Uninstalling 5.3.0");
if (File.Exists(@"C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup.exe"))
    {
        File.Copy(@"C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup.exe", @"C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup-5.3.0.exe", true);

        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.FileName = @"C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup-5.3.0.exe";
        Directory.SetCurrentDirectory(@"..\..\..\");
        startInfo.Arguments = "/s / f1\".\\Uninstall response files\\5.3.0\\UNINST-5.3.0.ISS\"";
        startInfo.UseShellExecute = false;
        startInfo.WindowStyle = ProcessWindowStyle.Normal;
        using (Process process = new Process())
        {
            process.StartInfo = startInfo;
            process.Start();
            process.WaitForExit();
        }
    }

我已尝试对此进行调试并确认当前目录正确(使用Directory.GetCurrentDirectory()),但出现此错误:

process.StandardError' threw an exception of type 'System.InvalidOperationException'    System.IO.StreamReader {System.InvalidOperationException}

【问题讨论】:

  • 这部分:"/s / f1\".\\Unin...。您是否打算在 /f1 之间留一个空格,而它不在您手动运行的命令行示例中?
  • 不——它出于某种原因从批处理复制和粘贴到 c#。我抓住了另一个空间,但这个空间溜走了。谢谢 - 它现在似乎工作了 - 看到这一点真是太棒了!

标签: c# windows-installer installscript-msi


【解决方案1】:

此 PDF 底部有一些进一步的说明:https://resources.flexera.com/web/pdf/archive/silent_installs.pdf

setup.exe /s /f1"C:\sample\uninstall.iss" /f2"C:\sample\uninstall.log"

您是否手动尝试使用 /f1/f2 参数的完整路径?

我正在积极尝试忘记如何编写批处理文件,但我认为您可以像这样获取运行批处理文件的文件夹:

set here=%~dp0
cd %here%

更改 setup.exe 文件名会导致问题吗?也许您可以尝试不更改 setup.exe 的名称,看看是否完成?

可以通过 /c 参数将命令传递给 cmd.exe 吗? ("执行字符串指定的命令,然后终止"):

cmd.exe /c "%here%\setup.exe /s /f1"C:\sample\uninstall.iss" /f2"C:\sample\uninstall.log""

也许尝试添加/SMS switch 以确保 setup.exe 在实际卸载完成之前不会过早退出。有传言称,后期的 Installshield setup.exe 不需要此 /SMS 开关,但旧版本需要此开关。

【讨论】:

    【解决方案2】:

    正如 Gravity 指出的那样,问题在于 / 和 f1 之间的空格。它是在剪切和粘贴过程中以某种方式添加的。

    【讨论】:

      猜你喜欢
      • 2018-11-13
      • 2011-09-11
      • 2020-05-16
      • 2011-07-01
      • 2012-05-29
      • 2014-02-13
      • 1970-01-01
      • 2011-06-26
      • 1970-01-01
      相关资源
      最近更新 更多