代码之家  ›  专栏  ›  技术社区  ›  Ben_G

使用C#静默卸载InstallShield Installscript MSI程序

  •  0
  • Ben_G  · 技术社区  · 6 年前

    这将是非常具体的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}
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Stein Åsmul    6 年前

    在本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的名称,看看是否已完成?

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

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

    也许可以尝试添加 /SMS switch 以确保在实际卸载完成之前,SETUP.EXE不会过早退出。根据传闻,此/SMS开关不需要用于新一代的Installshield setup.exe,但需要用于旧版本。

        2
  •  0
  •   Ben_G    6 年前

    正如重力所指出的,问题是在/和f1之间有一个空间。它是在剪切粘贴过程中添加的。

    推荐文章