2013-08-06 34 views
2

基本上,我只是想在node app上运行rsync命令。shell命令给child_process.spawn(command,[args],[options])node.js

原始rsync的代码是下面的:

rsync -r -t -p -o -g -v --progress --delete -l -H /Users/ken/Library/Application Support/Sublime Text 3/Packages /Users/ken/Google Drive/__config-GD/ST3 

首先,我试图

child_process.exec(command, [options], callback) 

但是,由于rsync的输出是长,缓冲超出。

所以,我想

child_process.spawn(command, [args], [options]) 

,而是和stream.pipe出来。

var spawn = require('child_process') 
     .spawn; 
var ps = spawn(command1, args1) 
     .stdout 
     .pipe(process.stdout); 

尽管这种方式可以按预期工作,但将原始rsync命令拆分为spawn格式太难了。 (我复制并粘贴gRsync工具的命令)

有没有聪明的方法来做到这一点?

谢谢。

+0

好的,我找到了答案,稍后发帖 –

回答

1

好的,这里是黑客;

在终端外壳和javascript /节点中将MacDirectory的空白空间变得非常棘手,所以我放置了[email protected]_而不是\('\'+ whiteSpace)。

(function() 
{ 
    'use strict'; 
    //,,,,,,,,,,,,,, 

    var parseShCmd = function(cmd) 
    { 
     var cmdA = cmd.split(/ /); 
     console.log(cmdA); 
     var cmd1 = cmdA[0]; 
     var args1 = []; 
     cmdA.map(function(s, i) 
     { 
      if (i === 0) 
      { 
       console.log('-------------------'); //do nothing 
      } 
      else 
      { 
       args1[i - 1] = cmdA[i].replace(/[email protected]_/g, ' '); 
      } 
     }); 
     return [cmd1, args1]; 
    }; 

    var shCmd = 'rsync' + 
     ' -r -t -p -o -g -v --progress --delete -l -H ' + 
     '/Users/ken/Library/[email protected]_Support/[email protected][email protected]_3/Packages ' + 
     '/Users/ken/[email protected]_Drive/__config-GD/ST3'; 
    //var shCmd = 'ls -la'; 
    var cmd1 = parseShCmd(shCmd); 
    console.log(cmd1[0]); 
    console.log(cmd1[1]); 
    console.log('=================='); 
    var spawn = require('child_process') 
     .spawn; 
    var ps = spawn(cmd1[0], cmd1[1]) 
     .stdout 
     .pipe(process.stdout); 

    //,,,,,,,,,,,,,,,, 
}());