gpt4 book ai didi

Powershell GetEnvironmentVariable 与 $Env

转载 作者:行者123 更新时间:2023-12-02 22:41:51 26 4
gpt4 key购买 nike

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

 [Environment]::GetEnvironmentVariable('ChocolateyInstall', 'Machine')
但是,如果我像这样检索变量,则不会返回任何内容
$env:ChocolateyInstall
然后我必须做这样的事情才能让我的命令工作。
$env:ChocolateyInstall = [Environment]::GetEnvironmentVariable('ChocolateyInstall', 'Machine')
我一直无法找到一个很好的解释来解释为什么我必须这样做。我看过 this documentation ,但对我来说没有什么特别突出的。理想情况下,我想安装一个 CLI,然后不必处理检查和分配环境变量以使命令工作。

最佳答案

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

The Environment drive is a flat namespace containing the environmentvariables specific to the current user's session.


documentation你链接状态:

When you change environment variables in PowerShell, the changeaffects only the current session. This behavior resembles the behaviorof the Set command in the Windows Command Shell and the Setenv commandin UNIX-based environments. To change values in the Machine or Userscopes, you must use the methods of the System.Environment class.


因此,定义/更改这样的环境变量:
$env:ChocolateyInstall = [Environment]::GetEnvironmentVariable('ChocolateyInstall', 'Machine')
将在当前 session 中更改它,从而立即生效,但也仅对当前 session 有效。 [System.Environment]的方法粒度更细。在那里您可以选择要寻址的环境变量范围。有三个范围可用:
  • 机器
  • 用户
  • 进程
  • Process scope 相当于 Environment 驱动器,涵盖当前 session 中可用的环境变量。 MachineUser作用域地址永久存储的环境变量1。您可以像这样从特定范围获取变量:
    [Environment]::GetEnvironmentVariable('ChocolateyInstall', 'Machine')
    并将它们设置为:
    [Environment]::SetEnvironmentVariable('ChocolateyInstall', 'any/path/to/somewhere', 'Machine')
    如果您想从 Machine 获得新变量或 User如果当前 PowerShell session 中可用的范围,则必须创建一个新范围。但不要从当前的 PowerShell session 中打开新的 PowerShell session ,因为它会从当前的 PowerShell session ( source ) 继承所有环境变量:

    Environment variables, unlike other types of variables in PowerShell,are inherited by child processes, such as local background jobs andthe sessions in which module members run. This makes environmentvariables well suited to storing values that are needed in both parentand child processes.


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

    1 这是您在转到系统控制面板时在 GUI 中看到的环境变量,选择高级系统设置,然后在高级选项卡上,单击环境变量。这些变量涵盖了 UserMachine范围。
    或者,您可以通过执行以下命令直接打开此 GUI:
    rundll32 sysdm.cpl,EditEnvironmentVariables

    关于Powershell GetEnvironmentVariable 与 $Env,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63006323/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com