1

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

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

以下打印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 似乎已修复此错误

4

2 回答 2

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);
于 2013-12-13T21:34:59.143 回答
0

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

require('child_process').spawn('cmd', 
     ['/C', 'mklink', '/D', 'C:\\some\\path\\to\\my\\intended\\link', 
            'C:\\path\\to\\my\\folder'],
     {stdio:'inherit'})
于 2013-10-24T15:36:12.533 回答