আমি কোনও নোড.জেএস প্রোগ্রামে কমান্ড লাইন আর্গুমেন্ট কীভাবে পাস করব?


2411

আমার নোড.জেজে লিখিত একটি ওয়েব সার্ভার রয়েছে এবং আমি একটি নির্দিষ্ট ফোল্ডার দিয়ে লঞ্চ করতে চাই। আমি জাভাস্ক্রিপ্টে যুক্তিগুলি কীভাবে অ্যাক্সেস করব তা নিশ্চিত নই। আমি এভাবে নোড চালাচ্ছি:

$ node server.js folder

এখানে server.jsআমার সার্ভারে কোড। নোড.জেএস সাহায্য বলছে এটি সম্ভব:

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

আমি কীভাবে জাভাস্ক্রিপ্টে এই যুক্তিগুলি অ্যাক্সেস করব? কোনওভাবে আমি ওয়েবে এই তথ্যটি খুঁজে পাচ্ছিলাম না।

উত্তর:


3044

মানক পদ্ধতি (কোনও গ্রন্থাগার নেই)

যুক্তিগুলি সংরক্ষণ করা হয় process.argv

কমান্ড লাইন আরোগুলি পরিচালনা করার নোড ডক্স এখানে রয়েছে :

process.argvকমান্ড লাইন যুক্তিযুক্ত একটি অ্যারে। প্রথম উপাদানটি হবে 'নোড', দ্বিতীয় উপাদানটির নাম হবে জাভাস্ক্রিপ্ট ফাইল। পরবর্তী উপাদানগুলি কোনও অতিরিক্ত কমান্ড লাইন আর্গুমেন্ট হবে।

// print process.argv
process.argv.forEach(function (val, index, array) {
  console.log(index + ': ' + val);
});

এটি উত্পন্ন করবে:

$ node process-2.js one two=three four
0: node
1: /Users/mjr/work/node/process-2.js
2: one
3: two=three
4: four

7
কমান্ড-লাইন আর্গুমেন্ট সহ নোড.জেএস স্ক্রিপ্টটি চালানোর জন্য কমান্ড প্রম্পটে আমার কী টাইপ করা উচিত?
অ্যান্ডারসন সবুজ

8
আপডেট: আমি উপরের প্রশ্নের উত্তর খুঁজে পেয়েছি। stackoverflow.com/questions/12925802/…
অ্যান্ডারসন সবুজ

2
Minimist একটি দুর্দান্ত এবং সহজ যুক্তি পার্সার হয়
Guilherme Nagatomo

4
আপনি যখন কোনও একক যুক্তির অবস্থানটি জানতে পারবেন তখন এটির অ্যাক্সেসও করতে পারবেন: শূন্য-ভিত্তিক সূচকটি process.argv[n]কোথায়n
লুকা স্টেব

6
২ য় উপাদান (প্রক্রিয়া.আরজিভি [১]) জেএস ফাইল হতে পারে বা নাও হতে পারে। নোড কমান্ড সিনট্যাক্স হয় node [options] [ -e script | script.js ] [arguments]বা node debug script.js [arguments]। উদাহরণস্বরূপ: node --harmony script.js balalaবা node --no-deprecation --enable-ssl2 script.js balala, আমরা ব্যবহার করতে পারেন process.execArgv সঙ্গে process.argv
cuixiping

677

নিয়মিত জাভাস্ক্রিপ্ট ফাংশনটির মতো আর্গুমেন্টগুলি স্বাভাবিক করার জন্য, আমি আমার নোড.জেএস শেল স্ক্রিপ্টগুলিতে এটি করি:

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

মনে রাখবেন যে প্রথম আরগটি সাধারণত নোডেজের পথ এবং দ্বিতীয় আর্গটি আপনি যে স্ক্রিপ্টটি চালাচ্ছেন তার অবস্থান।


19
4 বছর আগে আমি এই উত্তরটি লিখেছি এবং আমি যে কোডটি চালাচ্ছি তা আজও 100% জরিমানা চলছে। নোডের সর্বশেষতম সংস্করণ এবং এখনও শূন্য সমস্যার সাথে তাল মিলিয়ে এখনও চলছে: এটি কেবল একটি সাধারণ শেল স্ক্রিপ্ট। জেএস লাইব্রেরিতে পূর্ণ কোনও বৃহত বৈশ্বিক বস্তুর অংশ নয়। আমি আজও আমার উত্তর পিছনে দাঁড়িয়ে। আমি আরও 4 বছরের মধ্যে আরও একটি আপডেট দেব।
মাউভিস লেডফোর্ড

55
var args = process.argv.splice(process.execArgv.length + 2);// কারণ নোড কমান্ড ব্যবহারের ব্যতিক্রম, উদাহরণস্বরূপ আছেন: node --harmony script.js balala। দেখতে process.execArgv
cuixiping

36
@cuixiping কিন্তু execArgvহয় নাargvতাই 2 যথেষ্ট
টোম্মি Kyntola

7
এই উত্তরের সম্পাদনার ইতিহাসটি দেখার পরে, আমি @ মৌভিসলেডফোর্ডের প্রতি সহানুভূতির জন্য কিছুটা সময় নিতে চাই। ব্যক্তিগত পছন্দের নামে আপনার কোডে অযাচিত সম্পাদনা করার মতো যথেষ্ট বিরক্তিকর কিছু নেই (বুট করার জন্য কোনও পরিমাণের সুবিধা ছাড়াই)। যার কাছে এটি করে: টস অফ।
জোনাথন ডুমাইন

12
করবেন নাprocess.argv.splice(process.execArgv.length + 2) : একটি কমান্ডের জন্য node --harmony script.js --version, process.argvহয় ['/usr/local/bin/node', 'script.js', '--version']উপর পতাকা nodeকরছে না অন্তর্ভুক্ত process.argv!
45

359

আপ-টু-ডেট অধিকার এই এটা জন্য উত্তর ব্যবহার করতে minimist গ্রন্থাগার। আমরা নোড-আশাবাদী ব্যবহার করতাম তবে এটি অবহেলিত been

এটি সরাসরি মিনিমিস্ট ডকুমেন্টেশন থেকে নেওয়া কীভাবে ব্যবহার করা যায় তার একটি উদাহরণ:

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

32
প্রকৃতপক্ষে, এই সমাধানটি আরও বেশি পতাকা এবং তর্কযুক্ত কমান্ড লাইন সরঞ্জাম বিকাশের জন্য আরও সহায়ক এবং আরও আইএমএইচও উন্নীত করা উচিত।
জে কে এবিসি


5
@ জে কেএবিসি আমি এটিকে সবচেয়ে সঠিক উত্তর বলব না, কারণ ওপি কেবল তুচ্ছ কমান্ড লাইন তথ্য অ্যাক্সেস করতে বলেছে। তবে আমি একমত যে আপনি যদি নিজের সি এল এল বাড়াতে চান তবে ন্যূনতম এবং কমান্ড-লাইন-আরগ উভয়ই খুব কার্যকর।
জাস্টাস রোমিজন

2
আমি ভাবছি কেন '-n5' 'n5: সত্য' তৈরি করে না - এটি আমার কাছে বোধগম্য হবে।
ম্যাক্স ওয়াটারম্যান

7
@ ম্যাক্স ওয়াটারম্যান: কারণ একক ড্যাশ দিয়ে শুরু হওয়া বিকল্পগুলি কেবল একটি একক চরিত্রের জন্য অনুমিত হয়। একটি একক চর বিকল্প অনুসরণ করে যে কোনও কিছুই বিকল্পের জন্য আর্গুমেন্ট হিসাবে নেওয়া হয় (কোনও স্থানের প্রয়োজন নেই)। দুটি ড্যাশ (অর্থাত --n5) দিয়ে বিকল্পটি শুরু করাতে 'এন 5: সত্য' তৈরি করা উচিত। এটি বেশিরভাগ ইউনিক্স কমান্ড লাইন সরঞ্জামের জন্য মোটামুটি মানসম্পন্ন আচরণ (তবে দুর্ভাগ্যক্রমে সমস্ত নয়)।
মেন্নো 15:38

312

বুনো বর্তমান প্রবণতার উপর ভিত্তি করে 2018 উত্তর:


ভ্যানিলা জাভাস্ক্রিপ্ট যুক্তি পার্সিং:

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

এটি ফিরে আসে:

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

অফিসিয়াল ডকস


আর্গুমেন্ট পার্সিংয়ের জন্য সর্বাধিক ব্যবহৃত এনপিএম প্যাকেজ:

ন্যূনতম : ন্যূনতম যুক্তি পার্সিংয়ের জন্য।

কমান্ডার.জেএস : আর্গুমেন্ট পার্সিংয়ের জন্য সর্বাধিক গৃহীত মডিউল।

মায়া : কমান্ডার.জেসের হালকা বিকল্প

ইয়ার্জস : আরও পরিশীলিত যুক্তি পার্সিং (ভারী)।

Vorpal.js : যুক্তি পার্সিংয়ের সাথে পরিপক্ক / ইন্টারেক্টিভ কমান্ড-লাইন অ্যাপ্লিকেশন।


76
"$ npm ইনস্টল-জি ইয়ার্গস" থেকে জাভাস্ক্রিপ্ট কোডটি 1.9 এমবি পেয়েছে। যখন আরগভি পার্সার লাইব্রেরিতে দুটি মেগাবাইট কোডের প্রয়োজন হয় তখন এই উন্মাদনাটি কখন শেষ হবে? আক্রমণ পৃষ্ঠের বৃদ্ধি, নষ্ট র‌্যাম ইত্যাদি ...
জুনাস.ফি

9
ইয়ার্জস একটি বৃহত্তর সরঞ্জাম যা কমান্ড লাইনের যুক্তিগুলি পার্স করার ক্ষেত্রে ঘটে। কোন উন্মাদনা নেই, কেবল তথ্যের অভাব নেই। আপনি যদি হালকা কিছু চান তবে কাঁচা জেএস, মেও বা মিনিমিস্ট ব্যবহার করুন।
dthree

1
"$ npm আমি yargs" -> 800 কেবি এখানে, আমার ধারণা প্যাকেজ মালিকরা অবশেষে অপ্রাসঙ্গিক ফাইলগুলি উপেক্ষা করতে শিখলেন। যাইহোক, নির্বোধ প্রকল্পগুলির জন্য এখনও বড়, তবে আপনার যখন দৃ rob়তার প্রয়োজন হয় এবং বৃহত্তর প্রকল্পগুলিতে আপনার ইতিমধ্যে নির্ভরতা থাকে ..
আন্দ্রে ফিগুয়েরেদো

3
আমি তালিকাবদ্ধ বড় নামগুলির চেয়ে আরও শক্তিশালী, আরও কাস্টমাইজযোগ্য এবং সহজতর সরঞ্জাম ব্যবহারের লক্ষ্য নিয়ে উইল-ক্লি নামে একটি প্যাকেজ তৈরি করেছি । আপনার মধ্যে যারা আগ্রহী তাদের জন্য এটি কেবলমাত্র 94.6 কেবি ইনস্টল করার পরে
জেসন

1
vscode আমদানি-ব্যয় আমাকে জানায় ইয়ার্গ্স (159.2 কে) এখন আসলে মায়ো (180.2 কে) এর চেয়ে হালকা। মিনিমিনিস্ট এখনও তাদের 3.4K এ মারধর করে!
শিবম ত্রিপাঠি

124

আশাবাদী (নোড-আশাবাদী)

পরীক্ষা করে দেখুন আশাবাদী গ্রন্থাগার , এটা অনেক হাত ধরে কমাণ্ড লাইন অপশন সম্বন্ধে পার্স বেশী ভালো।

হালনাগাদ

আশাবাদী হ্রাস করা হয়। ইয়ার্গস চেষ্টা করুন যা আশাবাদীদের একটি সক্রিয় কাঁটাচামচ।


18
লিঙ্কের জন্য +1। Github.com/joyent/node/wiki/modules#wiki-parsers-commandline
Thilo

7
মিনিমিস্ট হ'ল এখন অবহেলিত আশাবাদীর আরেক উত্তরসূরি। এটি "সমস্ত কল্পিত সাজসজ্জা ছাড়াই আশাবাদীর যুক্তি পার্সারের সাহস"। গত মাসে 23 মিলিয়ন ডাউনলোড হয়েছে (12/2015 হিসাবে)।
আপন

96

বেশ কয়েকটি দুর্দান্ত উত্তর এখানে, তবে এটি সমস্ত জটিল বলে মনে হচ্ছে। এটি কীভাবে বাশ স্ক্রিপ্টগুলি আর্গুমেন্টের মানগুলিতে অ্যাক্সেস করে তার সাথে অনেকটা মিলে যায় এবং এটি ইতিমধ্যে নোড.জেএস সহ স্ট্যান্ডার্ড সরবরাহ করেছে যেমন মোগু উল্লেখ করেছে। (কেবল নোড.জেএস-এ নতুন কারও কাছে এটি বোধগম্য করার জন্য)

উদাহরণ:

$ 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"

80

Commander.js

আপনার বিকল্পগুলি, ক্রিয়াগুলি এবং যুক্তিগুলি সংজ্ঞায়িত করার জন্য দুর্দান্ত কাজ করে। এটি আপনার জন্য সহায়তা পৃষ্ঠাগুলিও জেনারেট করে।

শীঘ্র

আপনি যদি কলব্যাক পদ্ধতির পছন্দ করেন তবে ব্যবহারকারীর কাছ থেকে ইনপুট পাওয়ার জন্য দুর্দান্ত কাজ করে।

কো-প্রম্পট

আপনি যদি জেনারেটরের পদ্ধতির পছন্দ করেন তবে ব্যবহারকারীর কাছ থেকে ইনপুট পাওয়ার জন্য দুর্দান্ত কাজ করে।


26
@Evan ক্যারল অনুগ্রহ করে একটি গ্রন্থাগার আমি ব্যবহার করি না উন্নীত আমার উত্তর সম্পাদনা করবেন না stackoverflow.com/posts/7483600/revisions বিশেষত একটি অনুপস্থিত বৈশিষ্ট্য আপনি পরে থাকেন, কারণ, এই ধরনের মতামত মন্তব্য বা করতে টান অনুরোধের জন্য সংরক্ষণ করা হবে মডিউল লেখক, অন্য লোকের উত্তরে সম্পাদনা করে না।
বালুপটন

কমান্ডার.জেস আমাকে সত্যই সাহায্য করেছিল। অন্যান্য গ্রন্থাগারগুলি Nexe সংকলকটির সাথে কাজ করবে না তবে এটি কৌশলটি কার্যকর করে। আপনি যদি নেক্সি ব্যবহার করার সময় আরোগুলি পেতে চান তবে নেক্সি সংকলকটি পাস করতে ভুলবেন না।
পিয়ার্স.জাসন

60

কোনও সরল অবজেক্টে ফ্ল্যাগ ফর্ম্যাট করা কোনও লিব নেই

function getArgs () {
    const args = {};
    process.argv
        .slice(2, process.argv.length)
        .forEach( arg => {
        // long arg
        if (arg.slice(0,2) === '--') {
            const longArg = arg.split('=');
            const longArgFlag = longArg[0].slice(2,longArg[0].length);
            const longArgValue = longArg.length > 1 ? longArg[1] : true;
            args[longArgFlag] = longArgValue;
        }
        // flags
        else if (arg[0] === '-') {
            const flags = arg.slice(1,arg.length).split('');
            flags.forEach(flag => {
            args[flag] = true;
            });
        }
    });
    return args;
}
const args = getArgs();
console.log(args);

উদাহরণ

সহজ

ইনপুট

node test.js -D --name=Hello

আউটপুট

{ D: true, name: 'Hello' }

বাস্তব জগতে

ইনপুট

node config/build.js -lHRs --ip=$HOST --port=$PORT --env=dev

আউটপুট

{ 
  l: true,
  H: true,
  R: true,
  s: true,
  ip: '127.0.0.1',
  port: '8080',
  env: 'dev'
}

1
যেহেতু কিছু পতাকাগুলির একটি দীর্ঘ রূপ রয়েছে, আপনি এটির জন্য অ্যাকাউন্ট করতে পারেন। পরিবর্তে = longArg[1]আপনি লিখতে পারেন = longArg.length > 1 ? longArg[1] : true;এটি আপনাকে এই ধরণের node config/build.js --flag1 --flag2
তর্কটি

আমি এটা পছন্দ করি. এটি লাইনটি কিছুটা দীর্ঘ করেছে তাই আমি এটি ভেঙে ফেলেছি। আমাকে এই সম্পর্কে বলার জন্য আপনাকে ধন্যবাদ।
মাইকেল ওয়ার্নার

54

স্টিডিও লাইব্রেরি

নোডজেএস-এ কমান্ড-লাইন আর্গুমেন্টগুলি পার্স করার সবচেয়ে সহজ উপায়টি হল stdio মডিউলটি। ইউনিক্স 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, required: 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]);
}

গোষ্ঠীযুক্ত বিকল্পগুলিও সমর্থিত, যাতে আপনি -omপরিবর্তে লিখতে পারেন -o -m

তদতিরিক্ত, stdioস্বয়ংক্রিয়ভাবে সহায়তা / ব্যবহারের আউটপুট তৈরি করতে পারে। আপনি কল করলে 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

পূর্ববর্তী বার্তাটিও দেখানো হয়েছে যদি কোনও বাধ্যতামূলক বিকল্প না দেওয়া হয় (ত্রুটি বার্তার আগে) বা এটি ভুলভাবে চিহ্নিত করা হয় (উদাহরণস্বরূপ, যদি আপনি কোনও বিকল্পের জন্য একটি একক আর্গ নির্দিষ্ট করে থাকেন এবং এটির জন্য প্রয়োজন 2)।

আপনি এনপিএম ব্যবহার করে স্টডিও মডিউল ইনস্টল করতে পারেন :

npm install stdio

3
এসওএস এর শুল্ক অনুযায়ী, @ এসজিমনডাটি মডিউলটির একমাত্র রক্ষণাবেক্ষণকারী;) খুব ভাল মডিউলটি উল্লেখ করার মতো নয়। অবশ্যই কার্যকর।
কিউস - মনিকা ২

1
প্রকৃতপক্ষে কার্যকর, যদিও সবচেয়ে সাম্প্রতিক আপডেটটি ছিল 30 ডিসেম্বর, 2014। Some
fearless_fool

ভাল কাজ! tks! এটি সাম্প্রতিক আপডেটগুলি ছাড়াও যথেষ্ট পরিমাণে .. এটির যথেষ্ট কার্যকারিতা রয়েছে
পাবলো ইজেকুইল

এটি একটি সময় হয়েছে তবে আমি পুরো প্রতিশ্রুতি এবং টাইপস্ক্রিপ্ট সমর্থন সহ সবেমাত্র সংস্করণ 2 প্রকাশ করেছি। :-)
সগমনদা

47

যদি আপনার স্ক্রিপ্টটিকে myScript.js বলা হয় এবং আপনি নীচের মত যুক্তি হিসাবে প্রথম এবং শেষ নাম 'শন ওয়ারথিংটন' পাস করতে চান:

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'

28

কম্যান্ড-লাইন 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সম্পত্তি একটি সেটার ফাংশন (মান সরবরাহকৃত এই মাধ্যমে পাস করা হয়েছে), আপনি পেয়েছেন মান উপর পূর্ণ নিয়ন্ত্রণ দান করা হয়।

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

এরপরে, কমান্ডলাইনআর্গ () ব্যবহার করে বিকল্পগুলি পার্স করুন :

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

options এখন এই মত দেখাচ্ছে:

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

উন্নত ব্যবহার

উপরের সাধারণ ব্যবহারের পাশাপাশি আপনি আরও উন্নত বাক্য বিন্যাস গ্রহণ করতে কমান্ড-লাইন-আরগগুলি কনফিগার করতে পারেন।

ফর্মটিতে কমান্ড-ভিত্তিক সিনট্যাক্স (গিট স্টাইল):

$ 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 করে একটি ব্যবহার নির্দেশিকা (সাধারণত সেট করা থাকে তখন মুদ্রিত ) তৈরি করা যায় । নীচের উদাহরণগুলি দেখুন এবং ডকুমেন্টেশন পড়ুন সেগুলি কীভাবে তৈরি করা যায় তার জন্য ।

একটি সাধারণ ব্যবহারের গাইড উদাহরণ।

ব্যবহার

পলিমার-CLI ব্যবহার গাইড একটি ভাল বাস্তব জীবনের উদাহরণ।

ব্যবহার

আরও পড়া

শেখার মতো আরও অনেক কিছুই রয়েছে, দয়া করে উদাহরণ এবং ডকুমেন্টেশনের জন্য উইকিটি দেখুন ।


@ লয়েড এটি ইতিমধ্যে উত্থাপিত সমস্যার সাথে সংযুক্ত - এখানে । ওয়েবস্টর্ম কিছু অতিরিক্ত যুক্তি পাস করে passes
kboom

@ কেবুম যে সমস্যাটি partialএবং stopAtFirstUnknownবিকল্পগুলি সমাধান করেছিল । দস্তাবেজগুলি দেখুন ।
লয়েড

23

তার জন্য একটি অ্যাপ্লিকেশন রয়েছে। ভাল, মডিউল। ভাল, একাধিক, সম্ভবত শত।

ইয়ার্জগুলি মজাদার মধ্যে অন্যতম, এর ডকগুলি পড়তে দুর্দান্ত।

এখানে গিথুব / এনপিএম পৃষ্ঠা থেকে একটি উদাহরণ দেওয়া হয়েছে:

#!/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' ]

21

নামযুক্ত আর্গুমেন্টগুলির জন্য এখানে আমার 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 থাকে =। এটি কেবল খুব সাধারণ ব্যবহারের জন্য।


12

এনকনফ https://github.com/flatiron/nconf এর মতো কিছু ব্যবহার করে কেন্দ্রীয়ভাবে আপনার কনফিগারেশনটি পরিচালনা করা ভাল ধারণা

এটি আপনাকে কনফিগারেশন ফাইল, পরিবেশের ভেরিয়েবল, কমান্ড-লাইন আর্গুমেন্টগুলির সাথে কাজ করতে সহায়তা করে।


এবং কনফিগারেশনটি এখানে এনকনফের জন্য আমার নিজস্ব, ন্যূনতম, পঠনযোগ্য ইন্টারফেস।
জোয়েল পুররা

12

উইথআউট লাইব্রেরি: অ্যারে.প্রোটোটাইপ.ড্রেস () ব্যবহার করে

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

আপনার দীর্ঘ সংস্করণে ডটগুলি যুক্ত স্ট্রিংগুলির সাথে সমস্যা রয়েছে।
বার্লিনার

চতুর সমাধান! আমি যদি উভয় সমর্থন করতে চাই countএবং cকমান্ড লাইন বিকল্পগুলি ( cযার জন্য একটি নাম / শর্টকাট হিসাবে count)?
অ্যালেক্স ভ্যাং

এটা সুন্দর! তবে এটি "একটি বর্ণচিহ্নের জন্য একটি ড্যাশ এবং শব্দ কী এর জন্য দুটি ড্যাশ" মান ব্যবহার করে না। দুর্ভাগ্যক্রমে, আমার বিকল্পটি এখানে পোস্ট করার জন্য অনেক দীর্ঘ এবং কুরুচিপূর্ণ, তাই আমি আলাদা উত্তর হিসাবে যুক্ত করব।
isacvale

10

তর্কগুলি পার্সিং, পার্সিং করা একটি সহজ প্রক্রিয়া। নোড আপনাকে প্রসেস.আরজিভি বৈশিষ্ট্য সরবরাহ করে, যা স্ট্রিংগুলির একটি অ্যারে, নোডের অনুরোধ করার সময় ব্যবহৃত হত এমন আর্গুমেন্ট। অ্যারের প্রথম এন্ট্রি হ'ল নোড এক্সিকিউটেবল এবং দ্বিতীয় এন্ট্রিটি আপনার স্ক্রিপ্টের নাম।

আপনি যদি নিচের atgument সহ স্ক্রিপ্ট চালান

$ node args.js arg1 arg2

ফাইল: args.js

console.log(process.argv)

আপনি অ্যারে পেতে হবে

 ['node','args.js','arg1','arg2']

9
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'

1
এই রেপো আর গিথুবে উপলভ্য নয়।
স্ট্যান্ডওয়েব

8

proj.js

for(var i=0;i<process.argv.length;i++){
  console.log(process.argv[i]);
}

টার্মিনাল:

nodemon app.js "arg1" "arg2" "arg3"

ফলাফল:

0 'C:\\Program Files\\nodejs\\node.exe'
1 'C:\\Users\\Nouman\\Desktop\\Node\\camer nodejs\\proj.js'
2 'arg1' your first argument you passed.
3 'arg2' your second argument you passed.
4 'arg3' your third argument you passed.

Explaination:

0 : আপনার মেশিনে নোড.এক্সির ডিরেক্টরি (সি: \ প্রোগ্রাম ফাইলগুলি ode নোডেজস \ নোড.এক্সে ')

1: আপনার প্রকল্প ফাইলের ডিরেক্টরি। (Proj.js)

2 : নোডের জন্য আপনার প্রথম যুক্তি (আরজি 1)

3 : নোডের জন্য আপনার দ্বিতীয় যুক্তি (আরজি 2)

4 : নোডে আপনার তৃতীয় যুক্তি (আরজি 3)

আপনার আসল যুক্তিগুলি অ্যারের সূত্র 2ndসূচকটি শুরু করে ।argvprocess.argv[2]


7

আপনি ব্যবহার করে কমান্ড লাইন আর্গুমেন্ট পৌঁছাতে পারেন 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

দ্রষ্টব্য: আপনার file.js x=1 y=2এই সমাধানটি ব্যবহার করার মতো নামযুক্ত যুক্তি ব্যবহার করা উচিত ।


এটি কাজ করতে পারে না, mapসম্পত্তি অপরিজ্ঞাত।
cram

6

আপনি সমস্ত যুক্তি পার্স করতে পারেন এবং সেগুলি বিদ্যমান কিনা তা পরীক্ষা করতে পারেন।

ফাইল: পার্স-ক্লাই-আর্গুমেন্ট.জেএস:

module.exports = function(requiredArguments){
    var arguments = {};

    for (var index = 0; index < process.argv.length; index++) {
        var re = new RegExp('--([A-Za-z0-9_]+)=([A/-Za-z0-9_]+)'),
            matches = re.exec(process.argv[index]);

        if(matches !== null) {
            arguments[matches[1]] = matches[2];
        }
    }

    for (var index = 0; index < requiredArguments.length; index++) {
        if (arguments[requiredArguments[index]] === undefined) {
            throw(requiredArguments[index] + ' not defined. Please add the argument with --' + requiredArguments[index]);
        }
    }

    return arguments;
}

শুধু করণ অপেক্ষা:

var arguments = require('./parse-cli-arguments')(['foo', 'bar', 'xpto']);

4

লাইব্রেরি ছাড়া

আপনি যদি ভ্যানিলা জেএস / ইএস 6 এ করতে চান তবে নীচের সমাধানটি ব্যবহার করতে পারেন

শুধুমাত্র নোডজেএস> 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 দয়া করে মানচিত্রে কোডটি সংশোধন করুন এবং যদি আপনি আরও মার্জিত সমাধান পান তবে ধন্যবাদ ফাংশন হ্রাস করুন;)


1
আমি রাজি, কিন্তু এটি কি সংক্ষিপ্ত হতে পারে? let args = process.argv.slice(2).reduce((acc, arg) => { let [k, v] = arg.split('=') acc[k] = v return acc }, {})
জোসেফ

4

যদিও উপরের উত্তরগুলি নিখুঁত, এবং কেউ ইতিমধ্যে ইয়ার্গসের পরামর্শ দিয়েছেন, প্যাকেজটি ব্যবহার করা সত্যিই সহজ। এটি একটি দুর্দান্ত প্যাকেজ যা কমান্ড লাইনে আর্গুমেন্টগুলি প্রদান করা সহজ করে তোলে।

npm i yargs
const yargs = require("yargs");
const argv = yargs.argv;
console.log(argv);

আরও তথ্যের জন্য দয়া করে https://yargs.js.org/ দেখুন।


ইয়ার্জগুলি কমান্ড লাইনে কীভাবে আর্গুমেন্টগুলি পাস হয় তা প্রভাবিত করে না, এটি কেবল কোডে সেগুলি পড়তে সহায়তা করে।
ব্যবহারকারী 3285954

4

তর্কগুলি পাস করা সহজ, এবং সেগুলি গ্রহণ প্রক্রিয়াটি পড়ার বিষয় is আরজিভি অ্যারে নোডটি মূলত সর্বত্র থেকে অ্যাক্সেসযোগ্য করে তোলে। তবে আপনি এগুলি কী / মান জোড় হিসাবে পড়তে চাইছেন, সুতরাং এটির ব্যাখ্যা করার জন্য আপনার স্ক্রিপ্টের জন্য একটি টুকরো দরকার।

জোসেফ মেরড্রিগনাক হ্রাস ব্যবহার করে একটি সুন্দর পোস্ট করেছেন, তবে এটি এর key=valueপরিবর্তে -k valueএবং এর সিনট্যাক্সের উপর নির্ভর করে --key value। আমি এটি দ্বিতীয় কমান্ডটি আরও দীর্ঘায়িত করে দীর্ঘায়িত করেছি এবং আমি এটি একটি উত্তর হিসাবে পোস্ট করব কারণ এটি কোনও ভাষ্য হিসাবে উপযুক্ত নয়। তবে কাজটি হয়ে যায়।

   const args = process.argv.slice(2).reduce((acc,arg,cur,arr)=>{
     if(arg.match(/^--/)){
       acc[arg.substring(2)] = true
       acc['_lastkey'] = arg.substring(2)
     } else
     if(arg.match(/^-[^-]/)){
       for(key of arg.substring(1).split('')){
         acc[key] = true
         acc['_lastkey'] = key
       }
     } else
       if(acc['_lastkey']){
         acc[acc['_lastkey']] = arg
         delete acc['_lastkey']
       } else
         acc[arg] = true
     if(cur==arr.length-1)
       delete acc['_lastkey']
     return acc
   },{})

এই কোড সহ একটি কমান্ড node script.js alpha beta -charlie delta --echo foxtrotআপনাকে নিম্নলিখিত অবজেক্টটি দেবে


args = {
 "alpha":true,
 "beta":true,
 "c":true,
 "h":true,
 "a":true,
 "r":true
 "l":true,
 "i":true,
 "e":"delta",
 "echo":"foxtrot"
}

3

নোড.জেজে আর্গুমেন্টগুলি পুনরুদ্ধার করার সহজ উপায়টি প্রক্রিয়া.আরজিভি অ্যারের মাধ্যমে। এটি একটি গ্লোবাল অবজেক্ট যা আপনি এটি ব্যবহার করতে কোনও অতিরিক্ত লাইব্রেরি আমদানি না করে ব্যবহার করতে পারেন। আমরা কেবল একটি নোড.জেএস অ্যাপ্লিকেশনটিতে আর্গুমেন্টগুলি পাস করতে হবে ঠিক যেমনটি আমরা আগে দেখিয়েছি, এবং এই যুক্তিগুলি প্রসেস.আরজিভি অ্যারের মাধ্যমে অ্যাপ্লিকেশনটিতে অ্যাক্সেস করা যেতে পারে।

প্রক্রিয়া.আরজিভি অ্যারের প্রথম উপাদানটি সর্বদা নোড এক্সিকিউটেবলের দিকে নির্দেশ করে একটি ফাইল সিস্টেমের পথ হবে। দ্বিতীয় উপাদানটি কার্যকর করা হচ্ছে এমন জাভাস্ক্রিপ্ট ফাইলটির নাম। এবং তৃতীয় উপাদানটি হ'ল প্রথম যুক্তি যা আসলে ব্যবহারকারী দ্বারা পাস হয়েছিল passed

'use strict';

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

এই সমস্ত স্ক্রিপ্টটি প্রক্রিয়া.আরজিভি অ্যারের মাধ্যমে লুপ হয় এবং সেই সূচীতে সঞ্চিত উপাদানগুলির সাথে সূচকগুলি মুদ্রণ করে। আপনি কখনই কোন যুক্তি গ্রহণ করছেন এবং কোন ক্রমে কোনও প্রশ্ন রেখেছেন তা ডিবাগ করার জন্য এটি খুব কার্যকর।

কম্যান্ডলাইন আর্গুমেন্টের সাথে কাজ করার জন্য আপনি ইয়ার্গসের মতো লাইব্রেরিও ব্যবহার করতে পারেন।


2

কোনও লাইব্রেরি সহ টাইপস্ক্রিপ্ট সমাধান:

interface IParams {
  [key: string]: string
}

function parseCliParams(): IParams {
  const args: IParams = {};
  const rawArgs = process.argv.slice(2, process.argv.length);
  rawArgs.forEach((arg: string, index) => {
    // Long arguments with '--' flags:
    if (arg.slice(0, 2).includes('--')) {
      const longArgKey = arg.slice(2, arg.length);
      const longArgValue = rawArgs[index + 1]; // Next value, e.g.: --connection connection_name
      args[longArgKey] = longArgValue;
    }
    // Shot arguments with '-' flags:
    else if (arg.slice(0, 1).includes('-')) {
      const longArgKey = arg.slice(1, arg.length);
      const longArgValue = rawArgs[index + 1]; // Next value, e.g.: -c connection_name
      args[longArgKey] = longArgValue;
    }
  });
  return args;
}

const params = parseCliParams();
console.log('params: ', params);

ইনপুট: ts-node index.js -p param --parameter parameter

আউটপুট: { p: 'param ', parameter: 'parameter' }


1

process.argvআপনার বন্ধু, কমান্ড লাইন আর্টস ক্যাপচার করা নোড জেএসে স্থানীয়ভাবে সমর্থিত। নীচে উদাহরণ দেখুন:

process.argv.forEach((val, index) => {
  console.log(`${index}: ${val}`);
})

0

নোড ডক্সে বর্ণিত হিসাবে প্রক্রিয়া.আরজিভিভি সম্পত্তি নোড.জেএস প্রক্রিয়া চালু হওয়ার সময় পাস হওয়া কমান্ড লাইন আর্গুমেন্ট সম্বলিত একটি অ্যারে প্রদান করে।

উদাহরণস্বরূপ, প্রক্রিয়া- args.js এর জন্য নিম্নলিখিত স্ক্রিপ্টটি ধরে নেওয়া:

// print process.argv
process.argv.forEach((val, index) => {
   console.log(`${index}: ${val}`);
});

নোড.জেএস প্রক্রিয়াটি এইভাবে চালু করা হচ্ছে:

 $ node process-args.js one two=three four

আউটপুট উত্পন্ন করবে:

0: /usr/local/bin/node
1: /Users/mjr/work/node/process-args.js
2: one
3: two=three
4: four

0

বেশিরভাগ লোকই ভাল উত্তর দিয়েছেন। আমি এখানে কিছু অবদান রাখতে চাই। 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

কোনও নোড.জেএস প্রোগ্রামে কমান্ড লাইন আর্গুমেন্টগুলি পাস করার সর্বোত্তম উপায় হ'ল কমান্ড লাইন ইন্টারফেস (সিএলআই) ব্যবহার করে is

আপনি ব্যবহার করতে পারেন এমন নোডেজ-ক্লিপ নামে একটি নিফটি এনপিএম মডিউল রয়েছে ।

যদি আপনি কোনও নির্ভরতা ছাড়াই একটি তৈরি করতে চান তবে আমার গিথুবটিতে আমি এটি পেয়েছি যদি আপনি এটি পরীক্ষা করে দেখতে চান তবে এটি আসলে বেশ সহজ এবং সহজেই ব্যবহারযোগ্য, এখানে ক্লিক করুন


0

ES6- স্টাইল নো-নির্ভরতা সমাধান:

const longArgs = arg => {
    const [ key, value ] = arg.split('=');
    return { [key.slice(2)]: value || true }
};

const flags = arg => [...arg.slice(1)].reduce((flagObj, f) => ({ ...flagObj, [f]: true }), {});


const args = () =>
    process.argv
        .slice(2)
        .reduce((args, arg) => ({
            ...args,
            ...((arg.startsWith('--') && longArgs(arg)) || (arg[0] === '-' && flags(arg)))
        }), {});
console.log(args());
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.