javascript - nsIProcess with arg with quote not getting created

标签 javascript firefox-addon

我正在尝试运行一个小程序将一些 .doc Word 文件(使用 LibreOffice)转换为 HTML。当我在命令行上运行它时,它可以工作,但不能通过 nsIProcess:

var Cc = Components.classes;
var Ci = Components.interfaces;

var sofficePath = ('C:\\Program Files (x86)\\LibreOffice 4.0\\program\\soffice.exe').replace(/"/g, '');
var path = 'C:\\Users\\Brett\\AppData\\Local\\Temp\\brl-downloader6.doc';
function createProcess (path, args) {
    var aNsIFile = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile);
    aNsIFile.initWithPath(path);

    var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
    process.init(aNsIFile);
    process.runAsync(args, args.length, null);
}
createProcess(sofficePath, [
    '--headless', '-convert-to', 'html:"HTML (StarWriter)"', path.replace(/"/g, '')
]);

我认为它与 html:"HTML (StarWriter)" 参数中的引号有关,但我不确定如何绕过它。

我也试过这个没有效果(单引号或双引号给出来自 LibreOffice 的错误,以下内容被忽略但没有成功转换文件):

'--headless -convert-to html:"""HTML (StarWriter)""" ' + path.replace(/"/g, '')

出了什么问题?

最佳答案

nsIProcess (Windows) 将“转义”参数,即:

  • 如果参数包含空格,则将其包裹在 " 引号中。
  • 如果参数包含任何 \ 退格键和/或 " 引号,则使用另一个 \ 转义它们。

您实际上是在对 html:"HTML (StarWriter)" 字符串进行双重转义。只需使用 html:HTML (StarWriter)

我遇到的另一个问题是,我的 Libreoffice (4.2) 副本实际上会将文件写入当前工作目录,如果是 Firefox,通常是 C:\Program Files (x86)\Mozilla Firefox 且不可写。所以最好还提供一个 -outdir

这对我来说在 Scratchpad 中有效(请注意,我更改了您代码中的路径):

var Cc = Components.classes;
var Ci = Components.interfaces;

var sofficePath = ('C:\\Program Files (x86)\\LibreOffice 4\\program\\soffice.exe').replace(/"/g, '');
var path = 'C:\\Temp\\test.odt';
function createProcess (path, args) {
    var aNsIFile = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile);
    aNsIFile.initWithPath(path);

    var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
    process.init(aNsIFile);
    process.runAsync(args, args.length, null);
}
createProcess(sofficePath, [
    '-headless', '-convert-to', 'html:HTML (StarWriter)', '-outdir', 'C:\\Temp', path.replace(/"/g, '')
]);

生成此命令行(在 Process Monitor 中查看):

"C:\Program Files (x86)\LibreOffice 4\program\soffice.exe" -headless -convert-to "html:HTML (StarWriter)" -outdir C:\Temp C:\temp\test.odt

无论如何,HTML (StarWriter) 过滤器实际上并不是必需的,只是 html 对我来说很好用(实际上产生相同的输出)。

关于javascript - nsIProcess with arg with quote not getting created,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24301707/

相关文章:

javascript - 如何让机器人响应 channel 提及?

javascript - 为什么它打印最后一个元素

javascript - 如何在 Firefox Addon 开发中使用 RxJs?

javascript - 如何将对一个对象的所有引用指向另一个对象?

javascript - Firefox - 显示来自扩展程序/插件的网络通知

javascript - 如何让侧边栏执行主文档中的 javascript 代码?

javascript - 未处理的拒绝(错误): Given action returned undefined React JS

javascript - 在悬停时创建背景

javascript - 使用 Twitter/typeahead.js 在 SELECT 查询中合并 SQL LIKE

firefox-addon - 像素完美( Firebug 插件)替代品