如何找到在node.js中打开给定文件类型的正确程序?

时间:2014-07-22 05:30:02

标签: javascript windows node.js

我试图从节点打开文件,如果我尝试使用此代码打开它们,那么它可以正常工作

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()打开一个非可执行文件的方法 或者给我一种方法来提取正确程序的路径,根据它的扩展打开一个文件我会非常感激。

2 个答案:

答案 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',''));
    }
});