プロが教えるわが家の防犯対策術!

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; // ????

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

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が見つからない時は、教えて!gooで質問しましょう!