1

我正在尝试编写一个插件,它使用 nslProcess 在后台运行一些 osascript 命令,基于小部件的点击。我在这里找到了以下插件级别代码,但无法使其正常工作。

player.port.on("star1", function() {

//var args = ['-e','tell application "iTunes"','-e','"stop"','-e','"end tell"' ];

var cmd = '/usr/bin/say';
var args = ['value', 'test'];

var execFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);

execFile.initWithPath(cmd);

    if (execFile.exists()) {
        process.init(execFile);
        process.run(true, args, args.length);
    }


});

我正在使用 Firefox 25。任何帮助将不胜感激,谢谢。

4

1 回答 1

0

对的,这是可能的。您可以通过该chrome模块访问所有XPCOM 。

这是一个完整的例子 ( main.js)

const {Cc, Ci} = require("chrome");

var cmd = '/usr/bin/say';
var args = ['value', 'test'];

var execFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);

execFile.initWithPath(cmd);

if (execFile.exists()) {
    process.init(execFile);
    process.run(true, args, args.length);
}

但是,有一些注意事项nsIProcess

  • 您需要始终提供绝对路径。
  • 您不能直接执行 OSX 应用程序包。通过open(1)或执行捆绑包中的实际可执行文件。
  • nsIProcess不完全是活泼的。它将阻塞 UI 一段时间 ( runAsync) 和更多run,因为它等待进程完成。因此runAsync,尽可能选择并谨慎使用此 API。
于 2013-11-06T03:23:06.887 回答