windows下通过命令行运行javascript脚本,支持命令行参数
js作为最受欢迎的语言,以其方便、通用、功能强大的特点,可以给大家在实际使用的过程中带来很大的便利。
下面是本文从实际应用的角度理解的js好处:
- js的正则表达式处理
- 易理解、弱类型的语法特性
- 使用浏览器就可以方便调试
- 与网页深度结合,在处理和展示有巨大优势
支持命令行运行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);
}
}