PHP Показывает окно командной строки CMD (Windows)


Обычно вы хотели бы скрыть окно CMD. В моем случае я буду проводить некоторые тесты с PHP+CLI. Было бы очень полезно, если бы PHP можно было заставить запускать всплывающее окно командной строки. Но, увы, я не могу найти способ сделать это.

Следующая команда должна была заставить его работать, но это не так:

START "PHP AE2" CMD /K DIR

Рассматриваемый PHP-код основан на proc_open():

$proc=proc_open($cmd,array(
    0=>array('pipe','r'), // STDIN
    1=>array('pipe','w'), // STDOUT
    2=>array('pipe','w')  // STDERR
),$pipes);
// ....some stream stuff....
$return=proc_close($proc);

Хотя команда выполняется нормально, всплывающее окно не отображается. Я подозреваю, что это особенность Apache. Есть ли способ полностью отделить CMD от его родителя?

Кроме того, я заменю DIR небольшим сценарием/пакетом/программой, которая инициализирует среду, поэтому важно, чтобы я мог выполнить программу после появления всплывающего окна.

(Это в основном для образовательных целей и не будет использоваться в производстве.)

Author: Lightness Races in Orbit, 2011-05-30

2 answers

Я немного опоздал с ответом на этот вопрос, но чтобы помочь закрыть этот вопрос, вот мой ответ.

Команда верна, но вам нужно заставить Apache взаимодействовать с рабочим столом. Если вы находитесь на компьютере с Windows, просто перейдите в раздел службы, найдите Apache и убедитесь, что вы установили флажок "Разрешить службе взаимодействовать с рабочим столом".

 2
Author: Abs, 2011-07-24 14:26:53

Вот проект, который позволяет PHP получать и динамически взаимодействовать с реальным терминалом cmd. Получите его здесь: https://github.com/merlinthemagic/MTS

После загрузки вы просто используете следующий код:

//if you prefer Powershell, replace 'cmd' with 'powershell'
$shellObj    = \MTS\Factories::getDevices()->getLocalHost()->getShell('cmd');

//you might need to ad php to the system environment variable
$strCmd1   = 'START "seq" cmd /c "PHP AE2"';
$return1   = $shellObj->exeCmd($strCmd1);

Вы можете выполнить любую команду, которая вам нравится, против $shellObj, среда поддерживается на протяжении всего срока службы PHP-скрипта. Поэтому вместо того, чтобы объединять команды в файл сценария, просто выполняйте их одну за другой, используя метод exeCmd(), таким образом вы также можете обрабатывать возврат и любые исключения.

 0
Author: MerlinTheMagic, 2016-11-01 16:25:01