使用Windows PowerShell传递Node.js环境变量

时间:2017-03-26 04:13:44

标签: javascript node.js windows powershell

我正在尝试使用PowerShell将环境变量传递给Node.js:

C:\Users\everton\my-project> $env:MY_VAR = 8000 node index.js

但我在PowerShell中遇到错误:

  

令牌'节点'意外表达或声明

3 个答案:

答案 0 :(得分:13)

首先设置环境变量MY_VAR并按照以下方式运行您的应用:

C:\Users\everton\my-project> $env:MY_VAR="8000" ; node index.js

您可以通过

访问MY_VAR内的环境变量index.js
process.env.MY_VAR

注意:PowerShell不直接支持命令范围的环境变量。以上命令为该PowerShell会话设置环境变量。

答案 1 :(得分:5)

我的回答需要使用Node.js和npm库。

...或者您只是解决编写模糊的WTF语言脚本的痛苦,并使用命令范围(加上跨平台)Node.js脚本之一:

  • cross-env(内联)

    cross-env MYVAR=MYVALUE node index.js
    
  • env-cmd(来自.env文件)

    env-cmd .env node index.js
    

    #.env file
    MYVAR=MYVALUE
    

答案 2 :(得分:3)

注意:如果您可以假设已经安装了 Node.js - 根据定义您调用node的情况 - 请考虑使用{ {1}}帮助程序包,如Cyril CHAPON 's helpful answer所示 答案主要关注PowerShell中的通用解决方案

<强> TL;博士

npm

更简单地说,如果没有必须恢复的预先存在的# Set env. variable temporarily, invoke the external utility, remove / restore old value. $oldVal, $env:MYVAR = $env:MYVAR, 8000; node index.js; $env:MYVAR = $oldVal # More structured alternative that uses a local variable. & { $oldVal, $env:MY_VAR = $env:MY_VAR, 8000; node index.js; $env:MY_VAR = $oldVal } 值。

MY_VAR

请参阅下文,了解基于帮助函数的解释和替代方法。

补充Harikrishnan's effective answer

PowerShell的 no 等同于传递类似POSIX的shell提供的环境变量的命令范围的方法; e.g:

$env:MYVAR=8000; node index.js; $env:MYVAR=$null

# More structured alternative
& { $env:MY_VAR=8000; node index.js; $env:MY_VAR=$null }

在PowerShell中,正如Harikrishnan的回答所示,您必须首先定义环境变量,然后在单独的语句中调用子进程,因此 # E.g., in Bash: # Define environment variable MY_VAR for the child process being invoked (`node`) # ONLY; in other words: MY_VAR is scoped to the command being invoked # (subsequent commands do not see it). MY_VAR=8000 node index.js 是正确的PowerShell解决方案,但 $env:MY_VAR="8000"; node index.js 保留在范围 中的其余部分< em> session (它设置在 进程级别)。

请注意,即使使用$env:MY_VAR调用的脚本块来创建子范围也不会有帮助,因为此类子范围仅适用于 PowerShell 变量,而不是环境变量。

您可以&电话后手动删除环境变量
node甚至只是Remove-Item env:MY_VAR,这是顶部的第一个命令显示的内容。

更结构化的替代 - 在设置多个环境变量和/或调用多个命令的情况下可能更好 - 是使用{{1}调用的脚本块}}:

$env:MY_VAR = $null

这利用了:

  • &是一个脚本块,为其中的命令提供清晰可见的分组;使用& { $oldVal, $env:MY_VAR = $env:MY_VAR, 8000; node index.js; $env:MY_VAR = $oldVal } 调用,它会创建一个本地范围,以便辅助变量{ ... }在退出块时自动超出范围。

  • &$oldVal中的$oldVal, $env:MY_VAR = $env:MY_VAR, 8000的旧值(如果有)保存,同时将值更改为$env:MY_VAR;这种分配给多个变量的技术(在某些语言中称为解构赋值)在Get-Help about_Assignment_Operators,&#34; ASSIGNING MULTIPLE VARIALBES&#34;中解释。

或者,使用帮助函数,或使用 $oldVal 方法,如this related answer中所示我的。

用于命令范围环境修改的帮助程序函数。

如果您在下面定义了辅助函数(请记住函数定义必须在之前放置它们被重新调用),您可以按如下方式对环境进行命令范围的修改:

8000

try { ... } finally { ... } 源代码

# Invoke `node index.js` with a *temporarily* set MY_VAR environment variable.
Invoke-WithEnvironment @{ MY_VAR = 8000 } { node index.js }