2012-07-11 75 views
4

我看到这个问题在这里:How to get an output of an Exec'ed program in Inno Setup?输入重定向在Inno Setup中如何工作?

但我无法得到它的工作我自己,注释掉的代码是我的尝试,使这项工作,但我使出一个bat文件,因为我不能让我的重定向工作。 CacheInstanceNameCacheInstanceDir的全局变量别处定义:

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; 

我在做什么错?

+0

作为一个方面说明,经过进一步测试后,我发现只有第一个参数“qlist”才能通过。我一直在敲打我的脑袋试图想我可能是做错了,但也许它无关重定向。另外,我可以在调试器中看到所有变量都已填充,并且它们显然在消息框中正确显示。 – mcbainpc 2012-07-12 00:52:15

+1

你能更具体一些,*不能让它工作*不是一个很好的方式来描述你的问题。您是否尝试过检查什么在你的'ResultCode'返回'Exec'功能?另外'Exec'函数有一个返回值,如果失败(返回False),那么你很可能会传递错误的参数给它。 – TLama 2012-07-12 00:52:25

+0

TLama,你的评论是适合的,因此我的评论如上。 – mcbainpc 2012-07-12 00:53:24

回答

9

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

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

+0

其中,有趣的是,对另一个问题的答案是什么(只是少些细节:) – Deanna 2012-07-13 09:40:40

0

尝试直接与您的args字符串参数的命令行中运行命令,看看结果是什么,其可能给问题的指示。

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