Привет, я пытаюсь выполнить несколько команд с помощью PHP на машине Windows. Я попробовал этот код:
<?php
$output= shell_exec("powershell.exe");
$output2= shell_exec("write-host gokul");
shell_exec("exit");
echo( '<pre>' );
echo( $output );
echo( $output2 );
echo( '</pre>' );
?>
PHP выполняет каждую команду с новой оболочкой и закрывает ее по завершении!
Я понимаю, что каждый ‘shell_exec’ создает новую оболочку, и элемент управления ожидает завершения выполнения команды. Как я могу создать оболочку, которая остается открытой в фоновом режиме, пока я не закрою Это ?
Не уверен, что ‘proc_open’ или ‘popen’ могут помочь?
ОБНОВИТЬ
когда я пытаюсь PROC_OPEN ()
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("file", "error.txt", "a") // stderr is a file to write to
);
$process = proc_open('cmd.exe', $descriptorspec, $pipes);
if (is_resource($process)) {
fwrite($pipes[0], 'dir');
fwrite($pipes[0], 'powershell.exe');
fwrite($pipes[0], 'write-host gokul');
fclose($pipes[0]);
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);
proc_close($process);
}
Он печатает только подсказку. Могу ли я действительно использовать proc_open для выполнения нескольких команд? Если так, то как?
Microsoft Windows [Version 6.1.7601] Copyright (c) 2009 Microsoft Corporation. All rights reserved. C:\wamp\bin\apache\Apache2.2.17>More?
С помощью proc_open
это правильная попытка, но вам нужно завершить каждую команду символом новой строки. Например, если вы введете команду вручную в сеансе оболочки.
Это должно выглядеть так:
fwrite($pipes[0], 'dir' . PHP_EOL);
fwrite($pipes[0], 'powershell.exe' . PHP_EOL);
fwrite($pipes[0], 'write-host gokul' . PHP_EOL);
Других решений пока нет …