5

私はここでこの質問を見ました:Inno SetupでExecのプログラムの出力を取得する方法は?

しかし、自分で動作させることはできません。コメントアウトされたコードは、これを動作させるための私の試みですが、リダイレクトを動作させることができなかったため、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コマンドが返される可能性がありますが、エラーTrueResultCode示され、リダイレクトで使用されるファイルに出力が書き込まれないことがわかりました。別のインスタンスによって使用されているファイルのこの特定のインスタンスでは、SysErrorMessage(ResultCode)コマンドは単純に を返しますIncorrect function。ただし、最初に述べたようにコマンドラインで直接テストすると、ファイルが別のプロセスで使用されていることが返されます。

于 2014-01-31T10:42:39.267 に答える