我正在尝试使用PowerShell将环境变量传递给Node.js:
C:\Users\everton\my-project> $env:MY_VAR = 8000 node index.js
但我在PowerShell中遇到错误:
令牌'节点'意外表达或声明
答案 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脚本之一:
答案 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 }