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

'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;
});
};