2010-11-29 89 views
0

我想执行一个命令,它将提示我输入一些内容。如何使用system()或exec()执行两阶段命令

我可以通过试验&的错误了解这一点,但最好的方法是什么?

  • 写一个小批处理文件和Exec(I)?
  • Exec($ command。'\ r \ n'。$ input);
  • 还有其他的东西吗?

回答

2

您试图执行的命令是什么?从你留下的评论看,你听起来像是在尝试执行PHP本身? (你通过C:\xampp\php\php.exeproc_open()

任何你想在php.exe中做的事情,你可以做,而无需运行可执行文件。当您从Web服务器请求.php文件时,可执行文件由Apache调用。因此,如果您确实需要运行PHP代码,那么您只需编写它。你不会告诉PHP来加载PHP解释器。这很愚蠢=)就像为英语说话者配备英语口译员一样。

如果您特别告诉我们您正在尝试运行的命令,那么我们可能会提供有关如何完成它的更好解释。我从我自己的经验中知道一个例子,我不得不使用proc_open()为了用GPG加密文件。

$descriptors = array(
    0 => array("pipe", "r"), // STDIN. Used to feed input 
    1 => array("pipe", "r"), // STDOUT. We are writing to it, though 
    2 => array("pipe", "w"), // STDERR. Used to read errors 
); 
// Build the command line and start the process 
$cmd = '"C:/program files/gnu/gnupg/gpg.exe" --batch --no-verbose --passphrase-fd 1 --output decrypted.zip --decrypt encrypted.zip.gpg'; 
$gpg = proc_open($cmd, $descriptors, $pipes); 
if(is_resource($gpg)) { 
    // Push passphrase to custom pipe 
    fwrite($pipes[1], $passphrase); 
    fclose($pipes[1]); 
    proc_close($gpg); 
} 

注意,对于STDOUT它说:“我们正在写它,虽然”。这段代码实际上是我对Windows中一个问题的解决方案(Vista和XP,不知道7是否解决了这个问题)。 Windows只允许3管道与命令行程序进行通信,而UNIX允许创建更多(我认为256或者其他)。 GPG通常需要四根管子才能工作。一个用于输入数据(要加密/解密的数据),一个用于输出数据,一个用于错误,另一个用于输入密码。

由于我解密一个文件,我不需要看到程序的输出,我只需要看看是否有错误。没有错误意味着可以在文件中找到输出。因此我忽略了输出管道并用它来发送密码。根据您的使用情况,您可能不需要这样棘手的解决方案。

1

exec()不适用于交互式程序。为了能够与您的子流程对话,您需要使用允许双向通信的proc_open()

+0

这看起来确实是这样做的方式,但我仍然在努力让示例工作,并会回复给您。错误文件包含“'php'不被识别为内部或外部命令, 可操作的程序或批处理文件。”但php.exe * IS *在我的Windows系统路径。 – Mawg 2010-11-29 02:41:04