我将从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();
}
可能是什么问题?
最佳答案
好的,因此我能够解决此问题。
指定为/
值的路径后的--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
)