【问题标题】:Is it possible to permanently set environment variables?是否可以永久设置环境变量?
【发布时间】:2017-02-28 21:53:16
【问题描述】:

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

【问题讨论】:

  • “永久”影响其他外壳并在重新启动后幸存下来?这是非常平台特定的,甚至取决于人使用的外壳。我不知道有一个库可以做到这一点,这甚至不是一个好主意,因为如果你开始将环境变量干扰到他们的 shell 配置中,人们有权感到不安。

标签: node.js


【解决方案1】:

可能可以使用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】:

编写一个名为 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}`)
}

第二步

以管理员身份打开控制台窗口并输入以下命令。

否则 »

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

  • cd D:\Codes\JS

  • node setEnv.js

现在,看看下面的图片,就我而言。

之前

之后

参考文献

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

【讨论】:

    【解决方案3】:

    我为 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
    

    【讨论】:

      猜你喜欢
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-25
      • 2014-04-23
      • 2019-09-03
      • 2021-12-19
      • 1970-01-01
      相关资源
      最近更新 更多