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



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

setup.exe /x /r /f1"C:tempUNINST.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 files5.3.0UNINST-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 files5.3.0UNINST-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}

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

setup.exe /s /f1"C:sampleuninstall.iss" /f2"C:sampleuninstall.log"

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

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

set here=%~dp0
cd %here%

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

通过/c 参数将命令传递给cmd.exe可能是一个想法吗?(">执行字符串指定的命令,然后终止"(:

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

也许尝试添加/SMS 开关以确保安装程序.exe不会在实际卸载完成之前过早退出。有传言说,这个/SMS 开关对于下一代 Installshield 设置.exe不是必需的,但旧版本需要它。

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

最新更新