0

我正在寻找一个 NodeJS 实现:

reg query "HKEY_CURRENT_USER\Volatile Environment" /s /v CLIENTNAME

递归地在\Volatile Environment注册表中搜索 CLIENTNAME 变量。

现在我的解决方案是:

var Registry = require( 'winreg' ),
    regKey = new Registry( {
        hive: Registry.HKCU,
        key: "\\Volatile Environment\\3\\" // for my use-case, the \\3\\ varies and I need something Dynamic
    } );

regKey.get( Registry.DEFAULT_VALUE, function( err, item ) {

    if ( err ) {
        console.log( "Error get: " );
        console.log( err );
    }
    else {
        console.log( "Success get: " );
        console.dir( item.value );
    }

} );

是否有一些优雅的方法可以使关键路径动态化?

4

1 回答 1

0

作为一个临时解决方案,我编写了这个发出事件的递归函数(我没有将其标记为可接受的答案,因为我肯定期待在WINREG库中更改参数值的行中有一些东西)

因为我只是在学习 NodeJS,所以为了好玩,我用它做了一个组件:

var EventEmitter = require( 'events' ).EventEmitter;

function RegistryDataEvents( env_var_name ) {
    this.events = undefined;
    this.initEvents( env_var_name );
} // cunstruct RegistryDataEvents

RegistryDataEvents.prototype.initEvents = function( env_var_name ) {
    this.events = new EventEmitter();
    var _that = this;
    process.nextTick(
        function() {
            _that.retrieveClientName( 0, false, "", env_var_name );
        }
    );
}; // initEvents

module.exports.RegistryDataEvents = RegistryDataEvents;

RegistryDataEvents.prototype.rerun = function( env_var_name ) {

    this.retrieveClientName( 0, false, "", env_var_name );

}; // rerun

RegistryDataEvents.prototype.retrieveClientName = function( count, 
                                                            found, 
                                                            result, 
                                                            env_var_name ) {
    var _that = this;
    if ( count === 0 ) {
        _that.events.emit( 'start', result );
    }
    if ( found ) {
        _that.events.emit( 'success', result );
        return;
    }
    var key = "\\Volatile Environment\\"+ count +"\\";
    var Registry = require( './registry.js' ),
        regKey = new Registry( {
            hive: Registry.HKCU,
            key: key
        } );

    regKey.get( env_var_name, function( err, item ) {
        if ( err ) {
            // obviously this is a downfall of the module, any suggestions will be appreciated :)
            if ( count > 100 ) {
                _that.events.emit( 'failure', result, err, count );
                return;
            }
            _that.retrieveClientName( ++count, false, "", env_var_name );
        }
        else {
            found = true;
            _that.retrieveClientName( ++count, true, item.value, env_var_name );
            return;
        }
    } );
    return;
}; // retrieveClientName

用法

var RegistryDataEvents = require( './reg_data_evts.js' ).RegistryDataEvents;

// Register the event + listeners
var reg_data_evts = new RegistryDataEvents( "CLIENTNAME" );

// handle listener logic
reg_data_evts.events.on( 'start', function( result ) {
    console.log( "Started " + result );
} );

reg_data_evts.events.on( 'success', function( result ) {
    console.log( "Success: " + result );
} );

reg_data_evts.events.on( 'failure', function( result, err, count ) {
    console.log( "Failure: " + result + " - " + err + " after " + count + " attempts" );
} );

// just to show u can rerun the retrieveClientName method
reg_data_evts.rerun( "CLIENTNAME" );
// just to show u can rerun the retrieveClientName method
reg_data_evts.rerun( "CLIENTNAME" );
于 2016-06-01T13:46:06.363 回答