node.jsのchild_process.exec()やexecSyncを使って、OSのコマンドを実行する方法を紹介します。
child_process.exec(command[, options][, callback])
child_process.exec()はコマンドを非同期に実行します。
実行結果はcallbackで受け取ります。
const { exec } = require('child_process');
exec('ls', (error, stdout, stderr) => {
if (error) {
console.error(`[ERROR] ${error}`);
return;
}
console.log(`stdout: ${stdout}`);
console.log(`stderr: ${stderr}`);
});
Windowsで文字化けする場合
callbackの引数stdoutとstderrには、実行結果の文字列が渡されます。
引数optionsで文字コードを指定しない場合、文字コードはUTF-8になります。
Windowsでは文字コードはShift_JISのため、文字化けします。
Windowsでは、次のようにして文字コードを変換します。
const { exec } = require('child_process');
const Encoding = require('encoding-japanese');
exec('dir', { encoding: 'Shift_JIS' }, (error, stdout, strerr) => {
if (error) {
console.error(`[ERROR] ${error}`);
return;
}
const toString = (bytes) => {
return Encoding.convert(bytes, {
from: 'SJIS',
to: 'UNICODE',
type: 'string',
});
};
console.log(`stdout: ${toString(stdout)}`);
console.log(`strerr: ${toString(strerr)}`);
});
[child_process.execSync(command[, options])]
child_process.execSync()はコマンドを同期的に実行します。
実行結果が戻り値になります。
Windowsでは文字コードはShift_JISのため、次のようにして文字コードを変換します。
const { execSync } = require('child_process');
const Encoding = require('encoding-japanese');
const toString = (bytes) => {
return Encoding.convert(bytes, {
from: 'SJIS',
to: 'UNICODE',
type: 'string',
});
};
const stdout = execSync('dir');
console.log(toString(stdout));
Pingback: シェルコマンドを実行する方法 (child_process) [Node.js] – Site-Builder.wiki