You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.5 KiB
JavaScript
69 lines
1.5 KiB
JavaScript
|
4 years ago
|
'use strict';
|
||
|
|
const {promisify} = require('util');
|
||
|
|
const childProcess = require('child_process');
|
||
|
|
const neatCsv = require('neat-csv');
|
||
|
|
const sec = require('sec');
|
||
|
|
|
||
|
|
const execFile = promisify(childProcess.execFile);
|
||
|
|
|
||
|
|
module.exports = async (options = {}) => {
|
||
|
|
if (process.platform !== 'win32') {
|
||
|
|
throw new Error('Windows only');
|
||
|
|
}
|
||
|
|
|
||
|
|
const args = ['/nh', '/fo', 'csv'];
|
||
|
|
|
||
|
|
if (options.verbose) {
|
||
|
|
args.push('/v');
|
||
|
|
}
|
||
|
|
|
||
|
|
if (options.system && options.username && options.password) {
|
||
|
|
args.push(
|
||
|
|
'/s', options.system,
|
||
|
|
'/u', options.username,
|
||
|
|
'/p', options.password
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (Array.isArray(options.filter)) {
|
||
|
|
for (const filter of options.filter) {
|
||
|
|
args.push('/fi', filter);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
const defaultHeaders = [
|
||
|
|
'imageName',
|
||
|
|
'pid',
|
||
|
|
'sessionName',
|
||
|
|
'sessionNumber',
|
||
|
|
'memUsage'
|
||
|
|
];
|
||
|
|
|
||
|
|
const verboseHeaders = defaultHeaders.concat([
|
||
|
|
'status',
|
||
|
|
'username',
|
||
|
|
'cpuTime',
|
||
|
|
'windowTitle'
|
||
|
|
]);
|
||
|
|
|
||
|
|
const headers = options.verbose ? verboseHeaders : defaultHeaders;
|
||
|
|
|
||
|
|
const {stdout} = await execFile('tasklist', args, {windowsHide: true});
|
||
|
|
|
||
|
|
// Not start with `"` means no matching tasks. See #11.
|
||
|
|
const data = stdout.startsWith('"') ? await neatCsv(stdout, {headers}) : [];
|
||
|
|
|
||
|
|
return data.map(task => {
|
||
|
|
// Normalize task props
|
||
|
|
task.pid = Number(task.pid);
|
||
|
|
task.sessionNumber = Number(task.sessionNumber);
|
||
|
|
task.memUsage = Number(task.memUsage.replace(/[^\d]/g, '')) * 1024;
|
||
|
|
|
||
|
|
if (options.verbose) {
|
||
|
|
task.cpuTime = sec(task.cpuTime);
|
||
|
|
}
|
||
|
|
|
||
|
|
return task;
|
||
|
|
});
|
||
|
|
};
|