javascript - 実行 - コマンドライン引数 java




Node.jsプログラムにコマンドライン引数を渡すにはどうすればよいですか? (18)

Stdio図書館

NodeJSのコマンドライン引数を解析する最も簡単な方法は、 stdioモジュールを使用することです。 UNIXのgetoptユーティリティーに触発されて、それは次のように簡単です:

var stdio = require('stdio');
var ops = stdio.getopt({
    'check': {key: 'c', args: 2, description: 'What this option means'},
    'map': {key: 'm', description: 'Another description'},
    'kaka': {args: 1, mandatory: true},
    'ooo': {key: 'o'}
});

このコマンドで前のコードを実行すると、次のようになります。

node <your_script.js> -c 23 45 --map -k 23 file1 file2

次に、 opsオブジェクトは次のようになります。

{ check: [ '23', '45' ],
  args: [ 'file1', 'file2' ],
  map: true,
  kaka: '23' }

だからあなたはあなたが望むようにそれを使うことができます。 例えば:

if (ops.kaka && ops.check) {
    console.log(ops.kaka + ops.check[0]);
}

グループ化されたオプションもサポートされているので、 -o -m代わりに-omを書くことができます。

さらに、 stdioは自動的にhelp / usage出力を生成することができます。 ops.printHelp()を呼び出すと、次のような結果が得られます:

USAGE: node something.js [--check <ARG1> <ARG2>] [--kaka] [--ooo] [--map]
  -c, --check <ARG1> <ARG2>   What this option means (mandatory)
  -k, --kaka                  (mandatory)
  --map                       Another description
  -o, --ooo

前のメッセージは、必須オプションが指定されていない場合(エラーメッセージの前にある場合)、または誤って指定されている場合にも表示されます(オプションに1つのargを指定し、2が必要な場合など)。

NPMを使用してstdioモジュールをインストールできstdio

npm install stdio

私はNode.jsで書かれたWebサーバを持っており、特定のフォルダで起動したいと思います。 JavaScriptで引数にアクセスする方法がわかりません。 私はこのようにノードを実行しています:

$ node server.js folder

ここでserver.jsは私のサーバーコードです。 Node.jsヘルプはこれが可能であることを示します:

$ node -h
Usage: node [options] script.js [arguments]

JavaScriptでこれらの引数にどのようにアクセスすればよいですか? どういうわけか私はこの情報をウェブ上で見つけることができませんでした。


librairiesなしで:Array.prototype.reduce()を使う

const args = process.argv.slice(2).reduce((acc, arg) => {

    let [k, v = true] = arg.split('=')
    acc[k] = v
    return acc

}, {})

このコマンドnode index.js count=2 print debug=false msg=hi

console.log(args) // { count: '2', print: true, debug: 'false', msg: 'hi' }

また、

我々は変更することができます

    let [k, v = true] = arg.split('=')
    acc[k] = v

〜によって(ずっと長い)

    let [k, v] = arg.split('=')
    acc[k] = v === undefined ? true : /true|false/.test(v) ? v === 'true' : /[\d|\.]+/.test(v) ? Number(v) : v

ブール値と数値を自動解析する

console.log(args) // { count: 2, print: true, debug: false, msg: 'hi' }

オプティミスト(ノードオプティミスト)

オプティミストライブラリをチェックしてください。コマンドラインオプションを手作業で解析するよりはるかに優れています。

更新

オプティミストは推奨されていません。 楽観主義者のアクティブフォークであるyargsを試してみてください。


ライブラリなし

あなたがvanilla JS / ES6でこれをしたいなら、あなたは以下の解決策を使うことができます

NodeJS> 6でのみ動作します

const args = process.argv
  .slice(2)
  .map((val, i)=>{
    let object = {};
    let [regexForProp, regexForVal] = (() => [new RegExp('^(.+?)='), new RegExp('\=(.*)')] )();
    let [prop, value] = (() => [regexForProp.exec(val), regexForVal.exec(val)] )();
    if(!prop){
      object[val] = true;
      return object;
    } else {
      object[prop[1]] = value[1] ;
      return object
    }
  })
  .reduce((obj, item) => {
    let prop = Object.keys(item)[0];
    obj[prop] = item[prop];
    return obj;
  }, {});

そしてこのコマンド

node index.js host=http://google.com port=8080 production

次の結果が得られます

console.log(args);//{ host:'http://google.com',port:'8080',production:true }
console.log(args.host);//http://google.com
console.log(args.port);//8080
console.log(args.production);//true

psあなたがもっとエレガントな解決策を見つけたら、マップのコードを修正して機能を減らしてください、ありがとう;)


野生の現在の傾向に基づく2018年の答え:

バニラのjavascript引数の解析:

const args = process.argv;
console.log(args);

これにより、

$ node server.js one two=three four
['node', '/home/server.js', 'one', 'two=three', 'four']

公式ドキュメント

引数の解析によく使用されるNPMパッケージ:

Minimist :引数の解析を最小限に抑える。

Commander.js :引数の構文解析にモジュールを採用しました。

Meow :Commander.jsの軽い代替

Yargs :洗練された引数解析(重い)。

Vorpal.js :引数の解析を伴う成熟した/対話型のコマンドラインアプリケーション。


Node.jsの引数を取り出す最も簡単な方法は、process.argv配列を使用する方法です。 これは、それを使用するために追加のライブラリをインポートせずに使用できるグローバルオブジェクトです。 前に示したように、Node.jsアプリケーションに引数を渡すだけで済みます。これらの引数は、process.argv配列を介してアプリケーション内でアクセスできます。

process.argv配列の最初の要素は、常にノード実行可能ファイルを指すファイルシステムパスになります。 2番目の要素は、実行されているJavaScriptファイルの名前です。 3番目の要素は、実際にユーザーが渡した最初の引数です。

'use strict';

for (let j = 0; j < process.argv.length; j++) {  
    console.log(j + ' -> ' + (process.argv[j]));
}

このスクリプトは、process.argv配列をループし、インデックスに格納されている要素とともにインデックスを出力します。 受け取っている引数とその順序を疑問に思った場合は、デバッグに非常に便利です。

また、yargsのようなライブラリをcommnadlineの引数を扱うために使うこともできます。


command-line-argsは一見価値がある!

主な表記標準を使用してオプションを設定できます( 詳細はこちら )。 これらのコマンドはすべて同じ値で、同じ値を設定します。

$ example --verbose --timeout=1000 --src one.js --src two.js
$ example --verbose --timeout 1000 --src one.js two.js
$ example -vt 1000 --src one.js two.js
$ example -vt 1000 one.js two.js

値にアクセスするには、まず、アプリケーションが受け入れるオプションを説明するオプション定義のリストを作成します。 typeプロパティはsetter関数です(指定された値が渡されます)。受信した値を完全に制御できます。

const optionDefinitions = [
  { name: 'verbose', alias: 'v', type: Boolean },
  { name: 'src', type: String, multiple: true, defaultOption: true },
  { name: 'timeout', alias: 't', type: Number }
]

次に、 commandLineArgs()を使用してオプションを解析します。

const commandLineArgs = require('command-line-args')
const options = commandLineArgs(optionDefinitions)

optionsは次のようになります:

{
  src: [
    'one.js',
    'two.js'
  ],
  verbose: true,
  timeout: 1000
}

高度な使い方

上記の典型的な使用法の他に、より高度な構文形式を受け入れるようにcommand-line-argsを構成することができます。

コマンドベースの構文 (git形式):

$ executable <command> [options]

例えば。

$ git commit --squash -m "This is my commit message"

次の形式のコマンドとサブコマンド構文 (ドッカースタイル):

$ executable <command> [options] <sub-command> [options]

例えば。

$ docker run --detached --image centos bash -c yum install -y httpd

利用ガイド作成

使用法のガイド(通常は--helpが設定されているときに表示され--help )は、 command-line-usageを使って生成することができcommand-line-usage 。 下記の例を参照して、それらの作成方法の説明command-line-usagecommand-line-usageください。

典型的な使用方法の例

polymer-cli使用ガイドはpolymer-cli的な例です。

参考文献

もっとたくさんのことを学ぶことができます 。例とドキュメントについてはwikiをご覧ください。


Minimistライブラリを使用するための最新の正解です。 私たちはnode-optimistを使用していましたが、これ以降、非推奨となっています。

ミニマリストのドキュメントから直接使用する方法の例を次に示します。

var argv = require('minimist')(process.argv.slice(2));
console.dir(argv);

-

$ node example/parse.js -a beep -b boop
{ _: [], a: 'beep', b: 'boop' }

-

$ node example/parse.js -x 3 -y 4 -n5 -abc --beep=boop foo bar baz
{ _: [ 'foo', 'bar', 'baz' ],
  x: 3,
  y: 4,
  n: 5,
  a: true,
  b: true,
  c: true,
  beep: 'boop' }

system.argsを使用してコマンドライン引数にアクセスできます。 そして、私はオブジェクトの引数を解析するために、以下のソリューションを使用するので、私は名前で欲しいものを得ることができます。

var system = require('system');

var args = {};
system.args.map(function(x){return x.split("=")})
    .map(function(y){args[y[0]]=y[1]});

今では引数のインデックスを知る必要はありません。 args.whateverようにargs.whatever

注:このソリューションを使用するには、 file.js x=1 y=2ような名前付き引数を使用する必要があります。



あなたのスクリプトがmyScript.jsと呼ばれていて、名前のような名前の 'Sean Worthington'を引数として渡す場合は、次のようにします。

node myScript.js Sean Worthington

あなたのスクリプトの中であなたは次のように書く:

var firstName = process.argv[2]; // Will be set to 'Sean'
var lastName = process.argv[3]; // Will be set to 'Worthington'

いくつかの大きな答えがここにありますが、それはすべて非常に複雑です。 これはbashスクリプトが引数値にアクセスする方法と非常によく似ており、MooGooが指摘しているようにnode.jsで既に標準で提供されています。 (node.jsの初心者に分かりやすくするため)

例:

$ node yourscript.js banana monkey

var program_name = process.argv[0]; //value will be "node"
var script_path = process.argv[1]; //value will be "yourscript.js"
var first_value = process.argv[2]; //value will be "banana"
var second_value = process.argv[3]; //value will be "monkey"

そのためのアプリがあります。 まあ、モジュール。 まあ、1つより多い、おそらく何百というもの。

Yargsは楽しいものの1つであり、その文書は読みYargsです。

次に、github / npmページの例を示します。

#!/usr/bin/env node
var argv = require('yargs').argv;
console.log('(%d,%d)', argv.x, argv.y);
console.log(argv._);

出力はここにあります(ダッシュなどのオプション、長短、数値などのオプションを読み取ります)。

$ ./nonopt.js -x 6.82 -y 3.35 rum
(6.82,3.35)
[ 'rum' ] 
$ ./nonopt.js "me hearties" -x 0.54 yo -y 1.12 ho
(0.54,1.12)
[ 'me hearties', 'yo', 'ho' ]

ほとんどの人が良い答えを出してくれました。 ここに何か貢献したいと思います。 私はアプリケーションを起動している間に渡すすべてのコマンドライン引数を反復するためにlodashライブラリを使用して答えを提供しています:

// Lodash library
const _ = require('lodash');

// Function that goes through each CommandLine Arguments and prints it to the console.
const runApp = () => {
    _.map(process.argv, (arg) => {
        console.log(arg);
    });
};

// Calling the function.
runApp();

上記のコードを実行するには、次のコマンドを実行してください:

npm install
node index.js xyz abc 123 456

結果は次のようになります。

xyz 
abc 
123
456

名前付き引数のための私の0-depソリューションは次のとおりです:

const args = process.argv
    .slice(2)
    .map(arg => arg.split('='))
    .reduce((args, [value, key]) => {
        args[value] = key;
        return args;
    }, {});

console.log(args.foo)
console.log(args.fizz)

例:

$ node test.js foo=bar fizz=buzz
bar
buzz

注意:引数にa =が含まれていると当然これは失敗します。 これは非常に簡単な使用のためです。


必要な場合は簡単なスニペット:

var fs = require('fs'), objMod = {};

process.argv.slice(2).map(function(y, i) {
  y = y.split('=');
  if (y[0] && y[1]) objMod[y[0]] = y[1];
  else console.log('Error in argument number ' + (i+1));
});

通常のjavascript関数のように引数を正規化するには、node.jsシェルスクリプトでこれを行います:

var args = process.argv.slice(2);

最初のargは通常nodejsへのパスであり、2番目のargは実行しているスクリプトの場所です。


npm install ps-grab

このようなものを実行したい場合は:

node greeting.js --user Abdennour --website http://abdennoor.com 

-

var grab=require('ps-grab');
grab('--username') // return 'Abdennour'
grab('--action') // return 'http://abdennoor.com'

または次のようなもの:

node vbox.js -OS redhat -VM template-12332 ;

-

var grab=require('ps-grab');
grab('-OS') // return 'redhat'
grab('-VM') // return 'template-12332'




command-line-arguments