使用 Installshield 16 创建的安装过程中无法执行自定义操作
Custom Action failing to execute during installation created with Installshield 16
我过去 运行 使用 Installshield Limited Edition 的 Visual Studio 这个自定义操作并且它有效。但是现在,当我使用 Installshield 2016 尝试此操作时,此自定义操作会给我一个 1722 错误并回滚安装。日志文件没有提供比 "failed with error 1..." 和 1722 错误更多的详细信息。
我通过向导设置的自定义操作 -
工作目录:安装目录
文件名和命令行:"[SystemFolder]cmd.exe" /c "[INSTALLDIR]somefilename.exe" "'%r' '%keyname=keyname' '%keydll=some.dll' '%appexe=[INSTALLDIR]differentfilename.exe'"
这应该做的是 运行 somefilename.exe 从命令行使用参数“%r”、“%keyname”、“%keydll”和“%appexe”。
当我 运行 它直接在命令行上如此 -
"C:\Program Files (x86)"\somefilename.exe "%r" "%keyname=keyname" "%keydll=some.dll" "%appexe=C:\Program Files (x86)\differentfilename.exe" - 运行 没问题。
我想我在某处遗漏了一些引号,我尝试了各种组合但没有成功。
知道我做错了什么吗?
提前致谢!
几点建议:
你应该 post 与此相关的详细 MSI 日志部分,因为它应该显示完整的解析命令行,假设你已经创建了完整的详细日志而不是部分日志。
不清楚为什么您需要 运行 这个程序带有 cmd 外套。如果它是一个普通的 Windows 程序,只需 运行 可执行文件作为自定义操作。
当您从交互式用户浏览器 运行 shell 中获得一些基础设施(例如工作目录)时,您无法通过 msiexec.exe 进程启动的自定义操作获得这些基础设施.这很重要,因为您没有指定 some.dll 的明确完整路径,因此它能否找到该文件并不明显。
说说这个自定义操作的位置 运行 及其类型可能会有用。例如,如果它变成一个即时自定义操作(所有 VS 自定义操作都被延迟),那么它将失败,因为尚未安装任何文件。同样,如果它被推迟但不知何故在 InstallFiles 标准操作之前它将失败。
运行 由 Visual Studio 生成的项目的所有自定义操作被推迟,并且 运行 在每个系统 "Everyone" 安装中使用系统帐户。如果您的自定义操作需要提升,那么它也必须被推迟,并且 MSI 必须显示 UAC 提升对话框,否则它很可能 运行 但因访问错误而失败。它可能已成为非提升的每个用户安装。
感谢@PhilDW 的建议。
我可能会拿出 cmd 外套,只 运行 exe 试试。
我终于让它工作了,通过更改一些引号等。这是最终的文件名和命令行参数的样子:
"[SystemFolder]cmd.exe" /c start "" /d"C:\Program Files (x86)\foldername\" "somefile.exe" "%r" "%keyname=something" "%keydll =something.dll" "%appexe=C:\Program Files (x86)\otherfilename.exe""=21=]
希望这对某人有所帮助。
我过去 运行 使用 Installshield Limited Edition 的 Visual Studio 这个自定义操作并且它有效。但是现在,当我使用 Installshield 2016 尝试此操作时,此自定义操作会给我一个 1722 错误并回滚安装。日志文件没有提供比 "failed with error 1..." 和 1722 错误更多的详细信息。
我通过向导设置的自定义操作 -
工作目录:安装目录
文件名和命令行:"[SystemFolder]cmd.exe" /c "[INSTALLDIR]somefilename.exe" "'%r' '%keyname=keyname' '%keydll=some.dll' '%appexe=[INSTALLDIR]differentfilename.exe'"
这应该做的是 运行 somefilename.exe 从命令行使用参数“%r”、“%keyname”、“%keydll”和“%appexe”。
当我 运行 它直接在命令行上如此 - "C:\Program Files (x86)"\somefilename.exe "%r" "%keyname=keyname" "%keydll=some.dll" "%appexe=C:\Program Files (x86)\differentfilename.exe" - 运行 没问题。
我想我在某处遗漏了一些引号,我尝试了各种组合但没有成功。
知道我做错了什么吗?
提前致谢!
几点建议:
你应该 post 与此相关的详细 MSI 日志部分,因为它应该显示完整的解析命令行,假设你已经创建了完整的详细日志而不是部分日志。
不清楚为什么您需要 运行 这个程序带有 cmd 外套。如果它是一个普通的 Windows 程序,只需 运行 可执行文件作为自定义操作。
当您从交互式用户浏览器 运行 shell 中获得一些基础设施(例如工作目录)时,您无法通过 msiexec.exe 进程启动的自定义操作获得这些基础设施.这很重要,因为您没有指定 some.dll 的明确完整路径,因此它能否找到该文件并不明显。
说说这个自定义操作的位置 运行 及其类型可能会有用。例如,如果它变成一个即时自定义操作(所有 VS 自定义操作都被延迟),那么它将失败,因为尚未安装任何文件。同样,如果它被推迟但不知何故在 InstallFiles 标准操作之前它将失败。
运行 由 Visual Studio 生成的项目的所有自定义操作被推迟,并且 运行 在每个系统 "Everyone" 安装中使用系统帐户。如果您的自定义操作需要提升,那么它也必须被推迟,并且 MSI 必须显示 UAC 提升对话框,否则它很可能 运行 但因访问错误而失败。它可能已成为非提升的每个用户安装。
感谢@PhilDW 的建议。
我可能会拿出 cmd 外套,只 运行 exe 试试。
我终于让它工作了,通过更改一些引号等。这是最终的文件名和命令行参数的样子:
"[SystemFolder]cmd.exe" /c start "" /d"C:\Program Files (x86)\foldername\" "somefile.exe" "%r" "%keyname=something" "%keydll =something.dll" "%appexe=C:\Program Files (x86)\otherfilename.exe""=21=]
希望这对某人有所帮助。