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. Это может быть цель, которую мне нужно добавить, я не знаю.

Author: Chris, 2012-03-19

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

 2
Author: Sampo Sarrala, 2012-04-24 16:38:24