将 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);
我正在安装一个 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);
如果它不起作用而你想要
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);