我需要一种永久设置环境变量的方法。我现在可以逃避在Windows中只有这项工作,但理想情况下我想要一个与操作系统无关的解决方案。据我所知,Node只会为当前进程/子进程设置var。我想要的甚至可能吗?
答案 0 :(得分:1)
编写一个名为 setEnv.js 的文件,并将以下代码粘贴到其中。
将文件保存在系统中的某个位置,例如在D:\Codes\JS
中。
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
答案 1 :(得分:0)
可能会使用setx
和export
,但不确定所需的含义/特权(我认为在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