【发布时间】:2015-12-28 12:48:56
【问题描述】:
我正在尝试使用 CMD 脚本调用 ngen 以创建与 InnoSetup 一起安装的应用程序的本机映像。为此,当 Curstep 是 ssPostInstall 时,我通过在 curStepChanged 函数中调用 ShellExec 来运行所述脚本。脚本本身查找 ngen 的位置,并以应用程序的路径作为参数调用它。 问题是脚本在 aprox 之后停止。 1秒没有任何错误。 ShellExec 返回 true,脚本创建的日志文件为空。
这里有详细信息: InnoSetup:
procedure CurStepChanged(CurStep: TSetupStep);
var
Param : String;
ResultCode : Integer;
begin
if CurStep=ssPostInstall then begin
try
ProgressPage.SetProgress(0,2);
ProgressPage.SetText('Tell Application about the Database','');
ProgressPage.Show;
Exec(ExpandConstant('{tmp}') + '\XMLAndIniReplacer.exe',ExpandConstant('{app}')+'\Application.exe.config'+ ' ' +DBPage.Values[0] + ' ' + DBPage.Values[1] + ' ' + DBPage.Values[2] + ' ' + DBPage.Values[3] + ' ' + ExpandConstant('{app}')+'\Application.ini' + ' ' + ExpandConstant('{language}'),'', SW_HIDE, ewWaitUntilTerminated, ResultCode)
ProgressPage.SetProgress(1,2);
ProgressPage.SetText('Make Application faster ','This operation could take a few minutes');
Param := '"' + ExpandConstant('{app}') + '"';
if not ShellExec('', ExpandConstant('{tmp}') + '\ngen-run.cmd', Param,'', SW_SHOW, ewWaitUntilTerminated, ResultCode) then begin
MsgBox(SysErrorMessage(ResultCode), mbError, MB_OK);
end;
ProgressPage.SetProgress(2,2);
finally
ProgressPage.Hide;
end;
end;
end;
CMD 文件:
for /f "tokens=3* delims= " %%a in ('reg.exe query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework /v InstallRoot') do set "UTILPATH=%%a\v4.0.30319\ngen.exe"
echo %1
echo %2
echo %UTILPATH%
%UTILPATH% %2 %1\Application.exe > ngen.log
一切正常,只是脚本被调用,打开大约一秒钟,然后关闭而不告诉我任何东西。也没有原生图像,因为几兆字节的重 .exe 在一秒钟内会非常快。此外,CMD 文件中的黑魔法是其他人的作品。我不知道里面发生了什么。我只知道,它以应用程序作为参数调用 ngen。到目前为止,它工作得很好。那么这里有什么问题呢?
【问题讨论】:
-
for /f "tokens=3* delims= " %%a ...在delims= "中不返回带有多个空格的输出。尝试如下默认分隔符:for /f "tokens=3*" %%a ... -
delims应该是一个制表符和一个空格,对吧? -
单独执行批处理文件是否有效?
-
脚本在任何地方都可以正常工作。是的,
delims旨在成为一个制表符和一个空格。据我所知,扔掉它不会影响脚本。 -
运行命令行以确保捕获任何可能的错误:
Exec(ExpandConstant('{cmd}'), '/C ' + ExpandConstant('{tmp}') + '\ngen-run.cmd >c:\somewrittablepath\ngen.log 2>&1', ExpandConstant('{tmp}'), SW_SHOW, ewWaitUntilTerminated, ResultCode)并删除批处理文件本身中的> ngen.log重定向。
标签: batch-file inno-setup ngen