我正在尝试运行一个小程序将一些 .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/