node.jsのchild_process.exec()やexecSyncでOSのコマンドを実行する

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください