如何确保node.js child_process.spawn将错误消息写入控制台

时间:2013-09-20 00:38:28

标签: windows node.js

我在运行子进程并将其输出写入控制台时遇到了很多麻烦。在本集中,我正在尝试使用spawn来运行Windows mklink命令。错误是我没有写文件的权限。

我的问题是,错误并没有以任何方式告诉我。

以下内容将You do not have sufficient privilege to perform this operation.打印到控制台:

mklink /D C:\some\path\to\my\intended\link C:\path\to\my\folder

但是在node.js中运行它只会给我Error: spawn ENOENT - 这是一个非常无用的错误消息:

require('child_process').spawn('mklink', 
         ['/D', 'C:\\some\\path\\to\\my\\intended\\link', 
                'C:\\path\\to\\my\\folder'],
         {stdio:'inherit'})

尽管stdio:'inherit',我在控制台上什么也得不到。我也尝试了以下内容:

var x = require('child_process').spawn('mklink', 
         ['/D', 'C:\\some\\path\\to\\my\\intended\\link', 
                'C:\\path\\to\\my\\folder'])
x.stdout.pipe(process.stdout)
x.stderr.pipe(process.stderr)

但没有骰子。根本没有控制台输出。请注意,我使用exec获取控制台输出:

var x = require('child_process')
         .exec('mklink /D C:\\some\\path\\to\\my\\intended\\link C:\\path\\to\\my\\folder')
x.stdout.pipe(process.stdout)
x.stderr.pipe(process.stderr)

这应该不需要任何关于windows mklink如何工作的特殊知识 - 我的问题只是使用node.js spawn进行错误报告。

我在这里做错了什么?这是node.js中的错误吗?

更新:似乎此错误已由节点v0.10.29修复

2 个答案:

答案 0 :(得分:1)

对我来说stdio没有用。

试试这个:

    // Helper function to execute and log out child process
    // TODO: implement a better success/error callback
    var spawnProcess = function(command, args, options, callback) {
        var spawn = require('child_process').spawn;
        var process = spawn(command, args, options),
            err = false;

        process.stdout.on('data', function(data) {
            grunt.log.write(data);
        });

        process.stderr.on('data', function(data) {
            err = true;
            grunt.log.errorlns(data);
        });

        if (typeof callback === 'function') {
            process.on('exit', function() {
                if (!err) {
                    return callback();
                }
            });
        }
    };
    spawnProcess('mklink', ['/D', 'C:\\some\\path\\to\\my\\intended\\link', 'C:\\path\\to\\my\\folder'], {}, done);

答案 1 :(得分:0)

作为解决方法,请尝试以下操作:

require('child_process').spawn('cmd', 
     ['/C', 'mklink', '/D', 'C:\\some\\path\\to\\my\\intended\\link', 
            'C:\\path\\to\\my\\folder'],
     {stdio:'inherit'})