php exec () реагирует не так, как приложение для Windows 8 metro - PullRequest
4 голосов
/ 19 марта 2012

Я хотел изменить значки плитки для настольных приложений в новом меню «Пуск» Windows 8. Таким образом, они будут соответствовать другим приложениям метро.

Я сделал простое приложение для метро, ​​которое вызывает простой php файл localhost

<?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 Ответ

2 голосов
/ 23 апреля 2012

Вы можете использовать Инструментарий управления 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).

UPDATE:

Протестировано и похоже, что wmic не возвращает никаких кодов состояния, поэтому обновил мою функцию php, чтобы отразить это поведение.

ОБНОВЛЕНИЕ:

Теперь он обрабатывает несколько процессов и возвращает все pids как проиндексированные.массив или false, если не запущен ни один процесс.

О WMI:

Инструментарий управления Windows - это очень мощный интерфейс, а также wmic инструмент командной строки. Здесь перечислены некоторые функции WMI

...