是否可以永久设置环境变量?

时间:2017-02-28 21:53:17

标签: node.js

我需要一种永久设置环境变量的方法。我现在可以逃避在Windows中只有这项工作,但理想情况下我想要一个与操作系统无关的解决方案。据我所知,Node只会为当前进程/子进程设置var。我想要的甚至可能吗?

3 个答案:

答案 0 :(得分:1)

编写一个名为 setEnv.js 的文件,并将以下代码粘贴到其中。

将文件保存在系统中的某个位置,例如在D:\Codes\JS中。

步骤1

const {spawnSync} = require("child_process");

// setx  -m  MyDownloads  H:\temp\downloads
var result = spawnSync('setx', ['-m', 'MyDownloads', 'H:\\temp\\downloads'])

// STDOUT
var stdOut = result.stdout.toString();
console.log(stdOut)

// STDERR
var stdErr =  result.stderr.toString();

if(stdErr === '') {
    console.log('Successfully set environment variable')
} else {
    console.log(`ERROR: ${stderr}`)
}

步骤2

以管理员身份打开控制台窗口,然后键入以下命令。

  

否则»

     

错误:对注册表路径的访问被拒绝。

  • cd D:\Codes\JS

  • node setEnv.js

现在,以我为例,看看下面的图像。

之前

enter image description here

之后

enter image description here

参考文献

Execute a command line binary with Node.js

SETX command: error: Access to the registry path is denied

https://www.codejava.net/java-core/how-to-set-environment-variables-for-java-using-command-line

答案 1 :(得分:0)

可能会使用setxexport,但不确定所需的含义/特权(我认为在Windows中需要UAC颠簸,而在linux中你需要sudo) 。这是一个最好的猜测:

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

// Add FOO to global environment with value BAR
//   setEnv('FOO', 'BAR', callback)
// Append /foo/bar to PATH
//   setEnv('PATH', '+=;/foo/bar', callback)
function setEnv(name, value, cb) {
  if (!name) throw new Error('name required.');
  if (typeof value === 'undefined') throw new Error('value required.');

  var cmd;
  if (value.indexOf('+=') === 0) value = process.env[name] + value.substring(2);
  value = value.indexOf(' ') > -1 ? `"${value}"` : value;

  switch (process.platform) {
    case 'linux': cmd = `export ${name}=${value}`; break;
    case 'win32': cmd = `setx ${name} ${value} /m"; break;
    default: throw new Error('unsupported platform.'); break;
  }

  exec(cmd, cb);
}

我应该提到这真的不理想;我建议将它们定义为执行任务的一部分,或者使用类似dotenv的内容。

答案 2 :(得分:0)

我为 mac 和 windows 使用了一个通用脚本,如下所示:

#!/bin/node

const { exec } = require("child_process");
const currentOs = require("./getOs");

const os = currentOs();

//==========================================================================
function changeMinNodeVersion() {
    console.log("\nChanging yargs min node version...");

    const minNodeVersion = String(process.versions.node).split('.')[0];
    const yargsVariable = `YARGS_MIN_NODE_VERSION=${minNodeVersion}`;
    const command = `${os === 'darwin' ? `export ${yargsVariable}` : `set ${yargsVariable}`}`;

    console.log(`Excecuting ${command}`);
    
    exec(command, (error, stdout, stderr) => {
        if (error) {
            console.log(`\nFailed to change min node version: ${error.message}`);
            return;
        }
        if (stderr) {
            console.log(`\nFailed to change min node version: ${stderr}`);
            return;
        }

        console.log(`\nVersion changed to ${minNodeVersion}`);
    });
}

//=========================================================================
changeMinNodeVersion();

所以我只是使用:

node ./scriptName.js