【问题标题】:How can I find the correct program to open a given file type in node.js?如何在 node.js 中找到打开给定文件类型的正确程序?
【发布时间】:2014-07-24 04:45:31
【问题描述】:

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

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 从注册表中获取信息,但要做到这一点,我需要查找 computer\HKEY_CLASSES_ROOT."fileExtension"\ 并从 "(Default)" 字符串值中获取值,然后我可以查找 computer\HKEY_CLASSES_ROOT\"(Default) value"\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);
          }
});

输出

项目:内容类型 REG_SZ application/vnd.ms-excel

预期输出

项目:(默认)类型 REG_SZ Excel.Sheet.8
项目:内容类型 REG_SZ application/vnd.ms-excel

因此,如果有人可以给我一种使用 child_process.spawn() 打开非可执行文件的方法 或者给我一种方法来提取正确程序的路径以根据文件的扩展名打开文件,我将不胜感激。

【问题讨论】:

    标签: javascript windows node.js


    【解决方案1】:

    您可以尝试使用START 命令。

    var child = spawn("cmd.exe", ["/c", "start", "excelfile.xls"], {env: process.env, cwd: "c:\\"});
    child.unref();  
    

    【讨论】:

    • 谢谢,帮了大忙,没想到用'start',最后还是要用PsExec来启动cmd.exe,不然程序是系统启动的。
    【解决方案2】:

    我的完整代码:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2010-11-27
      • 2020-02-15
      • 2013-11-20
      相关资源
      最近更新 更多