7

'execがファイルのcatダンプをキャプチャする子プロセスであるNodeJSスクリプトがあります。

var exec = require('child_process').exec;
var result = '';
var child = exec('./scripts/first.sh',function(err, stdout, stderr) {
    result = stdout.split("=");
});

ファイルがない場合は、別のファイルのダンプを取ります。

var result = '';
var child = exec('./scripts/first.sh',function(err, stdout, stderr) {
    result = stdout.split("=");
    if(stdout.indexOf('No such file or directory') != -1){
        var child = exec('./scripts/second.sh', function(err, stdout, stderr) {
            result = stdout.split("=");
    });
});

最後に、結果変数の値をログに記録します。

console.log(result);

ファイルには、以下のようなデータが含まれます。

line_1 = 7888
line_2 = 8998
line_3 = 9090
line_4 = 9097

line_1とline_3の値を解析して抽出する必要がありますか?

結果変数には値が表示されません。私のアイデアは、文字列変数でstdoutデータを取得し、検索メカニズムを使用することでした。

JS / NodeJSの経験が少ないので、アプローチはわかりませんが。

==編集==

私が書いた関数のレプリカを見つけてください。

var exec = require('child_process').exec;

function getdetail() {
        var result = '';
        var child = exec('./scripts/first.sh', function(err, stdout, stderr) {
                if(stdout.indexOf('No such file or directory') != -1){
                        var child = exec('./scripts/second.sh',function(err, stdout, stderr) {
                        result = stdout.toString().split("=");
                        console.log(result);
                        });
                }
                else
                {
                        result = stdout.toString().split("=");
                        console.log(result);
                }
        });
}

stdoutストリームオブジェクトのtostring()でうまくいきましたが、以下のようにコンソールログを取得します。

[ 'spawn ssh -o UserKnownHostsFile',
  '/dev/null -o StrictHostKeyChecking',
  'no user@www.mybox.com cat ver.txt\r\nWarning: Permanently added \'www.mybox.com,XX.XX.XX.XX\' (RSA) to the list of known hosts.\r\r\nuser@www.mybox.com\'s password: \r\line_1',
  '9400\r\nline_2',
  '3508\r\nline_3',
  '77f3\r\nline_4',
  '/tmp\r\nline_5',
  '/tmp/ramdisk/\r\nline_5',
  '77f3\r\n' ]

line_1とline_3の値を抽出するにはどうすればよいですか?

4

1 に答える 1

12

exec非同期です。したがって、次のように書くと、次のようになります。

var result = '';
var child = exec('...'), function() { result = 'abc'; } );
console.log(result);

execがコールバックに戻って新しい値を入力する前に実行される可能性があり、頻繁に実行されるため、空になる可能性がありますresultconsole.log(result)

これを修正するには、execのコールバック関数で結果を非同期的に処理する必要があります。

また、エラーをチェックする方法が可能な限り最善であるかどうかもわかりません。「そのようなファイルまたはディレクトリがない」かどうかをチェックする代わりに、errnull以外の値があるかどうかをテストするだけで済みます。

if(err) {

これをすべてまとめると、次のコードになります。

var exec = require('child_process').exec;

var result = '';
var processResult = function(stdout) {
    var result = stdout.split("=");
    console.log(result);
};

var child = exec('./scripts/first.sh',function(err, stdout, stderr) {
    if(err) {
        var child = exec('./scripts/second.sh', function(err, stdout, stderr) {                         
            processResult(stdout);
        });
    } else {            
        processResult(stdout);
    }
});

stdoutデータをさらに処理する必要がある場合は、データを反復処理して、「key=value」を含む文字列の発生の可能性をすべて見つける必要があります。大まかなアイデアは次のとおりです。

var processResult = function(stdout) {  
    var lines = stdout.toString().split('\n');
    var results = new Array();
    lines.forEach(function(line) {
        var parts = line.split('=');
        results[parts[0]] = parts[1];
    });

    console.log(results);
};

これで始められることを願っています。

于 2012-10-18T13:38:22.643 に答える