Powershell GetEnvironmentVariable 与 $Env

jel*_*ans 5 powershell environment-variables

我遇到过几种情况,我试图通过命令行使用命令,但无法识别该命令。我已将其范围缩小到环境变量的问题。在每种情况下,当我使用底层 C# 方法检索变量时,变量存在,但不使用速记 $env:myVariable

例如,如果我像这样检索变量,我将得到一个值。

 [Environment]::GetEnvironmentVariable('ChocolateyInstall', 'Machine')
Run Code Online (Sandbox Code Playgroud)

但是,如果我像这样检索变量,则不会返回任何内容

$env:ChocolateyInstall
Run Code Online (Sandbox Code Playgroud)

然后我必须做这样的事情才能让我的命令工作。

$env:ChocolateyInstall = [Environment]::GetEnvironmentVariable('ChocolateyInstall', 'Machine')
Run Code Online (Sandbox Code Playgroud)

我一直无法找到一个很好的解释来解释为什么我必须这样做。我看过这个文档,但对我来说没有什么特别之处。理想情况下,我想安装一个 CLI,然后不必处理检查和分配环境变量以使命令工作。

sta*_*tor 5

打开 PowerShell 会话时,所有永久存储的环境变量1将加载Env:到此当前会话 ( source )的环境驱动器 ( ) 中:

Environment 驱动器是一个平面命名空间,包含特定于当前用户会话的环境变量。

您链接的文档指出:

在 PowerShell 中更改环境变量时,更改仅影响当前会话。此行为类似于SetWindows 命令外壳中的Setenv命令和基于 UNIX 的环境中的命令的行为。要更改 Machine 或 User 范围内的值,您必须使用System.Environment类的方法。

因此,定义/更改这样的环境变量:

$env:ChocolateyInstall = [Environment]::GetEnvironmentVariable('ChocolateyInstall', 'Machine')
Run Code Online (Sandbox Code Playgroud)

将在当前会话中更改它,从而立即生效,但也仅对当前会话有效。

的方法[System.Environment]更细粒度。在那里您可以选择要寻址的环境变量范围。有三个范围可用:

  • 机器
  • 用户
  • 过程

Process范围相当于环境驱动器,并涵盖在当前会话中可用的环境变量。该MachineUser范围解决永久保存环境变量1。您可以像这样从特定范围获取变量:

[Environment]::GetEnvironmentVariable('ChocolateyInstall', 'Machine')
Run Code Online (Sandbox Code Playgroud)

并将它们设置为:

[Environment]::SetEnvironmentVariable('ChocolateyInstall', 'any/path/to/somewhere', 'Machine')
Run Code Online (Sandbox Code Playgroud)

如果您希望在当前 PowerShell 会话中使用MachineUser范围内的新变量,则必须创建一个新变量。但是不要从当前的 PowerShell 会话中打开一个新的 PowerShell 会话,因为它会从当前的 PowerShell 会话(source)继承所有环境变量:

与 PowerShell 中的其他类型的变量不同,环境变量由子进程继承,例如本地后台作业和运行模块成员的会话。这使得环境变量非常适合存储父进程和子进程都需要的值。

因此,为了解决您描述的问题,您很可能更改了永久存储的环境变量1,同时已经打开了 PowerShell 会话。如果是这样,您只需要打开一个新的(非常新的,见上文)会话,您就可以通过环境驱动器访问您的环境变量。需要明确的是,打开一个新会话甚至会重新加载Machine作用域的环境变量。无需重新启动。


1这是您在转到System Control Panel时在 GUI 中看到的环境变量,选择Advanced System Settings并在Advanced选项卡上,单击Environment Variable。这些变量涵盖了UserMachine范围。或者,您可以通过执行以下命令直接打开此 GUI:

rundll32 sysdm.cpl,EditEnvironmentVariables
Run Code Online (Sandbox Code Playgroud)