Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在nodejs中解析包含环境变量的路径?_Javascript_Node.js_Environment Variables - Fatal编程技术网

Javascript 如何在nodejs中解析包含环境变量的路径?

Javascript 如何在nodejs中解析包含环境变量的路径?,javascript,node.js,environment-variables,Javascript,Node.js,Environment Variables,我想运行一个可执行文件,它的路径包含一个环境变量,例如,如果我想运行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('chr

我想运行一个可执行文件,它的路径包含一个环境变量,例如,如果我想运行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}).

是否有一个包可以用来实现这一点?

您可以使用正则表达式将变量替换为以下相关属性:


在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);

  });
};
import*作为“child_进程”的cp;
//mapPaths使用环境变量获取路径/字符串数组,并展开每个路径/字符串
导出常量映射路径=(searchRoots:Array,cb:Function)=>{
const mappedrots=searchRoots.map(函数(v){
返回`echo'${v}`;
});
const k=cp.spawn('bash');
k、 stdin.end(mappedrots.join(“;”);
常量结果:数组=[];
k、 标准管道(工艺标准);
k、 stdout.on('data',(d:string)=>{
结果:推挤(d);
});
k、 一次('错误',(e)=>{
日志错误(e.stack | | e);
cb(e);
});
k、 一旦('退出',代码=>{
const pths=results.map((d)=>{
返回字符串(d | |').trim();
})
.过滤器(布尔值);
cb(代码,pths);
});
};

在Denys Séguret的优秀答案中添加一个对打字脚本友好的补充:

let replaced = str.replace(/%([^%]+)%/g, (original, matched) => {
      const r = Process.env[matched]
      return r ? r : ''
})

下面是一个通用的帮助函数:

/**
*用实际值替换所有环境变量。
*使用“%”保留完整的非环境变量
*@param{string}filePath输入文件路径的百分比
*@return{string}解析的文件路径
*/
函数resolveWindowsEnvironmentVariables(文件路径){
如果(!filePath | | typeof(filePath)!='string'){
返回“”;
}
/**
*@param{string},百分比为“%USERNAME%”
*@param{string}不带outpercents'USERNAME'
*@return{string}
*/
函数替换环境变量(withPercents,withoutPercents){
let found=process.env[withoutPercents];
//“C:\Users\%USERNAME%\Desktop\%asdf%”=>C:\Users\bob\Desktop\%asdf%”
返回找到的| |带百分比;
}
//“C:\Users\%USERNAME%\Desktop\%PROCESSOR\u ARCHITECTURE%”=>“C:\Users\bob\Desktop\AMD64”
filePath=filePath.replace(/%([^%]+)%/g,replaceEnvironmentVariable);
返回文件路径;
}
  • 可以从任何地方呼叫
  • 如果首先执行基本类型检查,则可能需要更改第一个
    if
    块中默认返回的内容
  • 函数的命名方式可以解释它们的功能
  • 变量的命名方式可以解释它们是什么
  • 添加的评论明确了可能出现的结果
  • 处理以百分比包装的非环境变量,因为Windows文件系统允许将文件夹命名为
    %asdf%
  • JSDoc块用于在某些编辑器中进行自动文档编制、类型检查和自动完成
  • 根据您的需要,您可能还希望使用
    if(process.platform!=='win32'){}

我意识到问题是询问Windows环境变量,但我修改了@Denys Séguret的答案,以处理bash的
${MY_VAR}
$MY_VAR
样式格式,因为我认为它可能对其他来到这里的人有用

注意:这两个参数是因为有两个基于格式变化的分组

str.replace(/\$([A-Z_]+[A-Z0-9_]*)|\${([A-Z0-9_]*)}/ig, (_, a, b) => process.env[a || b])

好的,我可以用这个,我只是觉得它有一些内置的util。我知道它很简短,直截了当。但这会导致人们盲目地复制粘贴解决方案,而这些解决方案只在当前才有意义,并且会在此后困扰所有人。请看Jaredcheeda的文章,了解稍后更容易理解的内容。你能精确地说明它是如何更健壮的吗?我想他是指它的健壮性,它将以与bash完全相同的方式扩展内容(因为它是bash做的,但是,它在另一方面不那么健壮,因为您的应用程序现在依赖于bash的存在。+1的可读性和解释性。远比Denys séguret的答案更易于维护。(感知)相比之下,增加的复杂性是完全可以忽略不计的。人们应该更喜欢这句话,而不是一句话,因为这句话有太多的特殊性,在你写了之后就毫无意义了。我希望我能为此给你一笔赏金,为我节省了很多时间!
str.replace(/\$([A-Z_]+[A-Z0-9_]*)|\${([A-Z0-9_]*)}/ig, (_, a, b) => process.env[a || b])