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

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

点点

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


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

赞赏支持
提交评论
评论信息(请文明评论)
暂无评论,快来快来写想法...
推荐
智能手机成为普遍存在后,年轻人很多都喜欢刷B站,那么手机B站缓存的视频在哪个文件夹呢?今天小编为小伙伴们讲解一下。
针对二维码进行识别的功能,对图片进行位置纠正、二维码扫描,将数据进行整理。
小伙伴们在使用QQ的过程中,无法避免误删了一些重要的聊天记录,而使用QQ的大多数原因都是因为微信无法传送大存储量的文件,所以很多小伙伴们都会利用QQ来传送文件,手机QQ聊天记录删除了怎么恢复?
智能手机相当与一台移动式的电脑,许多小伙伴都有将重要文件和图片保存到手机上的习惯,如果我们的手机丢失了应该怎么办呢?
很多使用Mac苹果电脑的小伙伴们,发现电脑中的照片太多了,因此想要清除不想要的照片,但是却不知道如何清除,那么小编就来为小伙伴们介绍一下吧。
需要公司的LOGO信息,但是没有,只有公司的名字,想着成个默认的,该怎么处理哪?看下边文章,可以学到经验啊!
我们经常使用微信,每天很多小伙伴都会发几条朋友圈。撒狗粮的,发心情的,发动态的,发广告的,发游戏链接等,可是朋友圈不显示怎么办那?下面请跟我来,分分钟钟学会。
智能手机发展到现在,给我们带来了很多的便利,家里的老人小孩外出不放心,想随时知道TA的位置;或对情侣外出的位置有怀疑?现在小编就教小伙伴们如何在通过手机实时知道对方的位置。原理就是在对方手机装一个app,然后通过手机定位平台实现手机定位!