/*
NAME:
DESCRIPTION: ;
PARAMETER:
[
{
name : 'path',
title : '资料路径',
type : 'LineEdit',
property : {tool_tip : '资料路径,必填'},
},
{
name : 'db',
title : '料号db',
type : 'LineEdit',
property : {tool_tip : '料号db,默认是genesis'},
},
{
name : 'config_path',
title : '配置地址',
type : 'LineEdit',
property : {tool_tip : '配置的路径'},
}
]
VERSION_HISTORY:
V1.01 2020-04-20 Scott Sun
1.新版本
HELP:
功能简介
客户数据导入
参数配置
料号 和 客户配置
注意事项
无
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
// 引入模块 包
console.log("=============================================>input_start");
console.log("=============================================>input_start");
console.log("=============================================>input_start");
console.log("=============================================>input_start");
var $ = require('topcam.scriptfunc').argv();
var fs = require('fs');
var _ = require('lodash');
var zip = require('topsin.zip');
var process = require('process');
var mode = $.ikm ? "topcam" : "aimdfm";
var IKM = $.ikm;
if (IKM==undefined ) { IKM = require('topcam.ikm6')($) }
var GEN = $.gen;
var GUI = $.gui || {};
var Job = $.job || $.job_name;
var JobId = $.job_id;
var db = $.db || IKM.db
var PAR = {}
if ($.par) {
PAR = $.par
} else if ($.hasOwnProperty('script_parameter')){
PAR = JSON.parse($.script_parameter);
}
if (mode === "aimdfm") {
var database = require("topsin.database");
database.addConnection($.conf.database_conf, "DFM");
var QDfm = database.query("DFM");
$.QDfm = QDfm;
if ($.conf.product_type == "aimdfm") {
QDfm.updateRow({
table: "pdm_aimdfm_task",
data: {
current_process_title: $.process_title,
progress: 0
},
where: { id: $.task_id }
});
}
}
var Status = 'ok';
var resultData = [];
var import_info = [];
var inputState = [];
var cam_workflow_info = IKM.get_jobinfo({jobid:JobId, jobinfo:"cam_workflow_info"});
if(cam_workflow_info){
IKM.crud("deleteRow", {
table: "pdm_job_jobattr",
where:{job_id:JobId, attr_name:"cam_workflow_info"},
})
IKM.save_job_info({jobid:JobId, jobinfohash:{cam_workflow_info:""}})
}
try {
global._ERRORMAG = null;
var par = PAR;
// var db_path = db.query("",function(q){
// return q.selectValue({
// table:'pub_conf',
// field:'text_data',
// where:{path : "quote-data-upload"}
// })
// });
// if(_.isEmpty(db_path)){throw "quote-data-upload error"}
if(!par.path || par.path == "") {
script_info({ msg: "Find data path", result_severity:"error" });
global._ERRORMAG = "The data path does not exist";
throw "path error"}
if(!par.hasOwnProperty("config_path") || par.config_path==""){
console.log("===================cfg");
par.config_path = "cam/input_data"
};
if(!par.hasOwnProperty("db") || par.db==""){
console.log("========================db");
par.db = "genesis"
};
var db_customer = db.query("",function(q){
return q.selectValue({
table:'pdm_job',
field:'customer_code',
where:{id : JobId}
})
});
if(_.isEmpty(db_customer)){
script_info({ msg: "Find customer", result_severity:"error" });
global._ERRORMAG = "No customer was found";
throw "customer error"}
if(db_customer && !(/^done$/ig.test(db_customer)) && db_customer != "" ){
par.customer = db_customer
}
par.customer = par.customer[0].toUpperCase()+par.customer.slice(1).toLowerCase()
var cfg = db.query("",function(q){
return q.selectValue({
table:'pub_conf',
field:'text_data',
where:{path : par.config_path}
})
});
if (!cfg || cfg == ""){
script_info({ msg: "Find customer config", result_severity:"error" });
global._ERRORMAG = "No customer config was found";
throw "cfg can not find"}
var config = eval(cfg);
if(!config.hasOwnProperty("customer")){
script_info({ msg: "Find customer config", result_severity:"error" });
global._ERRORMAG = "No customer config was found";
throw "config error"}
var job = Job;
if(_.isEmpty(job)) throw "没有传入料号名!";
job = job.toLowerCase()
// 如果genesis已经存在这个料号
err = delSameJob({job:job,delSame:config.delSameJob}); if(err){throw err};
var custCfg = config.customer[par.customer]
if(!custCfg){throw "customer config error:"+par.customer}
custCfg.db = par.db || custCfg.db
var step = custCfg.step.toLowerCase() || "cad";
// 获取路径下文件信息
var path = par.path
if(!fs.exists(path)){
script_info({ msg: "Find PN folder", result_severity:"error" });
global._ERRORMAG = "No PN file was found in folder";
throw "path error"}
var pathInfo = fs.listDir(path + "/" + db_customer.toLowerCase(), 1)
// 判断存不存在料号文件
// var vc_position = db.query("",function(q){
// return q.selectValue({
// table:'pdm_job',
// field:'version',
// where:{id : JobId}
// })
// });
var job_file_baseName = job
// if(vc_position && vc_position != "" && !(/null/ig.test(vc_position))){
// job_file_baseName = job_file_baseName + "_" + vc_position
// }
var jobFile = pathInfo.filter(function(v){return v.baseName.toLowerCase() == job_file_baseName})
if(jobFile.length == 0){
script_info({ msg: "Find PN folder", result_severity:"error" });
global._ERRORMAG = "No PN file was found in folder";
throw "job file is not exist"}
var jobFiles = [] // 记录要分析的文件
if (!jobFile[0].isDir) {
jobFiles.push(jobFile[0])
} else {
jobFiles = fs.listDir(jobFile[0].path)
}
// GEN.COM("config_edit,name=iol_gbr_polygon_break,value=1,mode=user")
// GEN.COM("config_edit,name=iol_fix_ill_polygon,value=yes,mode=user")
// 将jobFile下的zip解压
script_info({ msg: "unzip the file", result_severity:"info" })
global._ERRORMAG = "Failed to unzip the file";
var change_files = [];
decompression(jobFile[0].path, [],change_files);
changePath2(jobFile[0].path);
var job_attrs = db.query("",function(q){
return q.selectValue({
table:'pdm_job',
field_format:{job_attrs:'json'},
field:'job_attrs',
where:{id : JobId}
})
});
if (!job_attrs ) { job_attrs = {}}
job_attrs.readin_result = "Readin"
db.query("",function(q){
return q.updateRow({
table:'pdm_job',
data:{job_attrs:job_attrs},
update_policy:{attr_data:'json_merge'},
where:{id : JobId}
})
});
jobFiles = fs.listDir(jobFile[0].path);
// 分析料号文件 得到料号导入信息 导入类型
var jobInfo = analyJobFiles({jobFiles:jobFiles.filter(function(v){return v.isFile}),custCfg:custCfg,config:config,job:job })
if(jobInfo.data.length == 0){
script_info({ msg: "Find PN folder", result_severity:"error" });
global._ERRORMAG = "No PN file was found in folder";
throw "file error"}
var importOk = false; // 是否成功导入
script_info({ progress: 10 ,result_severity:"ok", msg:""});
if(/odb/ig.test(jobInfo.type)){ // odb导入
script_info({ msg: "Import odb++", result_severity:"error" });
global._ERRORMAG = "Fail to import odb++";
if(jobInfo.data.length == 1){ // 只分析到一个tgz文件 直接导入
IKM.msg("只分析到一个tgz文件 直接导入");
import_info.push({name:jobInfo.data[0].file.name, type:"odb++", date:now(),user:$.user_name});
var err = importJob({name:job,db:custCfg.db,path:jobInfo.data[0].file.path},config.delSameJob);
// 将step改名cad
var step_tmp = GEN.getStepList({job:job})[0];
if(step_tmp != "cad"){
GEN.renameStep({job:job,name:step_tmp,new_name:'cad'})
}
if(err){throw err}
} else { // 多个tgz文件 说明需要合并
console.log("==========合并的情况");
var jobs = jobInfo.data.map(function(item, i){
var path = item.file.path
var tmp_job_name = job + "_tmp_" + i
var err = importJob({name:tmp_job_name,db:custCfg.db,path:path},config.delSameJob)
import_info.push({name:item.file.name, type:"odb++", date:now(),user:$.user_name})
if(err){throw err}
return {
name:tmp_job_name,
path: path
}
})
var step_all = [];
// 分析arr_job 和 pcs_job;
jobs = jobs.filter(function(v){return GEN.isJobExists({job:v.name})});
jobs.forEach(function(item){
var jobname = item.name
GEN.openJob({job:jobname});
var steps = GEN.getStepList({job:jobname})
steps.forEach(function(stepname){
var type = getStepType(stepname) // pcs arr
if(type == "pcs"){
step_all.unshift({
jobname: jobname,
stepname: stepname,
type: type
})
}
if(type == "arr"){
step_all.push({
jobname: jobname,
stepname: stepname,
type: type
})
}
})
});
var pcs_job_name_tmp = step_all[0].jobname
step_all = step_all.filter(function(item){
return item.jobname != pcs_job_name_tmp
})
var pcs_job = jobs.filter(function(item){
return item.name == pcs_job_name_tmp
})[0];
importJob({name:job,db:custCfg.db,path:pcs_job.path},config.delSameJob)
GEN.openJob({job:job});
step_all.forEach(function(item){
if(!GEN.isJobOpen({job:item.jobname})){ GEN.openJob({job:item.jobname})};
GEN.copyStep({ // 合并
source_job:item.jobname,
source_name:item.stepname,
dest_job:job,
dest_name:item.stepname,
});
})
jobs.forEach(function(item){
var v = item.name
if(GEN.isJobOpen({ job: v })){ GEN.closeJob({ job: v }) }
GEN.deleteJob({ job: v }); // 合并后 删除array的料号
})
}
importOk = true
}
if(/gerber/ig.test(jobInfo.type)){ // gerber导入
script_info({ msg: "Import gerber", result_severity:"error" });
global._ERRORMAG = "Fail to import gerber";
GEN.createJob({name:job,db:custCfg.db});
// GEN.COM("new_job,name="+job+",db="+custCfg.db+",customer=,disp_name=,notes=,attributes=")
GEN.createStep({job:job,name:step});
// GEN.renameStep({job:job,name:'org',new_name:'cad'})
// GEN.COM("disp_on")
// GEN.COM("origin_on")
// GEN.COM("check_inout,mode=out,type=job,job="+job)
// GEN.COM("check_inout,mode=out,type=job,job="+job)
// GEN.COM("open_job,job="+job+",open_win=yes,disk_map=,job_map=")
// GEN.COM("check_inout,job="+job+",mode=out,ent_type=job")
// GEN.AUX("set_group,group=99")
// GEN.COM("set_step,name=org")
// GEN.COM("open_group,job="+job+",step=org,is_sym=no")
// GEN.AUX("set_group,group=0")
// GEN.COM("open_entity,job="+job+",type=step,name=org,iconic=no")
// GEN.COM("set_subsystem,name=ReadIn")
// GEN.COM("input_create,path=/incam_db/"+custCfg.db+"/jobs/"+job+"/input")
// GEN.COM("open_job,job="+job+",open_win=yes,disk_map=,job_map=")
// GEN.COM("disp_on")
// GEN.COM("origin_on")
// GEN.COM("disp_on")
// GEN.COM("origin_on")
// GEN.COM("create_entity,job="+job+",name="+step+",db=,is_fw=no,type=step,fw_type=form")
// GEN.COM("disp_on")
// GEN.COM("origin_on")
// GEN.COM("disp_on")
// GEN.COM("origin_on")
// GEN.COM("show_tab,tab=Script,show=yes")
jobInfo.data = jobInfo.data.filter(function(v){
return v.format
})
var gerberInfo = jobInfo.data.map(function(item){
var gerberCfg = JSON.parse(JSON.stringify(item.format));
var file = item.file
gerberCfg.layer = file.name.toLowerCase().split(" ").join("-").replace(/[()]/ig,"_")
gerberCfg.path = file.path
gerberCfg.format = item.type
gerberCfg.job = job
gerberCfg.step = step
return gerberCfg
})
if(GEN.GEN_TYPE == "genesis"){
GEN.COM("input_manual_reset")
gerberInfo.forEach(function(v){
import_info.push({name:v.layer, type:"gerber274x", date:now(),user:$.user_name})
GEN.COM("input_manual_set",v)
GEN.COM("input_manual")
})
} else {
gerberInfo.forEach(function(v){
GEN.COM("input_result_reset,step=,category=warnings,close_tab=yes")
GEN.COM("input_create,path="+v.path)
GEN.COM("input_selected_reset")
GEN.COM("input_selected_add,path="+v.path)
GEN.COM("input_identify_selected,path=,job="+job+",script_path=,gbr_ext=no,drl_ext=no,gbr_units=auto,drl_units=auto,unify=yes,break_sr=yes,gbr_wtp_filter=*,drl_wtp_filter=*,gbr_wtp_units=auto,drl_wtp_units=auto,wtp_dir=,have_wheels=yes,wheel=,gbr_consider_headlines=yes,drl_consider_headlines=yes,board_size_x=0,board_size_y=0")
GEN.COM("input_manual_reset")
import_info.push({name:v.layer, type:"gerber274x", date:now(),user:$.user_name})
GEN.COM("input_manual_set",v)
GEN.COM("input_manual")
})
}
importOk = true
}
// [{
// "ori_dirname": "/home/toplinker/samba/1352/13520028_128/TLK0802/1streceived20200422/zip_custom0",
// "dirname": "/home/toplinker/samba/1352/13520028_128/TLK0802/1streceived20200422/custom1615366305861",
// "newpath": "/home/toplinker/samba/1352/13520028_128/TLK0802/1streceived20200422/custom1615366305861.zip"
// }, {
// "ori_dirname": "/home/toplinker/samba/1352/13520028_128/TLK0802/1streceived20200422/custom1615366305861/sh1scmnrlmSMD_VB",
// "dirname": "/home/toplinker/samba/1352/13520028_128/TLK0802/1streceived20200422/custom1615366305861/custom1615366305954",
// "newpath": "/home/toplinker/samba/1352/13520028_128/TLK0802/1streceived20200422/custom1615366305861/custom1615366305954.zip"
// }]
change_files.reverse().forEach(function(item){
fs.unlink(item.newpath)
if(item.dirname != item.ori_dirname && fs.exists(item.ori_dirname)){
fs.rmdir(item.ori_dirname);
}
fs.rename(item.dirname, item.ori_dirname);
})
if(!importOk){ throw "import error"}
script_info({ progress: 20 ,result_severity:"ok", msg:""});
global._ERRORMAG = null;
reNameStep(job)
if(/2171/.test(par.customer)){
// var matrix = GEN.getMatrix({job:job});
// comp = Object.keys(matrix).filter(function(v){ // 如果有comp层 删除
// return /^comp_\+_/ig.test(v)
// })
// if (comp.length > 0){
// var tmp = GEN.getStepList({job:job})
// GEN.openStep({job:job,name:tmp[0]})
// GEN.COM("delete_comp")
// GEN.closeStep()
// }
} else if ((/yucca/ig.test(par.customer))) {
// var matrix = GEN.getMatrix({job:job,type:"array"})
// matrix.layer_type.forEach(function(v, i){
// if( v == "document") {
// GEN.COM("matrix_layer_type,job="+job+",matrix=matrix,layer="+matrix.name[i]+",type=signal")
// }
// })
}
var steplist = GEN.getStepList({job:job})
GEN.openStep({job:job,name:steplist[0]})
// 额外操作
if (custCfg.extra) {
global._extra = true;
custCfg.extra.forEach(function(item){
var props = {
type : jobInfo.type,
fileInfo: jobInfo.data.filter(function(item2){return /Excellon/ig.test(item2.type) }),
step:steplist[0]
};
if(item.verification(props)){
item.fn(props);
}
})
}
GEN.closeStep()
GEN.checkInout({job:job,mode:"out"}) // 结束保存料号 关闭料号
GEN.saveJob({ job: job });
GEN.checkInout({job:job,mode:"in"})
GEN.closeJob({job:job})
var import_html = "导入状态/Import Status | 文件/File | 类型/Type | 导入时间/Import Time | 操作用户/User |
"
import_info.forEach(function(item){
var name = item.name;
var type = item.type;
var date = item.date;
var user = item.user;
import_html += "Readin | "+name+" | "+type+" | "+date+" | "+user+" |
"
})
import_html += "
"
// name type date user
resultData.push({type: "info",title:"导入资料列表",detail: [{ desc: import_html }] })
script_info({ msg: "Data Readin" ,result_severity:"ok"})
if (mode === "aimdfm") {
$.QDfm.updateRow({
table: "pdm_aimdfm_task",
data: {
progress: 30
},
where: { id: $.task_id }
});
if (GEN.hasError()) {
Status = 'error';
resultData.push({ type: "error", title: "GEN错误!", detail: [{ desc: _.join(GEN.STATUS, "\n") }] });
return {
status: Status,
result_data: resultData
};
} else {
resultData.push({ type: "info", title: "操作完成, 请注意检查!" });
return {
status: Status,
result_data: resultData
};
}
}else {
return "Done"
}
}
catch (e) {
script_info({ result_severity: "error",msg:"" })
if(global._ERRORMAG){
script_info({ msg: global._ERRORMAG });
var job_attrs = db.query("",function(q){
return q.selectValue({
table:'pdm_job',
field_format:{job_attrs:'json'},
field:'job_attrs',
where:{id : JobId}
})
});
if (!job_attrs ) { job_attrs = {}}
job_attrs.readin_result = global._ERRORMAG
db.query("",function(q){
return q.updateRow({
table:'pdm_job',
data:{job_attrs:job_attrs},
update_policy:{attr_data:'json_merge'},
where:{id : JobId}
})
});
}
IKM.crud("deleteRow", {
table: "pdm_job_jobattr",
where:{job_id:JobId, attr_name:"cam_workflow_info"},
})
IKM.save_job_info({jobid:JobId, jobinfohash:{cam_workflow_info:"err"}})
IKM.msg(_.join(GEN.STATUS, "\n"))
IKM.msg(e)
Status = 'error';
resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]});
return (mode === "aimdfm") ? {status: Status, result_data: resultData} : "Error";
}
function delSameJob(props){
var job = props.job
var delSame = props.delSame
console.log("======================>delsame:"+ delSame);
if(GEN.isJobExists({job:job})){
if(/^yes$/ig.test(delSame)){
if(GEN.isJobOpen({job:job})){ GEN.closeJob({job:job}) }
GEN.deleteJob({job:job})
} else {
return "job "+ job+ " exist"
}
}
}
function analyJobFiles(props){
var files = props.jobFiles;
var config = props.config;
var job = props.job;
var custCfg = props.custCfg;
var rules = custCfg.rules;
var paramsFile = files.filter(function(file){return /nc_param|ncdrill/ig.test(file.baseName)})
var tmp_hash = {}
paramsFile.forEach(function(file){
tmp_hash[file.baseName] = (function(){
var tmparr = fs.readFile(file.path).split("\n").filter(function(v){return /^\s?\S+\s+\S/ig.test(v)}).filter(function(v){return !/\(/.test(v)})
var tmp = {}
tmparr.map(function(v){
var arr = v.split(/\b\s+\b/)
tmp[arr[0].replace(/-/ig,"_").trim()] = arr[1]
})
return tmp
})()
})
var fileInfo = files.reduce(function(a,file){
try {
rules.forEach(function(item){
if(item.valid({file:file, job:job})){
var format = config.formats[item.format]
var format1;
if(item.format_params){
format1 = item.format_params({params:tmp_hash})
}
if(format1){
throw {file:file,type:item.type,format:format1}
}else{
throw {file:file,type:item.type,format:format}
}
}
})
} catch (info) {
a.push(info)
}
return a
},[])
var odbfiles = fileInfo.filter(function(item){return /odb/ig.test(item.type)})
if(odbfiles.length == 0){
return {
type: "Gerber",
data: fileInfo
}
} else {
return {
type: "ODB",
data: odbfiles
}
}
}
function importJob(props,delSameJob){
var name = props.name
if (GEN.isJobExists({ job: name })) {
if (/^yes$/ig.test(delSameJob)) {
if(GEN.isJobOpen({ job: name })){ GEN.closeJob({ job: name }); }
GEN.deleteJob({ job: name });
}
else {
return "job "+name+" exist";
}
}
props.path = changePath(props.path)
// 如果path的tgz不符合规范 纠正一下
GEN.importJob(props);
}
function getStepType(step){
if(/pcs|cad|orig|pcb/ig.test(step)){
return "pcs"
}
if(/stp|arr/ig.test(step)){
return "arr"
}
return "pcs"
}
function now(){
var date = new Date()
var time = _.toString(date)
res1 = /\d{4}-\d{2}-\d{2}/.exec(time)
res2 = /\d{2}:\d{2}:\d{2}/.exec(time)
return res1 + " " +res2
}
function reNameStep(job) {
var stepList = GEN.getStepList({job:job})
if(!stepList){return}
var pcs = [];
var arr = [];
stepList.forEach(function(v){
if(v){
if(v==="cad"){
pcs.unshift(v)
} else if(/pcs|cad|orig|pcb/ig.test(v)){
pcs.push(v)
} else if(/stp|arr/ig.test(v)){
arr.push(v)
}
}
})
pcs.forEach(function(v, i){
if (i==0 && v == "cad") {
} else {
GEN.renameStep({job:job,name:v,new_name:'cad' + (i == 0? "" : i+1)})
}
})
arr.forEach(function(v, i){
if (i==0 && v == "stp") {
} else {
GEN.renameStep({job:job,name:v,new_name:'stp' + (i == 0? "" : i+1)})
}
})
}
function script_info(props){ // result_severity progress
if (mode === "aimdfm") {
$.QDfm.updateRow({
table: "pdm_aimdfm_task",
data: props,
where: { id: $.task_id }
});
}
}
function decompression(path, zips, change_files) {
var files = fs.listDir(path)
var zipfiles = files.filter(function(item){
if (/zip/ig.test(item.suffix) || item.suffix == "rar" || item.suffix=="7z") {
inputState.push(item.suffix);
console.log("--->path:" + item.path)
if(zips.indexOf(item.path) < 0){
zips.push(item.path);
//if(item.name.length >= 30 && !/�|\?/.test(item.name)) {
if(/[^\da-zA-Z_]/.test(item.name)){
var tmp_code = new Date().getTime()
var ori_dirname = item.path.replace(/\.(zipx|zip|7z|rar)$/ig, "");
var mvname = "custom" + tmp_code + "." + item.suffix;
// fs.rename(item.path, item.dir + "/" + mvname);
fs.copyFile(item.path,item.dir + "/" + mvname,true);
item.path = item.dir + "/" + mvname;
change_files.push({
ori_dirname: ori_dirname,
dirname: item.path.replace(/\.(zipx|zip|7z|rar)$/ig, ""),
newpath: item.path // 后续删除
})
zips.push(item.path);
}
var dir_name = item.path.replace(/\.(zipx|zip|7z|rar)$/ig, "");
autoUn(item.path, dir_name,item.dir);
return true
}
}
// else if(/7z/.test(item.completeSuffix)){
// inputState.push("7z");
// if(zips.indexOf(item.path) < 0){
// zips.push(item.path);
// var dir_name = item.path.replace(".7z", "");
// autoUn(item.path, dir_name);
// return true
// }
// }
return false
})
if(zipfiles.length) {decompression(path, zips, change_files)}
}
function changePath(path) {
return path.replace(/[^/]+\//ig, function(v){
if(v.length >= 10 && /\s/ig.test(v)) {
v = v.replace(" ", "\\ ");
return v.slice(0,6) + "~1/"
} else {
return v
}
})
}
function autoUn(path, dirname, dir) {
// 解压密码逻辑 先获取 /home/toplinker/samba/unzip_pwd.txt
var pw = "/home/toplinker/samba/unzip_pwd.txt";
var pws = fs.readFile(pw);
var strs = pws.split("\n")
var ret = {};
strs.map(function(v) {
var tmp = v.split(/\s+/);
ret[tmp[0].trim()] = tmp[1].trim()
});
var pwd;
if(ret[Job]){
pwd = ret[Job]
}
if(fs.exists(dir + "/pw.txt")){
pwd = fs.readFile(dir + "/pw.txt");
}
if(/\.rar$/.test(path)){
fs.mkdir(dirname);
if(pwd){
process.exec('/opt/rar/unrar', ['x' , path, dirname, "-o+","-p"+pwd]);
} else {
process.exec('/opt/rar/unrar', ['x' , path, dirname, "-o+"])
}
} else {
if(pwd){
process.exec('/usr/local/lib/p7zip/7za', ['x' , path, "-o"+dirname, "-aoa", "-p"+pwd])
} else {
process.exec('/usr/local/lib/p7zip/7za', ['x' , path, "-o"+dirname, "-aoa"])
}
}
}
function exportInfo(info){
fs.writeFile("/home/toplinker/samba/Test_Scott/tmp", _.toString(info))
}
function changePath2(filePath){
var fileList = fs.listDir(filePath);
var tmp = [];
for(var i = 0;i=0;i--){
var newFileName = tmp[i].fileName.replace(/\s*/g,'');//去除文件名中空格
newFileName = newFileName.replace(/\?/g,'');//去除文件名中?
var newPath = tmp[i].path.replace(/^(.*)\/[^\/]*$/,"$1");
if(tmp[i].path != (newPath+'/'+newFileName)){
// fs.rmdir(newPath+'/'+newFileName)
// fs.rename(newPath+'/'+newFileName, newPath+'/'+newFileName+"_bk");
fs.rename(tmp[i].path,newPath+'/'+newFileName);
}
}
}