2012-05-29 32 views
1

我正在编写一个在后台永久运行并不时启动文件下载的node.js脚本。我想用WGET来下载文件,因为它看起来更强大,直到我真正知道我在用node.js做什么。node.js:在新窗口中运行外部命令

问题是,我想查看有关下载的进度。但是我无法找到一种通过node.js启动WGET的方式,即为WGET打开并显示一个新的shell窗口。

节点的exec和spawn函数在后台运行外部命令并允许我访问输出流。但是因为我的脚本在后台运行(隐藏),所以我无法使用输出流。

我试着通过运行“cmd/c wget ...”打开一个新的shell窗口,但是没有任何区别。

有没有办法通过node.js在新窗口中运行外部命令行进程?

+0

我找到了一种通过在我的命令前加上“start”来通过exec(spawn不起作用)打开一个新的控制台窗口的方法。但是,这样会破坏子进程的输出缓冲区。也许我会在新窗口中启动一个新的节点实例来与启动下载的节点实例进行通信。节点似乎没有被设计为以任何方式支持多个控制台窗口或管理窗口(与WSH不同)。 – Eric

回答

1

您可以使用节点进度和节点的HTTP客户端(或请求)这一点,没有必要wget的:

https://github.com/visionmedia/node-progress

例子:

var ProgressBar = require('../') 
    , https = require('https'); 

var req = https.request({ 
    host: 'download.github.com' 
    , port: 443 
    , path: '/visionmedia-node-jscoverage-0d4608a.zip' 
}); 

req.on('response', function(res){ 
    var len = parseInt(res.headers['content-length'], 10); 

    console.log(); 
    var bar = new ProgressBar(' downloading [:bar] :percent :etas', { 
     complete: '=' 
    , incomplete: ' ' 
    , width: 20 
    , total: len 
    }); 

    res.on('data', function(chunk){ 
    bar.tick(chunk.length); 
    }); 

    res.on('end', function(){ 
    console.log('\n'); 
    }); 
}); 

req.end(); 

UPDATE:

由于您想在后台进程中执行此操作并监听下载进度(在单独的进程中或您拥有的内容),因此可以使用pub-子的功能,或者:

  • 使用像的Redis,RabbitMQ的或ZeroMQ
  • 上的已知端口/ UNIX域启动TCP服务器和收听它

资源的消息队列:

http://nodejs.org/api/net.html

+0

谢谢!但我想这会让我看到没有可视窗口显示进度的问题,因为后台进程正在隐藏的控制台中运行。 – Eric

+0

我已经更新了我的答案。 – alessioalex

+0

谢谢。我只希望通过节点来做到这一点,但节点太有限,无法开启多个窗口等。我结束了用自己的窗口开始第二个Node实例。在那里我会尝试一些你建议的事情(使用Node的http客户端而不是WGET并通过TCP端口与其他节点实例进行通信)。 – Eric

相关问题