Как работает перенаправление вывода в Inno Setup?
Я видел этот вопрос здесь: Как получить вывод программы Exec в 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;
Что я делаю неправильно?
2 ответа
Синтаксис перенаправления вывода является функцией командной строки, а не базовыми API-интерфейсами Windows. Поэтому, если вы хотите перенаправить вывод, вам нужно вызвать команду через {cmd} /c actual-command-line > output-file
, Не забудьте включить цитаты, где это уместно, как {tmp}
(и другие константы) могут содержать пробелы.
Тем не менее, вы должны тщательно переписать все, что есть в этом пакетном файле, в реальный код. Все, что вы можете сделать в пакетном файле, вы можете сделать либо непосредственно в скрипте Inno, либо в DLL, которую вы вызываете из скрипта. И это дает вам больший контроль над проверкой ошибок и форматом любых данных, которые вы хотите получить.
Попробуйте запустить команду прямо в командной строке с аргументами в вашем args
строка, чтобы увидеть результат, который может дать указание на проблему.
Кроме того, убедитесь, что файл, на который вы пытаетесь перенаправить вывод, не используется другим процессом. Я обнаружил, что когда это происходит, фактическая команда может успешно выполняться с Exec
возвращение команды True
но ResultCode
указывает на ошибку, и выходной файл не записывается в файл, используемый при перенаправлении. В этом конкретном случае файла, используемого другим экземпляром SysErrorMessage(ResultCode)
команда возвращает просто Incorrect function
, Тем не менее, тестирование непосредственно в командной строке, как я упоминал вначале, возвращает, что файл используется другим процессом.