将 AfterInstall 与 Inno Setup 一起使用时如何 运行 带有包含空格的路径的命令(捆绑的 JRE)

How to run a command with path including spaces (bundled JRE) when using AfterInstall with Inno Setup

我正在安装一个 Java 程序作为一个带有捆绑 JRE 文件夹的 exe。我无法通过我的应用程序成功调用捆绑的 java.exe 的设置。

所以我的笔记本电脑已经安装了 Java,所以下面的工作有效:

[Files]
Source: "jre\*"; DestDir: "{app}\jre"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "build\launch4j\Application Lite.exe"; DestDir: "{app}"; Flags: ignoreversion; \
    AfterInstall: MyAfterInstall
[Code]
procedure MyAfterInstall();
var ResultCode: Integer;
begin
    Exec(
        'cmd.exe',
        '/c java -cp ' + AddQuotes(ExpandConstant('{app}\Application Lite.exe')) +
            ' com.examplesoftware.applicationlite.support.hibernateSupport',
        '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
end;

其中 {app} 默认为 c:\Example Software\Application Lite

当我尝试使用捆绑的 JRE 时,以下内容不起作用:

[Code]
procedure MyAfterInstall();
var ResultCode: Integer;
begin
    Exec(
        'cmd.exe',
        '/k ' + AddQuotes(ExpandConstant('{app}\jre\bin\java.exe')) +
            ' -cp ' + AddQuotes(ExpandConstant('{app}\Application Lite.exe')) +
            ' com.examplesoftware.applicationlite.support.hibernateSupport',
        '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
end;

我收到错误:

'c:\Example' is not recognized as an internal or external command, operable program or batch file.

如果我使用 echo 和这样的代码:

Exec(
    'cmd.exe',
    '/k echo ' + AddQuotes(ExpandConstant('{app}\jre\bin\java.exe')) +
        ' -cp ' + AddQuotes(ExpandConstant('{app}\Application Lite.exe')) +
        ' com.examplesoftware.applicationlite.support.hibernateSupport',
    '', SW_SHOW, ewWaitUntilTerminated, ResultCode);

并复制有效的命令。我不明白为什么它坏了。

您不需要 cmd,它只会让事情变得更复杂。这应该有效:

Exec(
  ExpandConstant('{app}\jre\bin\java.exe'),
  '-cp ' + AddQuotes(ExpandConstant('{app}\Application Lite.exe')) + 
    ' com.examplesoftware.applicationlite.support.hibernateSupport',
  '', SW_SHOW, ewWaitUntilTerminated, ResultCode);

如果它不起作用而你想要 , you need to wrap whole command to double-quotes:

Exec(
  'cmd.exe',
  '/k "' + AddQuotes(ExpandConstant('{app}\jre\bin\java.exe')) +
    ' -cp ' + AddQuotes(ExpandConstant('{app}\Application Lite.exe')) +
    ' com.examplesoftware.applicationlite.support.hibernateSupport"',
  '', SW_SHOW, ewWaitUntilTerminated, ResultCode);