出産前後の痔にはご注意!

PHP5のWindows版を使っています。
外部コマンドを実行して、Windowsのバッチファイルのエラーレベル値と標準出力(標準エラー?)の3つを取得できる関数はありますか?

test.cmdの中味

echo 標準出力内容です。
echo バッチファイルで標準エラー出力はわかりませんが
exit /b 2

list ($ret, $stdout, $stderr) = 何か関数("test.cmd")

echo $ret; // 2
echo $stdout; // 標準出力内容です。\nバッチファイルで標準エラー出力はわかりませんが
echo $stderr; // ????

よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

1関数で行うそのものズバリな関数はありませんが、


proc_open/proc_close と pipe を使うことで実現できます。
http://php.net/manual/ja/function.proc-open.php

コードにするとこんな感じでしょうか。
---
<?php

list($ret, $stdout, $stderr) = process("test.cmd");
print "ret=$ret\n";
print "stdout=$stdout\n";
print "stderr=$stderr\n";

function process($cmd) {
$result_code = -1;
$result_stdout = '';
$result_stderr = '';

$descriptorspec = array(
0 => array("pipe", "r"), // 0=STDIN
1 => array("pipe", "w"), // 1=STDOUT
2 => array("pipe", "w") // 2=STDERR
);
$process = proc_open($cmd, $descriptorspec, $pipes);
if (is_resource($process)) {
fclose($pipes[0]);

$result_stdout = stream_get_contents($pipes[1]);
fclose($pipes[1]);

$result_stderr = stream_get_contents($pipes[2]);
fclose($pipes[2]);

$result_code = proc_close($process);
}
return array($result_code, $result_stdout, $result_stderr);
}
?>
---
stdin はパイプにする必要はありませんが、
入力待ちになって呼び出したプログラムが止まってしまうのを防ぐため、パイプにした上で何も入れずに閉じてます。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング