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

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

点点

2021-05-31 11:07 阅读 367 喜欢 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


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

赞赏支持
提交评论
评论信息(请文明评论)
暂无评论,快来快来写想法...
推荐
荣耀手机是国内手机比较大的一个厂商,拥有众多的用户,并且在持续的推出各种新品,面对与时俱进的手机设置,很多用户想要知道荣耀手机微信怎么设置密码锁屏,那么下面就让点点给小伙伴们介绍一下设置方式。
小伙伴们在很多的特殊节日里,手机微信的红包限额将会进行修改,例如一些情人节、七夕等情侣之间过的节日,微信红包限额都会由200改成520,小伙伴们可以直接发出一个520红包,下面就和小编一起来看看吧!
智能化的时代,当微信的出现,QQ聊天软件现在基本上已经沦为工作与游戏的专用了,用久了之后我们还是建议时不时清理一下没用的聊天记录,毕竟现在这两款软件已经升级为“3A”大作了,电脑里除了视频照片就属QQ/微信占用空间最多。当然我们也可以选择备份聊天记录,这样一来换电脑或者有需要都可以直接完全备份,下面就跟着小编一起来看看具体如何操作吧。
微信的这次更新是比较大的,有了好多实用的小功能,现在跟我来看一下吧!对其生活越来越实用啦!
在短视频兴起的时代,一款好用的视频剪辑工具是我们必备的,而目前剪映有电脑版的软件可以供小伙伴使用了。如果遇到了拥有非常好听的背景音乐的视频文件,那么此时我们应该怎么将视频中的音频分离出来呢?
很多小伙伴们既想删好友但又舍不得聊天记录!小编也一样 ,下面就告诉小伙伴们如何删好友但保留聊天记录的方法。
在使用抖音时,可能会与很多人的进行聊天,时间久了聊天记录自然也会变得庞大,这时想要找到特定的聊天内容可能会有些困难。为了更高效地管理和回顾聊天记录,下面是如何在抖音中搜索并定位特定私信聊天内容的方法。
现在越来越多的小伙伴们使用微信来传收文件,那么小伙伴们怎么找到别人发来的文件呢?小编就来为小伙伴们介绍一下吧。