2010-11-29 62 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

相關問題