我想執行一個命令,它將提示我輸入一些內容。如何使用system()或exec()執行兩階段命令
我可以通過試驗&的錯誤瞭解這一點,但最好的方法是什麼?
- 寫一個小批處理文件和Exec(I)?
- Exec($ command。'\ r \ n'。$ input);
- 還有其他的東西嗎?
我想執行一個命令,它將提示我輸入一些內容。如何使用system()或exec()執行兩階段命令
我可以通過試驗&的錯誤瞭解這一點,但最好的方法是什麼?
您試圖執行的命令是什麼?從你留下的評論看,你聽起來像是在嘗試執行PHP本身? (你通過C:\xampp\php\php.exe
到proc_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通常需要四根管子才能工作。一個用於輸入數據(要加密/解密的數據),一個用於輸出數據,一個用於錯誤,另一個用於輸入密碼。
由於我解密一個文件,我不需要看到程序的輸出,我只需要看看是否有錯誤。沒有錯誤意味着可以在文件中找到輸出。因此我忽略了輸出管道並用它來發送密碼。根據您的使用情況,您可能不需要這樣棘手的解決方案。
exec()
不適用於交互式程序。爲了能夠與您的子流程對話,您需要使用允許雙向通信的proc_open()
。
這看起來確實是這樣做的方式,但我仍然在努力讓示例工作,並會回覆給您。錯誤文件包含「'php'不被識別爲內部或外部命令, 可操作的程序或批處理文件。」但php.exe * IS *在我的Windows系統路徑。 – Mawg 2010-11-29 02:41:04