php exec() реагирует иначе, чем приложение Windows 8 metro
Я хотел изменить значки плиток для настольных приложений в новом меню "Пуск" Windows 8. Таким образом, они будут соответствовать другим приложениям metro.
Я создал простое приложение metro, которое вызывает простой php-файл локального хоста
<?php
// check if the chrome is in the task list
exec('tasklist /FI "IMAGENAME eq chrome.exe" 2>NUL | find /I /N "chrome.exe">NUL');
// get a return value I can check
$runing = exec('if "%ERRORLEVEL%"=="0" echo Programm is running');
if ($runing === 'Programm is running'){
// the program is open already
echo $runing;
} else {
// the program is not running and should be opened
exec('C:\Users\Gerdy\AppData\Local\Google\Chrome\Application\chrome.exe');
}
?>
Если я запускаю этот файл из chrome, он повторяет "Программа запущена".
Это здорово!
Если я запускаю его из пусковой установки Windows, а Chrome не запущен, Chrome не запускается.
Если я исключу оператор if и просто бежать.
exec('C:\Users\Gerdy\AppData\Local\Google\Chrome\Application\chrome.exe');
Из меню "Пуск". Он откроет новое окно Chrome независимо от того, открыт ли уже chrome.
Так что, я думаю, мой вопрос таков : Что я могу сделать, чтобы мой php-файл мог проверить, открыт ли chrome, а если нет, то открыть его?
Эта модель на самом деле работает для любой другой программы, только не для браузеров.
Мое лучшее предположение заключается в том, что он меньше связан с моими командами и больше связан с самим chrome. Это может быть цель, которую мне нужно добавить, я не знаю.
1 answers
Вы можете использовать инструментарий управления Windows:
Если вы не использовали wmic
до этого, вам следует установить его, запустив wmic
из cmd.exe
.
Затем он должен сказать что-то вроде:
WMIC Installing... please wait.
После этого wmic
готов к использованию:
function getProcessId( $imagename ) {
ob_start();
passthru('wmic process where (name="'.$imagename.'") get ProcessId');
$wmic_output = ob_get_contents();
ob_end_clean();
// Remove everything but numbers and commas between numbers from output:
$wmic_output = preg_replace(
array('/[^0-9\n]*/','/[^0-9]+\n|\n$/','/\n/'),
array('','',','),
$wmic_output );
if ($wmic_output != '') {
// WMIC returned valid PId, should be safe to convert to int:
$wmic_output = explode(',', $pids);
foreach ($wmic_output as $k => $v) { $wmic_output[$k] = (int)$v; }
return $wmic_output;
} else {
// WMIC did not return valid PId
return false;
}
}
// Find out process id's:
if ($pids = getProcessId( "chrome.exe" )) {
foreach ($pids as $pid) {
echo "Chrome.exe is running with pid $pid";
}
} else {
echo "Chrone.exe is not running";
}
Я не проверял это и просто написал это из головы, поэтому может быть какое-то исправление, и вам следует проверить вывод wmic, запустив его из командной строки с теми же аргументами, чтобы убедиться, что preg_replace()
делает это правильно (получите pid из wmic вывод).
ОБНОВЛЕНИЕ:
Протестировано, и кажется, что wmic
не возвращает никаких кодов состояния, поэтому я обновил свою функцию php, чтобы отразить это поведение.
ОБНОВЛЕНИЕ:
Теперь он также обрабатывает несколько процессов и возвращает все идентификаторы pid в виде индексированного массива или false, когда процесс не запущен.
О WMI:
Инструментарий управления Windows - очень мощный интерфейс, как и wmic
инструмент командной строки. Здесь перечислены некоторые функции WMI