nsIProcess with arg with quote未被创建

nsIProcess with arg with quote not getting created

本文关键字:with 创建 quote arg nsIProcess      更新时间:2023-09-26

我正在尝试运行一个小程序来转换一些。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 ' office.exe" -headless -convert-to "html: html (StarWriter)"-outdir C:'Temp C:'Temp 'test.odt

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