5

我在这里看到了这个问题:How to get an output of an Exec'ed program in Inno Setup?

但我自己不能让它工作,注释掉的代码是我试图让它工作的尝试,但我求助于一个 bat 文件,因为我无法让我的重定向工作。CacheInstanceName并且CacheInstanceDir是在别处定义的全局变量:

function CheckCacheExists(): Integer;
var
  args: String;
  buffer: String;
  ResultCode: Integer;
begin
  // args := 'qlist ' + CacheInstanceName + ExpandConstant(' nodisplay > {tmp}\appcheck.txt');
  // MsgBox(args, mbInformation, MB_OK);
  // Exec(CacheInstanceDir + '\bin\ccontrol.exe', 'qlist ' + CacheInstanceName + ExpandConstant(' nodisplay > "{tmp}\appcheck.txt"'), '', SW_SHOW,

  ExtractTemporaryFile('checkup.BAT');
  Exec(ExpandConstant('{tmp}\checkup.BAT'), CacheInstanceDir + ' ' + 
    CacheInstanceName + ' ' + ExpandConstant('{tmp}'), '', SW_SHOW,
    ewWaitUntilTerminated, ResultCode);
  LoadStringFromFile(ExpandConstant('{tmp}\appcheck.txt'),buffer);
  if Pos('^', buffer) = 0 then
  begin
    Result := 0
  end
  else 
  begin
    Result := 1
  end 
end;

我究竟做错了什么?

4

2 回答 2

10

输出重定向语法是命令提示符的一项功能,而不是核心 Windows API。因此,如果要重定向输出,则需要通过{cmd} /c actual-command-line > output-file. 不要忘记在适当的地方包含引号,因为{tmp}(和其他常量)可能包含空格。

但是,您应该强烈考虑将该批处理文件中的任何内容重写为实际代码。您可以在批处理文件中执行的任何操作都可以直接在 Inno 脚本或从脚本调用的 DLL 中执行。这使您可以更好地控制错误检查和要检索的任何数据的格式。

于 2012-07-12T20:58:22.963 回答
0

尝试使用字符串中的参数直接在命令行上运行该命令,args以查看可能指示问题的结果。

此外,请检查您尝试将输出重定向到的文件是否未被其他进程使用。我发现当发生这种情况时,实际命令可能会成功执行,Exec命令返回True,但ResultCode指示错误并且没有输出写入重定向中使用的文件。在另一个实例正在使用的文件的这个特定实例中,该SysErrorMessage(ResultCode)命令仅返回Incorrect function. 但是,正如我首先提到的,直接在命令行上进行测试会返回该文件正在被另一个进程使用。

于 2014-01-31T10:42:39.267 回答