我将从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

10-06 13:18