我将从Java应用程序内部启动WebTorrent-CLI作为一个单独的过程。我正在使用zt-exec来管理流程。使用以下命令启动WebTorrent时,应该在下载给定索引(值--select)的文件后退出。
"D:\downloadmanager\node\webtorrent.cmd" download "magnet:?xt=urn:btih:08ada5a7a6183aae1e09d831df6748d566095a10&dn=Sintel" --select 0 --out "D://nf/"
按预期,当使用上面的命令从命令行启动第0个文件时,webtorrent-cli确实退出。但是,当我在Java应用程序中尝试相同操作时,它会完全忽略--select
选项,并继续在torrent中下载其他文件。
基本上,当从Java作为进程启动时,webtorrent会忽略所有设置的选项(--select
,--out
或其他任何选项)。我应该提到该库没有任何问题,因为最近我尝试用commons-exec替换它,但没有解决任何问题。另外,为了确保在启动过程时传递了正确的命令,我在调用executor.start()
之前立即打印了该命令。上面的命令是从过程开始之前从打印命令获取的输出中复制的。
该过程是这样开始的:
@Override
public synchronized void start() throws IOException {
if (mWasDownloadStarted || mWasDownloadFinished) return;
mExec.getCommand().listIterator().forEachRemaining(s -> {
System.out.print(s + " ");
});
mExec.start();
setProcessId();
mWasDownloadStarted = true;
mWasDownloadStopped = false;
}
这是准备命令的方式:
private String buildCommand() {
List <String> command = new ArrayList<>();
command.add("\"" + mManager.mWTLocation + "\"");
command.add("download");
command.add("\"" + mManager.mMagnetUrl + "\"");
if (mManager.mFileIndex >= 0) {
command.add("--select " + mManager.mFileIndex);
}
if (mManager.mSaveTo != null) {
command.add("--out \"" + mManager.mSaveTo + "\"");
}
mManager.mExec.command(command);
String cmdStr = "";
for (String s : command) {
cmdStr = cmdStr.concat(s + " ");
}
return cmdStr.trim();
}
怎么了?
答案 0 :(得分:0)
好的,所以我能够解决此问题。
指定为/
值的路径之后的--out
字符引起了问题。为了解决这个问题,我在node_modules/webtorrent-cli/bin/cmd.js
中添加了一行以打印传递给webtorrent的参数:
console.log(process.argv)
使用/
,此行的输出类似于以下内容:
[ 'D:\\downloadmanager\\node\\node.exe',
'D:\\downloadmanager\\node\\node_modules\\webtorrent-cli\\bin\\cmd.js',
'download',
'magnet:?xt=urn:btih:08ada5a7a6183aae1e09d831df6748d566095a10&dn=Sintel',
'--select',
'0',
'--out',
'D:\\nf"' ]
请注意"
之后的路径中包含的D:\\nf
。从路径中删除/
时,引号消失,并且webtorrent表现正常。
我怀疑这是webtorrent中的错误。我认为zt-exec(或者也许我)正在做一些愚蠢的事情。
有些无关,但我想我还应该提到,我必须为每个选项的每个值都加上引号,甚至是索引,以摆脱其他讨厌的错误(例如:Error 87, the parameter is incorrect
)