如何更改环境variablespowershell并启动应用程序

在PowerShell中,我需要更改系统pathvariables:

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

然后启动一个程序:

 & $someExeName 'someargument' 

我得到的问题是可执行文件正在使用旧的环境。 它不承认新的道路。 如果我还更改$ env.path,只更改此PowerShell会话的path,它也不会传播到新的进程。 如果我closuresPowerShell并在新窗口中启动可执行文件,那就没问题了。 推测它是从PowerShell进程inheritance(未更新)的环境

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

Solutions Collecting From Web of "如何更改环境variablespowershell并启动应用程序"

通常,子进程会从父进程*继承环境。 如果从现有的PowerShell会话产生一个新的PowerShell会话,新会话将继承该会话的环境变量(但不包括其他变量)。

但是, Path变量是一个异常,导致了很多混淆:即使它是一个环境变量,新的PowerShell会话从注册表项HKLM:\System\CurrentControlSet\Control\Session Manager\Environment读取其值,覆盖继承的值从父母的会议。

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

  • 这种行为也是特定于PowerShell的。

    »如果您在PowerShell会话中更改路径 ,但不在注册表中,并产生新的PowerShell会话(例如,使用start powershell PowerShell),则新会话将具有注册表的路径,但是如果您产生了cmd会话,会话将从产生它的PowerShell会话中获得路径。

    »同样,如果你在cmd会话中改变路径set Path=New Path )并产生一个PowerShell会话,新会话将从注册表获得路径,但是如果你产生了一个cmd会话,它将会改变路径从父CMD会话。

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

以下命令在当前会话中更改Path ,而不是在注册表中:

 $env:Path = 'New path' 

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

以下命令在注册表中更改Path ,而不是在当前会话中:

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

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

你描述的内容对我来说没有意义,因为你说你已经尝试了一种改变注册表路径的方法,还有一种改变了PowerShell会话路径的方法,并且你正在产生的可执行文件没有任何改变的路径。 AFAIK原始环境没有被缓存在任何地方,子进程必须从父进程的环境或注册表获取路径。

我建议,在启动可执行文件之前,请确保已经双向更改路径:

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

如果出于某种无法解释的原因,请尝试以下操作:

  1. 打开一个PowerShell会话
  2. 使用其中一个在注册表中更改它的方法更改路径
  3. 直接从PowerShell会话启动可执行文件,请执行此命令

     powershell "& $someExeName 'someargument'" 

    通过新的非交互式PowerShell会话启动可执行文件,该会话将从注册表中读取Path环境变量。


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