バッチを作成しようとルすると、コマンド引数で動作変更したいことがあります。
今回は Node.js でコマンド引数の受け取り方および解析を行う方法についてまとめました。
コマンド引数解析は自作すると面倒なので commander
モジュールを利用した方法を載せています。
基本
Node.js においてコマンドライン引数は process.argv
で受け取れます。
コマンド引数の保存先
process.argv
- インデックス
0
はnode
へのパス - インデックス
1
は 実行 JavaScript のパス - インデックス
2
以降にコマンド引数が与えられます。
実際のソースコード、実行、結果の関係をサンプルコードとしてみると以下のようになります。
ソース(index.js)
for (let i = 0; i < process.argv.length; i++) { console.log(`argv[${i}] = ${process.argv[i]}`); }
実行
> node index.js aaa bbb ccc
結果
argv[0] = C:\Program Files\nodejs\node.exe argv[1] = C:\work\cmdargs\index.js argv[2] = aaa argv[3] = bbb argv[4] = ccc
応用
上記の基本で見た通り process.argv
は単純な配列なので、よく使うコマンド引数のような実装を行うには一工夫が必要です。
今回はそんなコマンド引数を簡単に実現してくれる commander
モジュールを利用して実現してみます。
commander
モジュールの詳細は別記事に書きますが、大まかな記述方法は以下のようになります。
var program = require("commander"); program .option("-f, --flag", "On/Off flag.") .option("-m, --message <s>", "Show message.", "Hello World.") .option("-i, --integer <n>", "Numeric value.", parseInt, 10) .option("-l, --list <items>", "Listed value.", (value) => { return (value || []).split(","); }, []) .option("-s, --size <size>", "Selected size.", /^(large|medium|small)$/i, "medium") .option("-o, --option [value]", "Option value.") .option("-v, --variadic [items...]", "Variadic value.") .parse(process.argv); if (process.argv.length < 3) { program.help(); } console.log(program.message);
オンオフ引数 (例: -f --flag)
program .option("-f, --flag", "On/Off flag.") .parse(process.argv);
文字列をとる引数 (例: -m --message <s>)
program .option("-m, --message <s>", "Show message.", "Hello World.") .parse(process.argv);
空白を含む文字列を指定したい場合は利用する際に文字列をダブルクォート ("
) で囲んで指定します。
> node index.js -m "Say Hello !" Say Hello !
数値をとる引数 (例: -i --integer <n>)
program .option("-i, --integer <n>", "Numeric value.", parseInt, 10) .parse(process.argv);
第3引数に parseInt
、第4引数にデフォルト値を指定します。
第3引数に parseFloat
を指定すれば、浮動小数として値を受け取れます。
リストをとる引数 (例: -l --list <items>)
program .option("-l, --list <items>", "Listed value.", (value) => { return (value || []).split(","); }, []) .parse(process.argv);
引数指定されるリストがカンマ区切りである前提として、受け取った値を カンマ ","
で split()
します。
実装からなんとなくわかると思いますが…カンマ区切りの値を指定するとき空白を含んでいると受け取り時に失敗するので、空白を含むリストを指定したい場合は ダブルクォート ("
) で囲んで指定します。
列挙型をとる引数 (例: -s --size <size>)
program .option("-s, --size", "Selected size.", /^(large|medium|small)$/i, "medium") .parse(process.argv);
第3引数に正規表現を指定すると列挙体指定が可能になります。
オプションな値をとる引数 (例: -o --option [value])
program .option("-o, --option [value]", "Option value.") .parse(process.argv);
引数の値を []
で表現すると、その値が指定されなくてもよいとするオプション扱いにできます。
可変長な値をとる引数 (例: -v --variadic [items...])
program .option("-v, --variadic [items...]", "Variadic value.", []) .parse(process.argv);
最後に指定するオプションの値において ...
を付与すると可変長な値とすることができます。
値が指定されなかった時のことを考えて、デフォルト値(ここでは第3引数)に []
を指定しておくと良いでしょう。
参考記事