gpt4 book ai didi

windows - 如何在 PowerShell 中更改环境变量并启动应用程序

转载 作者:可可西里 更新时间:2023-11-01 14:43:53 25 4
gpt4 key购买 nike

在 PowerShell 中,我需要更改系统路径变量:

$oldPath = [System.Environment]::GetEnvironmentVariable('Path', 'Machine')
[System.Environment]::SetEnvironmentVariable('Path', (Transform-It $oldPath), 'Machine')

然后启动一个程序:

& $someExeName 'someargument'

我遇到的问题是可执行文件使用的是旧环境。它不识别新路径。如果我还更改了 $env.path,仅更改此 PowerShell session 的路径,它也不会传播到新进程。如果我关闭 PowerShell 并在新窗口中启动可执行文件,就没问题了。大概它是从 PowerShell 进程继承(未更新的)环境。

在 PowerShell 中更改环境变量并让从该窗口启动的新进程识别它的最佳做法是什么?

最佳答案

一般来说,子进程从父进程继承环境*。如果您从现有的 PowerShell session 生成一个新的 PowerShell session ,则新 session 将从该 session 继承环境变量(但没有其他变量)。

但是,Path 变量是一个异常,会引起很多困惑:即使它是一个环境变量,新的 PowerShell session 也会从注册表项 HKLM:\System\中读取它的值CurrentControlSet\Control\Session Manager\Environment,覆盖从父 session 继承的值。

  • 此行为特定于 Path 变量。其他环境变量是从父 session 继承的,无论它们是仅在父 session 中定义还是存储在上述注册表项中。

  • 此行为也特定于 PowerShell。

    » 如果您在 PowerShell session 中更改路径,而不是在注册表中更改,并生成一个新的 PowerShell session (例如使用 start powershell),新 session 将具有注册表中的路径,但如果您生成 cmd session ,则新 session 将具有生成它的 PowerShell session 中的路径。

    » 同样,如果您在 cmd session 中更改 Path(使用 set Path=New Path)并生成 PowerShell session ,则新 session 的路径将从注册表,但如果您生成一个 cmd session ,它将从父 cmd session 更改路径。

    » 默认行为是从父进程(如 cmd 所做的)继承路径(连同环境的其余部分)。 但是,其他一些程序很可能以类似于 PowerShell 的方式运行,用注册表值覆盖继承的值。这种行为并不常见,但不能排除这种情况发生在您的可执行文件中的可能性。

以下命令更改当前 session 中的路径,而不是注册表中的:

$env:Path = 'New path'

[System.Environment]::SetEnvironmentVariable('Path', 'New Path', 'Process')


以下命令更改注册表中的路径,而不是当前 session 中的:

Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Session Manager\Environment' -Name 'Path' -Value 'New Path'

[System.Environment]::SetEnvironmentVariable('Path', 'New Path', 'Machine')

你所描述的对我来说没有意义,因为你说你已经尝试了一种改变注册表中路径的方法,以及一种改变 PowerShell session 中路径的方法,并且你的可执行文件're spawning 没有任何改变的路径。据我所知,原始环境没有缓存在任何地方,子进程必须从父进程的环境或注册表中获取路径。

我建议它绝对确保您在启动可执行文件之前已经双向更改了路径:

  1. 打开一个 PowerShell session
  2. 使用在 session 中更改路径的方法之一更改路径
  3. 使用在注册表中更改路径的方法之一更改路径
  4. 启动可执行文件

如果由于某些无法解释的原因不起作用,试试这个:

  1. 打开一个 PowerShell session
  2. 使用在注册表中更改路径的方法之一更改路径
  3. 不是直接从该 PowerShell session 启动可执行文件,而是执行此命令

    powershell "& $someExeName 'someargument'"

    让可执行文件由一个新的非交互式 PowerShell session 启动,该 session 将从注册表中读取 Path 环境变量。


* 请注意,环境的继承是 Windows 中父子进程之间唯一的关系。除此之外,它们是完全独立的(没有 Unix 和 Linux 中的层次结构)。

关于windows - 如何在 PowerShell 中更改环境变量并启动应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23255430/

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