我在这里看到了这个问题: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;
我做错了什么?
答案 0 :(得分:9)
输出重定向语法是命令提示符的一个功能,而不是核心Windows API。因此,如果要重定向输出,则需要通过{cmd} /c actual-command-line > output-file
调用该命令。不要忘记在适当的地方加入引号,因为{tmp}
(和其他常量)可能包含空格。
但是,您应该强烈考虑将该批处理文件中的任何内容重写为实际代码。您可以在批处理文件中执行任何操作,您可以直接在Inno脚本中或从脚本调用的DLL中执行此操作。这使您可以更好地控制错误检查以及要检索的任何数据的格式。
答案 1 :(得分:0)
尝试使用args
字符串中的参数直接在命令行上运行命令,以查看可能指示问题的结果。
此外,请检查您尝试将输出重定向到的文件未被其他进程使用。我发现当发生这种情况时,实际命令可以成功执行,Exec
命令返回True
,但ResultCode
表示错误,并且没有输出写入重定向中使用的文件。在另一个实例正在使用的此特定文件实例中,SysErrorMessage(ResultCode)
命令只返回Incorrect function
。但是,如我前面提到的那样,直接在命令行上进行测试会返回该文件正由另一个进程使用。