実行結果を取得するには?


ボッター  2006-01-16 18:39:40  No: 19660

以下のようなプログラムを作成し、実行してみました。
------------------------
SetCurrentDir('D:\');
Result := ProgramExecute('C:\Program Files\Borland\CBuilder6\Bin\make /? > Report.txt');
------------------------
で呼び出したのですが Report.txt が作成されません。
Result は 0 で結果的には成功しているようです。
何か処理が必要なのでしょうか?

function ProgramExecute(CmdStr: String): Longword;
var
  SI:  TStartupInfo;
  PI:  TProcessInformation;
begin
  with SI do begin
    FillChar(SI, SizeOf(SI), 0);
    Cb      := SizeOf(SI);
    dwFlags := STARTF_USESHOWWINDOW;
    wShowWindow := SW_HIDE;
  end;

  Result := WAIT_FAILED;
  if CreateProcess(Nil, PChar(CmdStr), Nil, Nil, False, 0, Nil, Nil, SI, PI) then begin
    WaitForSingleObject(PI.hProcess, INFINITE);
  GetExitCodeProcess(PI.hProcess, Result);
  CloseHandle(PI.hProcess);
  end else begin
    Result := $FFFFFFFF;
  end;
end;


deldel  2006-01-16 21:56:02  No: 19661

PChar(CmdStr) を、
PChar('command.com /c ' + CmdStr) にすると良いのではないかと思いますが・・・


さらに  2006-01-16 22:33:20  No: 19662

>Result := ProgramExecute('C:\Program Files\Borland\CBuilder6\Bin\make /? > Report.txt');
スペースを含むPATHはダブルクォ−テーションで囲む。
Result := ProgramExecute('"C:\Program Files\Borland\CBuilder6\Bin\make" /? > Report.txt');


ボッター  2006-01-16 23:43:49  No: 19663

ありがとうございます。

早速試してみました。
deldelさんのとおり
'command.com /c ' を追加しました。
空の  Report.txt ができました。
中身がありません。

さらにさんのように " でくくってみました。
CreateProcess で True が返ってこず
このFunction からは $FFFFFFFF がリターンされます。

以下のように変更しただけですけどどこに間違いが?
Result := ProgramExecute('"command.com /c C:\Program Files\Borland\CBuilder6\Bin\make" /? > Report.txt');


間違い探し  2006-01-16 23:57:25  No: 19664

>以下のように変更しただけですけどどこに間違いが?
>Result := ProgramExecute('"command.com /c C:\Program Files\Borland\CBuilder6\Bin\make" /? > Report.txt');

IQサプリ初級の間違い探し
Result := ProgramExecute('command.com /c "C:\Program Files\Borland\CBuilder6\Bin\make" /? > Report.txt');


ボッター  2006-01-17 00:03:27  No: 19665

間違い探しさんへ、
実はそれも、試してたりして・・・

結果は、0バイトの Report.txt が出力されるんですよね・・・
'"command.com /c C:\Program Files\Borland\CBuilder6\Bin\make" /? > Report.txt'
'command.com /c "C:\Program Files\Borland\CBuilder6\Bin\make" /? > Report.txt'
'command.com /c "C:\Program Files\Borland\CBuilder6\Bin\make /?" > Report.txt'
'command.com /c "C:\Program Files\Borland\CBuilder6\Bin\make /? > Report.txt"'
いずれも、だめでした。


ボッター  2006-01-17 00:09:54  No: 19666

今回の場合に限っては、パスが設定されているので・・・
'command.com /c make /? > Report.txt'
これでできました。
でも、実際にはパス通っていないので問題です・・・・・
と、いいつつこれも
'command.com /c C:\Progra~1\Borland\CBuild~1\Bin\make /? > Report.txt'
にて、実行できました。

さて、そこで・・・なのですが、ディレクトリ
「'C:\Progra~1\Borland\CBuild~1\Bin'」のこの部分を
「C:\Program Files\Borland\CBuilder6\Bin」から求めるには
どうすればよいのでしょうか?
私が知っているのは、ひとつずつ区切っていって、
FindFirst,FindNext で求めるしか手はないのでしょうか?
それとも標準関数ってありますか?


ボッター  2006-01-17 00:11:29  No: 19667

もちろん、短いディレクトリ名でなくても長いディレクトリ名を
使ってできる方法があれば、
後々プログラムを作成する上ではそちらの方が都合がいいのですが


ハリポタも千里眼にあらず  2006-01-17 00:18:23  No: 19668

>実はそれも、試してたりして・・・
Result := ProgramExecute('command.com /c "C:\Program Files\Borland\CBuilder6\Bin\make" /? > Report.txt');
これでうまくいかないなら、原因は別の場所。自分で探すべし。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加