怎样开发自己的nodejs命令行工具

怎样开发自己的nodejs命令行工具

点点

2021-05-31 11:07 阅读 320 喜欢 0

日常开发中,经常会频繁的做一些重复性的操作,作为一名程序员,解放双手的时刻到了。

比如说:批量修改某些文件的后缀,对于一些shell或者win下的命令不是很熟悉,稍微了解的就是自己的开发语言,所以用熟悉的工具做事还是可以带来少许的成就感。

下面准备针对这个小小的需求开发一个自己的命令行,当然如果能帮助到其他人,那就更高兴啦。

需求整理

可以对某个文件夹下的所有文件进行后缀的修改 可以限定某类后缀修改为指定的后缀 可以指定目标文件夹 同时可以随机重命名

准备

nodejs的环境 编辑工具sublime npm 的帐号 github的帐号

大体流程

在github上创建自己想要的仓库changeext(命名) 将仓库clone到本地进行开发、测试 发布到github 发布到npm 安装到本地进行使用大功告成

步骤分解

1.确定目标文件夹、一些相关的参数(是否重命名、源后缀、目标后缀) 2.获得目标文件夹下的所有文件(符合源后缀) 3.对符合条件的文件进行重命名(修改后缀) 4.结束。流程很简单,实现起来也不麻烦,但是起码这是自己的小工具啊。 开发中使用的module: minimist(命令行参数处理) fs(操作文件) path(处理文件路径) colors(让打印信息更加好看)

代码如下:

 #!/usr/bin/env node
  //作为命令行工具,第一行就是上面的这货,千万别少了

 var fs = require('fs');

 var path = require('path');

  var colors = require('colors');
  //指定一些颜色信息
   colors.setTheme({
       error : 'red',
     success : 'green',
      info : 'yellow'
});
//获得命令行的参数
 var argv = require("minimist")(process.argv.slice(2), {
  alias: {
'input': 'i',
'target': 't',
'directory': 'd',
'loop' : 'l',
'random' : 'r'
 },
   string: ['input', 'target','directory'],
   boolean : ['loop','random'],
  'default': {
'directory': process.cwd()
   }
   });
    //打印帮助信息
    if (argv.help) {
    console.log("Usage:".info);
      console.log("  changeext --help     // print help information".success);
      console.log("  changeext txt js     // change 'txt' to 'js' ".success);
      console.log("  changeext -i txt     // input file extensions".success);
     console.log("  changeext -t js      // target file extensions".success);
     console.log("  changeext -d /home/  // target directory for                    change".success);
      console.log("  changeext -l         // loop file directory for change file          extensions".success);
       console.log("  changeext txt js -r  // get some random name");
       process.exit(0);
   }
 //随机获得一个随机字符串
  function getRandom(){
     var counter = 0;
      return (function() {
   var guid = (+new Date()).toString( 32 ),i = 0;
  for ( ; i < 5; i++ ) {
      guid += Math.floor( Math.random() * 65535 ).toString( 32 );
  }
  return  guid + (counter++).toString( 32 );
   })();
  }
 //重命名
     function rename (folderPath,input,target,loop){
        fs.stat(folderPath,function(err,stats){
if(err){
  console.log(err);
}else{
  if(stats.isDirectory()){

    if(loop === true && argv.loop === false){
      return false;
    }

    if(loop === false && argv.loop === false){//不需要循环,但是目标路径为文件夹
      loop = true;
    }

    fs.readdir(folderPath,function(err2,files){
      if(err2){
        console.log(err2);
      }else{
        if(files && files.length > 0){
          files.forEach(function(filename,index){

            rename(path.join(folderPath,filename),input,target,loop);

          });
        }
      }
    });
  }else{

    var extname = path.extname(folderPath);

    input = input.startsWith('.') || input == '' ? input : '.'+input;

    target = target.startsWith('.') || target == '' ? target : '.'+target;

    extname = extname.toLowerCase();

    input = input.toLowerCase();

    target = target.toLowerCase();

    if(extname === input){
      var newPath = "";
      if(argv.random){
        var randomName = getRandom() + target;
        newPath = path.join(path.dirname(folderPath),randomName);
      }else{
        newPath = folderPath.substring(0,folderPath.length - extname.length) + target;  
      }
      fs.rename(folderPath,newPath,function(err){
        if(err){
          console.log(err);
        }else{
          console.log('Rename file : '+folderPath.info +' => '+newPath.info+' success.'.success);  
        }
      });
    }
  }
}

   });
      }
     //校验
      if(argv.directory && fs.existsSync(argv.directory)){

        if( (argv.input && argv.target) || (argv.input === '' && argv.target) || (argv.input && argv.target === '') ){

rename(argv.directory,argv.input,argv.target,argv.loop);

         }else{
if(argv._[0] && argv._[1]){

  rename(argv.directory,argv._[0],argv._[1]);

}else{

  console.log('input file extensions and target file extensions must be not empty.'.error);  
  process.exit(0);

}
    }
   }else{

      console.log('directory is not exists.'.error);
       process.exit(0);

   }

把代码发布到github(此处流程可以google),将自己的代码发布到npm官网(此处可以查看:https://www.jianshu.com/p/e388af61f5dd)

就可以开心的下载自己的工具来666了。

转载请注明出处: http://sdxlp.cn/article/minglin.html


如果对你有用的话,请赏给作者一个馒头吧 ...或帮点下页面底部的广告,感谢!!

赞赏支持
提交评论
评论信息(请文明评论)
暂无评论,快来快来写想法...
推荐
连接linux系统后发现又是乱码,已经好多次了,看着实在是难受,赶紧各种找资料进行尝试,最终..发现竟然是工具的问题。 不过我其他的服务器并没有这样的情况昂.. 可能也有部分原因是服务器系统的问题吧。
日常生活中,我们经常使用到手机热点,它相当于一个移动路由器,可以开启WiFi在其他设备上直接连接使用,而且打开手机热点操作非常简单,那小伙伴们开启手机热点之后为什么连接不上呢,下面就和小编一起来看看吧!
如果在没有wifi的情况下,我们接收qq信息就要流量。尤其是图片,QQ里加入的群很多,接收图片就很费流量。在这样的情况下我们可以设置屏蔽群图片,手机qq怎么设置屏蔽群图片呢?下面为小伙伴们介绍。
系统有好多个,这里说一下miui吧,miui说了很多小伙伴们看不懂,通俗来说就是小米,这样一说小伙伴们就知道啦!miui是一款好用的Android深度定制ROM,在系统中有很多人性化的服务,但是在使用过程中难免会出现一些不好清理的文件,比如说其他文件,这里为各位小伙伴们带来有关的删除方法。下面来跟点点一起看一下吧!
如何在荣耀手机中调整图标大小,我们可以根据自己的使用体验去自定义一些手机的内容,其中桌面图标是我们使用手机的第一使用体验,过大的手机软件图标会影响我们的桌面应用放置量。
小红书是现在非常流行的一款生活、社交软件,有些小伙伴不知道如何将小红书中的笔记设为置顶,接下来小编就给小伙伴们介绍一下具体的操作步骤。
鉴于当下聊天记录越来越重要,很多的小程序都有保留聊天记录的功能,抖音现在是很火的软件,那么抖音中的聊天功能就显得非常重要,因为可以分享自己喜欢视频给对方,然后可以在其中进行聊天,将会带来非常有趣的沟通过程,但是很多小伙伴们问小编,发现抖音聊天记录突然没有了想要知道怎么恢复。
微信现在是当下常用的社交软件,当我们遇到朋友时候,该怎样添加其联络方式哪?怎样关注公众号?怎样删除微信好友?怎样取消关注公众号哪?重点来了,跟我来。