我试图从节点打开文件,如果我尝试使用此代码打开它们,那么它可以正常工作
exec("excelfile.xls", {cwd: "c:\\"}, function(error, stdout, stderror){
if(error)console.log("Error: \""+stderror+"\"");
});
但是,我试图让程序适应作为服务运行,并且我可以让程序在作为服务运行时打开文件的唯一方法是使用spawn而不是exec:
var child = spawn("explorer.exe",[], {env: process.env, cwd: "C:\\Windows"});
child.unref();
问题是如果我尝试生成一些不可执行的东西,那么我得到ENOENT错误,因为节点不知道用于打开文件的程序:
var child = spawn("excelfile.xls",[], {env: process.env, cwd: "c:\\"});
child.unref();
我正在寻找的是一种从Windows(以及该程序的路径)中提取正确程序以打开给定文件类型的方法。
我尝试使用winreg从注册表中获取信息,但为此我需要查找计算机\ HKEY_CLASSES_ROOT。" fileExtension" \并从"中获取值。 (默认)"字符串值,然后我可以查找计算机\ HKEY_CLASSES_ROOT \"(默认)值" \ shell \ Open \ command \并获取打开文件所需的字符串。
不幸的是,winreg似乎没有给你(默认)字符串的值。
var Winreg = require('winreg');
var regKey = new Winreg({
hive: Winreg.HKCR,
key : "\\.xls"
})
regKey.values(function (err, items) {
if (err)
console.log('ERROR: '+err);
else
for (var i in items){
console.log('ITEM: '+items[i].name+'\t'+items[i].type+'\t'+items[i].value);
}
});
输出
ITEM:内容类型REG_SZ application / vnd.ms-excel
预期输出
ITEM :(默认)类型REG_SZ Excel.Sheet.8
项目:内容类型REG_SZ application / vnd.ms-excel
因此,如果有人可以使用child_process.spawn()打开一个非可执行文件的方法 或者给我一种方法来提取正确程序的路径,根据它的扩展打开一个文件我会非常感激。
答案 0 :(得分:0)
您可以尝试使用START
命令。
var child = spawn("cmd.exe", ["/c", "start", "excelfile.xls"], {env: process.env, cwd: "c:\\"});
child.unref();
答案 1 :(得分:0)
我的完整代码:
var EventLogger = require('node-windows').EventLogger;
var log = new EventLogger('File Launcher starting');
var exec = require('child_process').exec;
var userName = "mike";
var password= "mikesPassword";
var fullPath= "C:\folder\file.xls";
exec("PSExec.exe -accepteula -h -d -u "+userName+" -p "+password+" -i 1 C:\\WINDOWS\\SYSTEM32\\CMD.EXE /c start \"\" \""+fullPath+"\"",{cwd: process.cwd}, function(error, stdout, stderror) {
if(error){
log.error(stderror.replace('\n','').replace('\r',''));
}
if(stdout){
log.info(stdout.replace('\n','').replace('\r',''));
}
});