получить информацию обо всех запущенных процессах с помощью QProcess

несколько дней назад я спросил о том, как получить все запущенные процессы в системе с помощью QProcess. я нашел командную строку, которая может выводить все процессы в файл:

C:\WINDOWS\system32\wbem\wmic.exe" /OUTPUT:C:\ProcessList.txt ПРОЦЕСС получить заголовок

это создаст файл C:\ProcessList.txt, содержащий все запущенные процессы в системе. интересно, как я могу запустить его с помощью QProcess и вывести его вывод в переменную.

кажется, что каждый раз, когда я пытаюсь запустить его и прочитать, ничего не происходит:

QString program = "C:\\WINDOWS\\system32\\wbem\\wmic.exe";
QStringList arguments;
arguments << "/OUTPUT:C:\\ProcessList.txt" <<"PROCESS"<< "get"<< "Caption";

process->setStandardOutputFile("process.txt");
process->start(program,arguments);

QByteArray result = process->readAll();

я предпочитаю вообще не создавать process.txt и выводить весь вывод в переменную...


person kaycee    schedule 13.04.2010    source источник
comment
Кейси -- я проголосовала за закрытие, думая, что это не вопрос, но при более внимательном прочтении я вижу, что это действительно так. Виноват.   -  person Brian MacKay    schedule 13.04.2010
comment
У вас есть wmic, отправляющий вывод на c:\ProcessList.txt, и вы перенаправляете стандартный вывод wmic на process.txt. Какой вывод вы пытаетесь сохранить в переменной?   -  person Kaleb Pederson    schedule 13.04.2010
comment
я хотел бы сохранить весь вывод файла, скажем, на карте... вывод файла выглядит следующим образом: services.exe C:\Windows\system32\services services2.exe C:\Windows\system32\services services3.exe C :\Windows\system32\services. . . но почему-то сохраняется только первая строка...   -  person kaycee    schedule 14.04.2010


Ответы (2)


Вы можете запустить wmic.exe с переключателем «/OUTPUT:STDOUT», чтобы вывести информацию о процессе непосредственно на стандартный вывод. Однако мне не удалось прочитать эту информацию через QProcess API и сохранить ее в переменной. Вот код, который я использовал:

#include <QtCore/QCoreApplication>
#include <QProcess>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QProcess process;
    process.setReadChannel(QProcess::StandardOutput);
    process.setReadChannelMode(QProcess::MergedChannels);
//    process.start("cmd.exe /C echo test");
    process.start("wmic.exe /OUTPUT:STDOUT PROCESS get Caption");

    process.waitForStarted(1000);
    process.waitForFinished(1000);

    QByteArray list = process.readAll();
    qDebug() << "Read" << list.length() << "bytes";
    qDebug() << list;
}

Этот код успешно перехватывает выходные данные «cmd.exe /C echo test», но не работает с wmic.exe. Кажется, что процесс wmic.exe никогда не завершается, и я полагаю, что его стандартный вывод никогда не сбрасывается, поэтому вы ничего не получаете через QProcess::readAll().

Это вся помощь, которую я могу вам дать. Возможно, вы или какой-либо другой пользователь SO найдете ошибку в приведенном выше фрагменте.

person chalup    schedule 13.04.2010

Попробуйте это, это будет работать хорошо.

process.start("cmd", QStringList() << "/C" << "echo" << "process" << "get" << "caption" << "|" << "wmic");
person Sivambigai.M    schedule 08.11.2010