Как работает перенаправление вывода в 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, Тем не менее, тестирование непосредственно в командной строке, как я упоминал вначале, возвращает, что файл используется другим процессом.

Другие вопросы по тегам