0

コード:

$exchangesnapin = "Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010";
$output = shell_exec('powershell '.$exchangesnapin.';"get-mailboxdatabase" 2>&1'); 
echo( '<pre>' );
echo( $output );
echo( '</pre>' );

結果:

Name                           Server          Recovery        ReplicationType 
----                           ------          --------        --------------- 
Mailbox Database 0651932265    EGCVMADTEST     False           None        
Mailbox Database 0651932266    EGCVMADTEST     False           None    

で試してみました

echo( $output[1] );

結果は文字「N」のみでした。名前の列を使用していると思いますが、一度に1文字ずつです。

$output[1] is 'N', $output[2] is 'a'.

メールボックスリストを配列に入れる方法はありますか?

4

1 に答える 1

2

PHP から外部プログラム (powershell) を実行しようとしていて、出力を配列として取得しようとしています。PHP で外部プログラムを実行するには、以下を使用できます。

プロセス制御拡張機能 (PCNTL、popen) を使用すると、より多くの制御が可能になりますが、より多くのコードと時間がかかります。実行関数を使用する方が簡単です。

この状況では、exec() を使用すると、各インデックスが powershell 出力の行である配列に powershell の出力を含めることができます。

<?php
$output = array(); // this would hold the powershell output lines
$return_code = 0; // this would hold the return code from powershell, might be used to detect execution errors
$last_line = exec("powershell {$exchangesnapin} get-mailboxdatabase 2>&1", $output, $return_code);
echo "<pre>";
// print_r($output); view the whole array for debugging
// or iterate over array indexes
foreach($output as $line) {
    echo $line . PHP_EOL;
}
echo "</pre>";
?>

(ドキュメントに記載されているように)powershell の出力のみをエコーし​​たい場合は、passthru ()関数を使用できることに注意してください。exec() を使用するとメモリを使用して外部プログラムの出力が保存されますが、passthru を使用するとこのストレージが使用されないため、メモリの使用量が少なくなります。しかし、出力はそれ以上の処理には使用できず、PHP の標準出力に正しく送信されます。

最後に、望ましくないシステム効果のリスクを軽減するために、外部プログラムの実行には慎重なデータ検証が必要であることに注意してください。実行コマンドを構成するデータに対して必ずescapeshellarg()を使用してください。

于 2012-06-26T04:01:26.060 に答える