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'。我相信它使用名称列,但一次只有一个字符。

$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 回答