卸载期间自定义操作未执行

时间:2017-05-31 15:21:25

标签: windows-installer installshield uninstall custom-action

我正在使用installshield 2016处理MSI安装程序。我正在尝试向卸载添加自定义操作,该卸载在卸载软件之前运行工具。该工具随软件一起安装,需要以管理员模式运行。该工具旨在在卸载开始之前运行一些手动清理操作。

我使用“新建EXE>路径引用目录”使用自定义操作向导添加了自定义操作。 INSTALLDIR在目录表中定义,包含用户定义的安装路径。 .exe和参数的名称是替代名称。

  

工作目录:INSTALLDIR
  档案名称&命令行:tool.exe / action parameter1 parameter2 parameter3
  退货处理:同步
  脚本内执行:系统上下文中的延迟执行
  执行schedulintg:始终执行
  MSI型号:3170
  在修补程序卸载期间运行:否   安装Exec序列:在AnotherCustomAction之后执行   安装Exec条件:

注意:AnotherCustomAction设置为在InstallInitialize之后执行。它与此非常相似,但执行得当。

(我知道安装exec条件最终应该是REMOVE =“ALL”,但我在某个时候删除了它以确保不会导致问题)

安装期间将INSTALLDIR属性写入注册表;我添加了AppSearch和RegLocator条目以确保它被回读。

我在启用日志记录的情况下运行安装程序,我看到以下内容:

  

MSI(s)(30:14)[13:57:19:162]:执行操作:ActionStart(Name = RunTool ,,)
  MSI(s)(30:14)[13:57:19:162]:执行op:CustomActionSchedule(Action = RunTool,ActionType = 3170,Source = C:\ Installation Test \,Target = tool.exe / action parameter1 parameter2参数3,)
  MSI(s)(30:14)[13:57:19:162]:注意:1:1721 2:RunTool 3:C:\ Installation Test \ 4:tool.exe / action parameter1 parameter2 parameter3
  信息1721.此Windows Installer程序包存在问题。无法运行此安装所需的程序。请联系您的支持人员或包装供应商。操作:RunTool,位置:C:\ Installation Test \,命令:tool.exe / action parameter1 parameter2 parameter3

如果我到达文件夹C:\ Installation Test \并手动运行tool.exe / action parameter1 parameter2 parameter3,一切都按原样运行。在某些时候,有人建议可能问题是安装路径中有一个空间,但是没有空格的路径的新尝试没有解决它。

知道这里出了什么问题吗?这是正确的做法吗?

我无法提供项目本身(公司政策),但我会尝试回答您可能遇到的任何其他问题。

2 个答案:

答案 0 :(得分:0)

我只有使用InstallShield 2015的经验,并且发现自定义操作有时候有点棘手,我实际上只是想在评论中发布这个(但我的代表太低)让你尝试而不是答案所以如果这不起作用,希望人们不会过于苛刻地投票给我。

首先,将您的返回处理设置为Synchronous(忽略退出代码),然后即使您可以指定正确的文件夹,尝试在Filename和command中显式设置路径,并用引号分别包围您的文件名和参数。 / p>

示例:

  

工作目录:INSTALLDIR

     

档案名称&命令行:" [INSTALLDIR] tool.exe" " /动作" "参数1" "参数2" "参数3"

我没有使用MSI类型3170,但已将其用于类型1122,1058和1250.

正如克里斯托弗提到的那样,你也想看看日程安排,但用引号括起来不应该受到伤害。

祝你好运。

答案 1 :(得分:0)

最可能的问题是,您正在运行无人值守的CA,以使其升级。这意味着它正在使用系统帐户运行,因此失败可能与在此交互式用户上下文中使用此帐户而不是从shell运行相关联。作为系统,它将无法访问任何有意义的用户位置(例如Desktop文件夹和其他人,HKCU),并且无法与交互式用户的桌面交互(出于安全原因,与不允许与桌面交互的系统服务相同)。它没有工作目录(因为默认值是由资源管理器设置的,而不是你的运行方式),并且它没有网络访问权限。基本上,您需要使用系统帐户运行代码并查看故障点,或者您可能会在代码中看到该列表中的内容。