最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

[js]windows下通过命令行运行javascript脚本,支持命令行参数

运维笔记admin4浏览0评论

windows下通过命令行运行javascript脚本,支持命令行参数

js作为最受欢迎的语言,以其方便、通用、功能强大的特点,可以给大家在实际使用的过程中带来很大的便利。

下面是本文从实际应用的角度理解的js好处:

  1. js的正则表达式处理
  2. 易理解、弱类型的语法特性
  3. 使用浏览器就可以方便调试
  4. 与网页深度结合,在处理和展示有巨大优势

支持命令行运行js脚本,在实际中能起到很多意想不到的效果。下面介绍通过命令行运行javascript脚本的内容。

原理

通过nodejs运行js脚本。

核心函数

为了保证文件用其他方式也能使用,可以先判断是否是通过nodejs运行。如果不是,直接跳过。


function node_main(){
  // 如果不是通过node执行,直接返回
  if("undefined" == typeof process){
    return;
  }

  var s = convert(exampleIn, 'fname');
  console.log(s);
}

node_main()

运行js脚本

你现在已经可以用js写你的功能,然后在命令行下执行了。

读写文件

处理文本,不支持读写文件,那是不完整的。

nodejs运行javascript可以通过require('fs')库进行文件的读写。fs库是nodejs自带的系统库,不需要另外安装。

读取文件


var fs = require('fs');
if(!fs.existsSync(tmpFname)){
    return "";
}

var str = fs.readFileSync(tmpFname, null);
return str.toString();

写入文件


var fs = require('fs');
var s = "content to write";
fs.writeFileSync(tmpFname, s);

读取命令行参数

通过变量process.argv读取。第0个是node,第1个是脚本名,第2个开始是要使用的参数


for(var i=2;i<process.argv.length;i++){
    var fname = process.argv[i];
    console.log('arg: ' + fname);
}

完整的示例代码

ProtoIndex.js

/**
 * Proto自动生成编号
 **/

var name = "ProtoIndex";
var des = "Proto自动生成编号";
var exampleIn = ""
+ "message msg {\n"
+ "    repeated string result = 1;\n"
+ "    repeated string a = 1;\n"
+ "\n"
+ "    // 这里是注释\n"
+ "    string b = 1;\n"
+ "    \n"
+ "    // repeated string d = 1; // 注释里的注释\n"
+ "\n"
+ "    repeated uint32 c = 1;\n"
+ "}\n";


function convert(input) {
    var res =indexProto(input);
    return res;
}



/***********************************************************
 * proto定义自动编号
 */
function testProtoIndex(s) {
    return /^[\s]*\w+(\s+[\w.]+)*\s*=\s*([\d]+)/.test(s);
}

function testProtoMessageStart(s) {
    return /^\s*message\s*/.test(s);
}


function replaceProtoIndex(s, index) {
    return s.replace(/\s*=\s*([\d]+)/, function (str, key) {
        return " = " + index;
    });
}

function indexProto(content) {
    var resContent = "";
    var s = content;

    var count = 1;
    var sList;
    if (Array.isArray(content)) {
        sList = content;
    } else {
        sList = s.split("\n");
    }
    var rItems = [];
    for (var i = 0; i < sList.length; i++) {
        var kw = sList[i];
        if (!kw) {
            rItems.push("");
            continue;
        }
        if (testProtoIndex(kw)) {
            kw = replaceProtoIndex(kw, count);
            count++;
        } else if (testProtoMessageStart(kw)) {
            count = 1;
        }
        rItems.push(kw);
    }

    resContent = rItems.join("\n")
    return resContent;
}




/*
 * 公共函数
 */


// 复制对象
function extend(to, from) {
    var keys = Object.keys(from);
    var i = keys.length;
    while (i--) {
        to[keys[i]] = from[keys[i]];
    }
    return to;
}


function nano(template, data) {
    return template.replace(/\{\{([\w\.]*)\}\}/g, function (str, key) {
        var keys = key.split("."),
            v = data[keys.shift()];
        for (var i = 0, l = keys.length; i < l; i++) v = v[keys[i]];
        return (typeof v !== "undefined" && v !== null) ? v : "";
    });
}


node_main();

function node_main(){
  // 如果不是通过node执行,直接返回
  if("undefined" == typeof process){
    return;
  }

  if(process.argv.length <= 2){
    var s = convert(exampleIn, 'no-file-name');
    console.log(s);
    return;
  }

  for(var i=2;i<process.argv.length;i++){
    var tmpFname = process.argv[i];
    console.log(tmpFname);

    var fs = require('fs');
    if(!fs.existsSync(tmpFname)){
        console.log("file not exists");
        continue;
    }

    var str = fs.readFileSync(tmpFname, null);
    var s = convert(str.toString());
    console.log(s);
  }
}

发布评论

评论列表(0)

  1. 暂无评论