2010-04-13 4 views
6

alcuni giorni fa ho chiesto come ottenere tutti i processi in esecuzione nel sistema utilizzando QProcess. ho trovato una riga di comando che può produrre tutti i processi in un file:ottenere tutte le informazioni sui processi in esecuzione utilizzando QProcess

C: \ WINDOWS \ system32 \ wbem \ Wmic.exe" /OUTPUT:C:\ProcessList.txt PROCESSO ottenere Didascalia

questa volontà creare il file C: \ ProcessList.txt contiene tutti i processi in esecuzione nel sistema Mi chiedo come posso eseguirlo usando QProcess e prendere il suo output su una variabile

sembra ogni volta che cerco di eseguirlo e non leggere nulla succede:

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(); 

preferisco non creare process.txt e prendere tutto l'output in una variabile ...

+0

Kaycee - Ho votato per chiudere pensando che questa non era una domanda, ma una lettura più attenta vedo che in effetti lo è. Colpa mia. –

+0

Si ha 'wmic' l'invio di output a' c: \ ProcessList.txt' e si reindirizza lo standard output di 'wmic' a' process.txt'. Quale output stai cercando di memorizzare in una variabile? –

+0

mi piacerebbe memorizzare tutti i file in uscita diciamo in una mappa ... L'output del file è il seguente: services.exe C: \ Windows \ system32 \ services services2.exe C: \ Windows \ system32 \ servizi services3.exe C: \ Windows \ system32 \ services . . . ma per qualche motivo solo la prima linea è salvato ... – kaycee

risposta

6

È possibile eseguire wmic.exe con l'opzione "/ OUTPUT: STDOUT" per stampare le informazioni sul processo direttamente su stdout. Tuttavia, non sono riuscito a leggere queste informazioni tramite l'API QProcess e a salvarle in variabili. Ecco il codice che ho usato:

#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; 
} 

Questo codice cattura con successo l'uscita di "C eco test/cmd.exe", ma non funziona su Wmic.exe. Sembra che il processo wmic.exe non sia mai terminato, e suppongo che stdout non sia mai scaricato, quindi non si riceve nulla attraverso QProcess :: readAll().

Questo è tutto l'aiuto che posso darti. Forse tu, o qualche altro utente SO, troverai bug nello snippet qui sopra.

2

Prova questo funzionerà bene.

process.start("cmd", QStringList() << "/C" << "echo" << "process" << "get" << "caption" << "|" << "wmic");