Firefox 从附加组件而不是本地路径打开文件

Firefox open file from add-on instead of local path

我正在创建 Firefox 附加组件,其中 运行 一个特定的 .bat 文件。

这是我使用的代码。

main.js

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

var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
file.initWithPath("C:\Users\Madhawa.se\Desktop\snap\shoot.bat"); // i want to open this bat from xpi .for example from data directory
var args="this is an argument  ";
var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
process.init(file);
process.run(false, args, args.length);

它工作正常,但我想从加载项内部打开 shoot.bat 文件,这样我就可以轻松地将加载项作为单个 xpi.

分发

如何从附加组件打开这个 bat 文件,例如,我可以将 shoot.bat 文件放入我的 Firefox 附加组件的 data directory 中,但如何打开它?这不可能吗?有没有更好的方法来实现这个目标?

虽然从您的附加 XPI 中读取数据相当容易,但您不能以这种方式创建进程。 Windows 通常,尤其是 windows 可执行加载程序,不知道如何读取 .xpi.

执行批处理文件或其内容,可以通过在执行之前将批处理文件写入磁盘上的某个位置,或者将 cmd /K 兼容的参数字符串与该批处理文件的内容组装起来来实现

首先读取批处理文件可以实现例如通过将 request 模块与 data.url().

一起使用
const {Request} = require("sdk/request");
const {data} = require("sdk/self");

Request({url: data.url("shoot.bat"), onComplete: function(response) {
  var batch = response.text;
  // ...
}});

当然,将批处理文件的内容放在 Javascript 源本身中可能会更容易,从而完全避免 Request 东西。

现在,您可以将批处理文件内容写入文件,例如使用 io/file and/or OS.File(目前首选后者,主要是因为 io/file 不是异步的),然后执行

或者您可以适当地格式化要用于 cmd /K 的内容。