Inno setup exec功能无法正常工作

时间:2016-11-06 09:07:04

标签: exec inno-setup

我有一个extractor.bat,我希望在安装程序完成所有安装后运行。

Extractor.bat包含:

echo ARGUMENT 1 (PATH TO CUSTOM MODS): %1
echo ARGUMENT 2 (PATH TO EXTRACT TO): %2

set custommods=%1
set wotpath=%2

 IF EXIST %custommods%\*.zip (
    for /F "delims=" %%I IN (' dir /b /s /a-d %custommods%\*.zip ') DO (
        "7za.exe" x "%%I" -o%wotpath% -y
    )
 )
 IF EXIST %custommods%\*.7z (
    for /F "delims=" %%I IN (' dir /b /s /a-d %custommods%\*.7z ') DO (
        "7za.exe" x "%%I" -o%wotpath% -y
    )
 )

这是ssPostInstall代码的一部分:

  begin
if (CurStep=ssDone) then
begin
    Exec(ExpandConstant('{app}\extractor.bat'), ExpandConstant('{app}\custom_folder {app}\ > extractor.log'), '', SW_HIDE,     ewWaitUntilTerminated, ErrCode);
    Exec(ExpandConstant('{app}\res_mods\quick_fix.bat'), '', '', SW_HIDE,     ewWaitUntilTerminated, ErrCode);

    logfilepathname := expandconstant('{log}');
    logfilename := ExtractFileName(logfilepathname);
    newfilepathname := expandconstant('{app}\') + 'Installer.log';
    filecopy(logfilepathname, newfilepathname, false);
end;

端;

问题是这个功能在我的电脑上工作正常但是在其他电脑上工作不正常,即使没有任何反病毒。为什么会这样?

我最近将提取器执行移动到[CODE]部分,之前在[RUN]部分中作为一行:

Filename: "{tmp}\extractor.bat"; Parameters: " ""{app}\custom_folder"" ""{app}\"" ";  flags: runhidden;

它在那台特定的电脑上工作正常,但是当我使用代码部分时,它无法正常工作。我试图调试它,并注意到从extractor.bar到Installer.log的输出正在第二行中间被删除,请参阅:

ARGUMENT 1 (PATH TO CUSTOM MODS): D:\Games\GameFolder
ARGUMENT 2 (PATH TO EXTRACT TO): of

一些奇怪的“之处”,仅此而已。

编辑:

试过这个(用cmd宏玩具):

Exec(ExpandConstant('{cmd}'), '/C ' + ExpandConstant('{app}') + '\res_mods\quick_fix.bat', ExpandConstant('{app}'), SW_HIDE, ewWaitUntilTerminated, ErrCode);

并且它根本没有被执行,当然我在该文件夹中有一个quick_fix.bat。

EDIT2:

我目前正在使用这个:

        Exec(ExpandConstant('{app}\extractor.bat'), ExpandConstant('"{app}\Custom_mods" "{app}" > _Extractor.log'), '', SW_HIDE,     ewWaitUntilTerminated, ErrCode);

它的确有效,但不是每个人都有效。它可以安装到包含带空格的名称的文件夹中。

EDIT3:

[Files]
  Source: "{#CompPath}\7za.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall
  Source: "{#CompPath}\7za.dll"; DestDir: "{tmp}"; Flags: deleteafterinstall
  Source: "{#CompPath}\7zxa.dll"; DestDir: "{tmp}"; Flags: deleteafterinstall

编辑:

我试图让quick_fix.bat工作,因为它更容易宏,并且它也没有被执行。

[Files]
  Source: "{#CompPath}\quick_fix.bat"; DestDir: "{app}\res_mods\"; Flags: deleteafterinstall

[CODE]
Exec(ExpandConstant('{cmd}'), '/C ' + ExpandConstant('{app}') + '\res_mods\quick_fix.bat', ExpandConstant('{app}'), SW_HIDE, ewWaitUntilTerminated, ErrCode);

1 个答案:

答案 0 :(得分:1)

我可以看到的一个实际问题是,您没有使用双引号将路径包装到安装文件夹。因此,如果它包含空格(通常它通常安装到Program Files),那么批处理文件将会中断。

Exec(
  ExpandConstant('{app}\extractor.bat'),
  ExpandConstant('"{app}\custom_folder" "{app}\" > extractor.log'),
  '', SW_HIDE, ewWaitUntilTerminated, ErrCode);

所以,也许,在安装程序工作的机器上,安装到没有空格的文件夹。在安装程序不起作用的计算机上,您将安装到包含空格的文件夹中。