【问题标题】:Executing a program based on a new environment variable基于新环境变量执行程序
【发布时间】:2014-02-08 00:04:24
【问题描述】:

我正在通过 powershell 安装 nodeJS,之后我需要在 powershell 窗口中运行一些 npm 命令。

powershell进程只能访问进程启动时可用的环境变量,不能访问安装过程中新创建的npm环境变量。

我想我可以通过从我的第一个 powershell 脚本启动一个新的 powershell 进程来执行安装的下一部分来解决这个问题,但这也会失败并显示消息

“npm”一词未被识别

这是我用来启动新的 powershell 进程的代码:

Start-Process powershell -ArgumentList "-NoExit", "-Command $PSScriptRoot/Part2.ps1", -UseNewEnvironment, -LoadUserProfile

(这是在 Part1.ps1 中)

如何运行可以看到 npm 环境变量的 powershell 进程?

【问题讨论】:

    标签: node.js powershell npm


    【解决方案1】:

    使用Start-Process-WorkingDirectory 参数将其指向npm 所在的位置。或者,您可以在part1.ps1 脚本中解析npm 的路径。如果part1.ps1 脚本与npm 命令并排放置,您可以指向npm,如下所示:

    $npm = "$PSScriptRoot\npm.exe";
    . $npm -Arg1 -Arg2;
    

    【讨论】:

    • 谢谢特雷弗。我必须查询注册表以确定用户安装 nodeJS 的位置(它与 msi 一起安装),这比在注册表中查询 Path enviro var 有点混乱。在这两个答案之间,我得到了解决方案,再次感谢。
    【解决方案2】:

    我通过从注册表中获取当前 Path 环境变量并覆盖当前进程的 Path 变量来解决这个问题。

    $regKey = "HKLM:\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
    
    $regItem = Get-ItemProperty -Path $regKey -Name Path 
    
    $env:Path = $regItem.Path
    

    现在当我拨打npm 时,一切正常。

    【讨论】:

      【解决方案3】:

      我在 PSCX 安装程序中发现了这个问题。它会修改环境变量,但 PowerShell 进程在用户注销并重新登录之前不会接受更改。另一种方法是从注册表中读取机器范围的环境变量值。

      $path = (Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment' Path).Path
      

      【讨论】:

      • 我不想继承父进程的环境块。新的 enviro var 的范围不限于父级,因为它是在进程启动后创建的。
      • 啊,安装过程正在修改机器环境变量,而 PowerShell 进程没有收到?我在安装 PSCX 时遇到过这种情况。麻烦。在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment 下查询 npm 变量的注册表可能会更好
      • Keith,您的最后评论真的很有帮助。我根据路径 reg 键重置了 enviro 路径属性。我会添加我所做的作为答案购买也可以随意添加,我会接受。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-23
      • 2016-11-13
      • 1970-01-01
      • 2019-07-22
      • 2012-08-02
      相关资源
      最近更新 更多