博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
process.argv与命令行工具
阅读量:6162 次
发布时间:2019-06-21

本文共 3165 字,大约阅读时间需要 10 分钟。

process.argv

process是node中的一个模块,通过访问process.argv我们能轻松愉快的接收通过命令执行node程序时候所传入的参数。

[info] argv翻译成中文意思是:命令行变元数组。

这是什么意思呢?我们都在命令行窗口中使用过npm命令来进行包的下载,在使用npm命令的时候我们还能进行一些传参,像要下载的包的名字啊,是开发依赖还是生产依赖啊。

这些所传的参数+node.exe绝对路径+node所执行文件的绝对路径所组成的数组 = process.argv。它不止包含所传的参数还包含另外两个东东作为数组成员,故称之为变元数组。

示例1

// 文件p1.js中console.log(process.argv);>>>命令行中输入node p1.js --a -b c<<< 输出E:\w>node p1.js --a -b c[ 'C:\\Program Files\\nodejs\\node.exe',  'E:\\w\\p1.js',  '--a',  '-b',  'c' ]   复制代码

批处理文件

批处理文件,顾名思义,它能达到通过只执行一个文件从而执行多条node命令的效果,它能极大的简化我们在命令行中的输入,我们只需要输入批处理文件的名字,甚至不需要输 node这个前缀。 批处理文件在不同的操作系统下是不一样的,主要分为:

  • window下的批处理文件
  • 类linux下的批处理文件

windows中的批处理文件

windows中的批处理文件后缀名为.bat

//hello.bat文件中node p.js -a hello -b world>>>命令行中hello //为xx.bat文件去掉后缀的文件名<<

占位符

在上面的栗子中有一个问题,我们所传入的参数是固定的,要想它不固定,需要在.bat文件中使用占位符取代原本固定的参数,再在执行批处理文件时通过传参进行映射。

//hello.bat文件中node p.js %1 %2 %3 %4>>>命令行中输入hello -a hello -b world //为xx.bat文件去掉后缀的文件名<<

[warning] 注意:

  • 此时%后面的数字代表了%x这个占位符代表是第几个传入的参数
  • %x是从%1开始的而不是%0

上面虽然使传参所传入的参数值不再固定化了,但个数仍然是固定的,so我们推荐下面这种类linux的批处理文件。

类linx中的批处理文件

此时,我们不再需要.bat后缀名,我们的批处理文件名直接就是xxx(不再需要后缀)。

给文件添加可执行权限

假若我们要执行的文件名为hello,要执行这个批处理文件,我们需要先给它添加可执行权限

$ chmod +x hello复制代码

告诉命令行让谁来执行这个文件里的内容

接着,在这个文件中添加一句话,意思是让node来执行这个命令

#! /usr/bin/env node复制代码

'./'执行文件

最后,如何执行这个文件呢,只需要访问它即可

>>>输入$ ./hello --a -b c<<< 输出[ 'C:\\Program Files\\nodejs\\node.exe',  'E:\\w\\hello',  '--a',  '-b',  'c' ]复制代码

[danger] 注意: 此时./是必须的

npm link

如果我们想在输入命令时不需要输入前面的'./',我们就需要用到npm link了。 首先,在package.json下,添加这么一段

"bin":{	"hello":"hello" //前者为我们输入的命令,后者为要执行的文件的路径(包括文件名)}复制代码

接着在package.json所处目录下的命令行中输入

npm link复制代码

这样我们就无需在输入命令时候还要加上./前缀。

[important]注意:

  1. 这是因为npm link后,命令行中的命令指向了npm目录bat文件(npm-link后会自动在npm目录下生成,其作用是将package.json中我们所配置的那个可执行文件挂到这个.bat下),而 bat文件又指向了当前目录 (package.json所处目录)的hello文件(路径)。

  2. npm link 必须配合 #! /usr/bin/env node,否则windows会报脚本执行错误

yargs

yargs能帮助我们在被执行的文件里所接受的参数进行包装处理。 yargs.argv就是包装后的process.argv,除此之外我们还能通过yargs.options对这个包装对象再进行进一步的订制。

[important] 注意: 和process.argv很大的不同是它返回的是一个对象而不是数组,以连词线 ---开头的参数会作为对象中的一个key值,而它后面的非连词线开头的参数会作为key的值,如果后面没有非连词线开头的参数则会返回true

//hello文件中#! /usr/bin/env nodelet yargs = require('yargs');let argv = yargs.argv; //.argv是必须的console.log(argv);>>>命令行中输入$ ./hello --a 1 -b 2 c<<

下划线属性

我们可以通过访问argv._来获取非连词线开头的参数

>>>命令行中输入$ ./hello d --a 1 -b 2 c<<

命令行参数的配置

多个不同参数的配置通过.option隔开

#! /usr/bin/env nodelet yargs = require('yargs');// let argv = yargs.argv;let argv = yargs.options('a',{  alias:'ant'  ,demand:true  ,default:'super'  ,describe:'一只灰常大的蚂蚁'  ,boolean:false  ,type:'string'}).options('b',{  alias:'BB'  ,describe:'woshi bb'  ,boolean:false}).argv;console.log(argv._);console.log(argv);>>>命令行中输入$ ./p1.js -a valueA -b valueB -c<<

配置项说明:

  • alias:别名,当传入a时也会同时生成ant
  • demand:该参数是否必须
  • default:默认值
  • describe:参数描述
  • boolean:设置为true时,若该参数没有传入则会将该参数的值设置为false
  • type:限制传入参数的类型

配置帮助信息

首先yargs已经默认为我们提供了--help参数来显示帮助信息,我们同样的,可以给这个--help参数配置个别名来简化

let argv = yargs.此处省略一万字.help('h').argv>>>命令行中输入$ ./p1.js --h<<

配置其它的帮助提示

  • usage:用法格式
  • example:一个详细的使用栗子
  • epilog:结尾处的显示,常用来显示命令工具的版本行
// hello文件中....help('h').usage('hello -[option] value').example('我,栗子,让你明白!').epilog('copyright 2018-').argv;>>>$ ./hello -h<<

yargs实现思路

let args = process.argv;let argv = {};for(let i=2;i

转载地址:http://xhefa.baihongyu.com/

你可能感兴趣的文章
乐在其中设计模式(C#) - 提供者模式(Provider Pattern)
查看>>
MVP Community Camp 社区大课堂
查看>>
GWT用frame调用JSP
查看>>
大型高性能ASP.NET系统架构设计
查看>>
insert select带来的问题
查看>>
EasyUI 添加tab页(iframe方式)
查看>>
mysqldump主要参数探究
查看>>
好记心不如烂笔头,ssh登录 The authenticity of host 192.168.0.xxx can't be established. 的问题...
查看>>
使用addChildViewController手动控制UIViewController的切换
查看>>
Android Fragment应用实战
查看>>
SQL Server查询死锁并KILL
查看>>
内存或磁盘空间不足,Microsoft Office Excel 无法再次打开或保存任何文档。 [问题点数:20分,结帖人wenyang2004]...
查看>>
委托到Lambda的进化: ()=> {} 这个lambda表达式就是一个无参数的委托及具体方法的组合体。...
查看>>
apache 伪静态 .htaccess
查看>>
unity3d 截屏
查看>>
ASP.NET MVC学习之控制器篇
查看>>
MongoDB ServerStatus返回信息
查看>>
分析jQuery源码时记录的一点感悟
查看>>
程序局部性原理感悟
查看>>
UIView 动画进阶
查看>>