[英]How to resolve a path that includes an environment variable, in nodejs?
我想运行一个可执行文件并且它的路径包含一个环境变量,例如如果我想运行 chrome.exe 我想写这样的东西
var spawn = require('child_process').spawn;
spawn('chrome',[], {cwd: '%LOCALAPPDATA%\\Google\\Chrome\\Application', env: process.env})
代替
var spawn = require('child_process').spawn;
spawn('chrome',[], {cwd: 'C:\\Users\myuser\\AppData\\Local\\Google\\Chrome\\Application', env: process.env}).
我可以使用 package 来实现这一目标吗?
您可以使用正则表达式将您的变量替换为process.env
的相关属性:
let str = '%LOCALAPPDATA%\\Google\\Chrome\\Application'
let replaced = str.replace(/%([^%]+)%/g, (_,n) => process.env[n])
当它是一个单行时,我不认为需要一个包。
我意识到这个问题要求 Windows 环境变量,但我修改了@Denys Séguret 的答案以处理 bash 的${MY_VAR}
和$MY_VAR
样式格式,因为我认为它可能对来到这里的其他人有用。
注意:两个 arguments 是因为有两个基于格式变化的分组。
str.replace(/\$([A-Z_]+[A-Z0-9_]*)|\${([A-Z0-9_]*)}/ig, (_, a, b) => process.env[a || b])
在DenysSéguret的优秀答案中添加了TypeScript友好的补充:
let replaced = str.replace(/%([^%]+)%/g, (original, matched) => {
const r = Process.env[matched]
return r ? r : ''
})
在Linux / MacOS上,我产生了一个用env变量解析路径的进程,是安全的 - 让bash为你做的工作。 显然性能较差,但更强大。 看起来像这样:
import * as cp from 'child_process';
// mapPaths takes an array of paths/strings with env vars, and expands each one
export const mapPaths = (searchRoots: Array<string>, cb: Function) => {
const mappedRoots = searchRoots.map(function (v) {
return `echo "${v}"`;
});
const k = cp.spawn('bash');
k.stdin.end(mappedRoots.join(';'));
const results: Array<string> = [];
k.stderr.pipe(process.stderr);
k.stdout.on('data', (d: string) => {
results.push(d);
});
k.once('error', (e) => {
log.error(e.stack || e);
cb(e);
});
k.once('exit', code => {
const pths = results.map((d) => {
return String(d || '').trim();
})
.filter(Boolean);
cb(code, pths);
});
};
这是一个通用的辅助函数:
/**
* Replaces all environment variables with their actual value.
* Keeps intact non-environment variables using '%'
* @param {string} filePath The input file path with percents
* @return {string} The resolved file path
*/
function resolveWindowsEnvironmentVariables (filePath) {
if (!filePath || typeof(filePath) !== 'string') {
return '';
}
/**
* @param {string} withPercents '%USERNAME%'
* @param {string} withoutPercents 'USERNAME'
* @return {string}
*/
function replaceEnvironmentVariable (withPercents, withoutPercents) {
let found = process.env[withoutPercents];
// 'C:\Users\%USERNAME%\Desktop\%asdf%' => 'C:\Users\bob\Desktop\%asdf%'
return found || withPercents;
}
// 'C:\Users\%USERNAME%\Desktop\%PROCESSOR_ARCHITECTURE%' => 'C:\Users\bob\Desktop\AMD64'
filePath = filePath.replace(/%([^%]+)%/g, replaceEnvironmentVariable);
return filePath;
}
if
块中默认返回的内容 %asdf%
if (process.platform !== 'win32') {}
这些答案很疯狂。 就可以使用path
:
const folder = require('path').join(
process.env.LOCALAPPDATA,
'Google/Chrome/Application',
);
console.log(folder); // C:\Users\MyName\AppData\Local\Google\Chrome\Application
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.