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

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

点点

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


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

赞赏支持
提交评论
评论信息(请文明评论)
暂无评论,快来快来写想法...
推荐
你是否也有过这样的经历,翻看微信相册时,突然发现一些图片已经过期无法查看,它们或许是曾经的朋友圈,或许是某个特别的日子,亦或许是一段难忘的回忆。这些图片虽然已经过期,但它们所承载的记忆却是永恒的。
现如今手机成为了每个人的必备之物,随着现在的手机越来越智能,手机的功能越来越多,但是手机的内存越永远也跟不上我们使用的节奏,因为手机的内存越大意味着价格也就越高,就算是再大的内存,也会有使用到不足的时候,而当手机的内存不够用的时候,我们往往就会清理手机里存储的大量照片。
现在小伙伴们都离开不了手机,它逐渐成为我们生活中必不可少的一样生活用品。很多小伙伴在用了 iPhone6 以后,遇到系统提示内存不足的问题。对于智能手机,相信小伙伴们都知道,同款机型不同内存大小,价格会相差很多,特别是对应iPhone这样的土豪手机,不同的内存版本更是相差多则上千。而很多当初选择了小内存的手机用户,发现在使用过程中彻底不够用。
点点在使用电脑时,基本上都是在使用QQ输入法,可有的时候突然就不见了,非常难受,经过不停的实验终于摸索出来了,现在分享出来,希望可以为小伙伴们节省时间,更加高效的生活与工作。当我们在电脑上使用QQ输入法时,QQ输入法不见了隐藏了怎么办?电脑QQ输入法不见了怎么调出来?下面就和点点一起来看看吧!
最近,微信经过更新之后,拥有了众多热门的功能,其中最受欢迎的就是微信朋友圈不止可以发9张照片了,可以最多发20张照片,对于很多喜欢分享自己生活的小伙伴们来说非常方便,但是很多小伙伴们不知道怎么发,下面就让点点给小伙伴们介绍一下具体的教程。
当“超前点播”成为历史,抖音上的短剧已经默默开启了“付费”模式。
华为手机中最先推出的纯净模式对于很多用户来说如获至宝,但是对于很多用户来说都是鸡肋的功能,因为打开后会阻拦所有第三方的下载渠道,所以很多用户想要知道华为手机纯净模式怎么关闭?
前段时间弄了下微信的dat图片的解码,有同学问数据库的解码怎么弄.. 发现微信数据库的数据格式是真的麻烦...