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

时间:2018-08-15 19:34:38

标签: c# msiexec installscript-msi

这将是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 个答案:

答案 0 :(得分:1)

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

id      date                rn      in_interval
100     2000-01-01 00:00:00 1       0
110     2016-03-01 00:00:00 2       1
120     2017-06-06 00:00:00 3       0
130     2017-07-01 00:00:00 4       0
140     2018-01-01 00:00:00 5       0

您是否手动尝试使用 setup.exe /s /f1"C:\sample\uninstall.iss" /f2"C:\sample\uninstall.log" /f1 参数的完整路径?

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

/f2

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

可以通过/ c参数将命令传递给 set here=%~dp0 cd %here% 吗? (“ 执行由字符串指定的命令,然后终止”):

cmd.exe

也许尝试添加/SMS switch以确保在实际卸载完成之前setup.exe不会过早退出。据传,/ SMS开关对于较晚的Installshield setup.exe而言不是必需的,而对于较旧的版本则是必需的。

答案 1 :(得分:0)

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