从 Powershell 脚本访问新更新的路径

从 Powershell 脚本访问新更新的路径

我正在编写一个 Powershell 脚本来配置构建环境,然后执行构建。这需要设置系统路径,使其包含编译器和构建系统(在本例中为 qmake 和 mingw32-make),然后继续构建。

我已经设置好了,修改系统路径的功能,大致基于此引用,位于一个单独的文件中,如下所示:

Function AddTo-UserPath
{
    Param
    (
        [Parameter(mandatory=$true)]
        [System.IO.DirectoryInfo[]]$PathsToAdd
    )

    $MachinePath = [System.Environment]::GetEnvironmentVariable('PATH','Machine')
    $UserPath = [System.Environment]::GetEnvironmentVariable('PATH','User')
    $VerifiedPathsToAdd = $Null
    $MachinePathArray = $MachinePath -Split ‘;’ -replace ‘\\+$'
    $UserPathArray = $UserPath -Split ‘;’ -replace ‘\\+$'
    Foreach ($PathToAdd in ($PathsToAdd | % { $_.FullName.TrimEnd(‘\’) } ) )
    {
        if($MachinePathArray -contains $PathToAdd)
        {
            Write-Verbose “$PathToAdd already exists in Machine Path”
        }
        elseif($UserPathArray -contains $PathToAdd)
        {
            Write-Verbose “$PathToAdd already exists in User Path”
        }
        else
        {
            $VerifiedPathsToAdd += ";$PathToAdd"
        }
    }

    if($VerifiedPathsToAdd -ne $null)
    {
        [Environment]::SetEnvironmentVariable('PATH', $UserPath + $VerifiedPathsToAdd, 'User')
    }
}

...这样我就可以在我的主脚本文件中写入:

# Load the module containing the AddTo-UserPath function
Import-Module $PSScriptRoot\..\ps1utils\myfunctions.ps1

# Add the required directories to the system path
AddTo-UserPath C:\Qt\Tools\mingw530_32\bin, C:\Qt\5.9.7\mingw53_32\bin

# Start the build
qmake qwt.pro
mingw32-make -j
mingw32-make -j install

如果我从 Powershell ISE 运行脚本,我可以在“qmake”行处放置一个断点,并从 Windows GUI 验证我的路径是否已根据需要修改;我甚至可以弹出一个单独的 cmd 窗口并顺利运行 qmake 和 mingw32-make。但是,我的脚本给出了错误:

qmake : The term 'qmake' is not recognized as the name of a cmdlet, function, script file, or operable program.
mingw32-make : The term 'mingw32-make' is not recognized as the name of a cmdlet, function, script file, or operable program. 

...如果我检查 $env:Path 的值,那么它肯定不会反映我刚刚所做的更改。

从某种程度上来说这并不奇怪;我读过很多次,如果你在 Powershell 窗口中更改系统路径,那么你必须关闭并重新打开窗口才能使更改生效。问题是我无法弄清楚如何在我的脚本中解决这个问题——这样做的目的是自动化我的构建过程,所以在我的脚本继续之前,我必须手动关闭一个 Powershell 窗口并打开另一个窗口,这对我来说不太合适。一定有更好的方法。

我想到了一个问题,也许我需要生成一个新的进程,因此我尝试将构建命令放入单独的脚本文件中并写入:

AddTo-UserPath C:\Qt\Tools\mingw530_32\bin, C:\Qt\5.9.7\mingw53_32\bin
powershell -file TheRestOfMyBuildProcess.ps1

...但那也不起作用。

所以现在我没有主意了,我无法在网上找到解决方案,我很想知道正确的方法是什么。

答案1

在 PowerShell 中更改 PATH 仅限于当前会话,并且只是暂时的,这就是您所看到的。

您可以通过直接在注册表中更改 PATH 环境变量来永久更改它。所有变量都存储在注册表项下 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

添加到 PATH 的 PowerShell 脚本如下所示:

$oldPath=(Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).Path

$newPath=$oldPath+’;C:NewFolderToAddToTheList’

Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment' -Name PATH –Value $newPath

您需要重新启动 PowerShell 才能看到更改,但从现在开始所有应用程序都将使用更新的 PATH。

这是在“嘿,脚本小伙!博客”文章中找到的 使用 PowerShell 修改环境路径,在这里您可以找到更多信息和想法。

另一个有用的帖子是 在 powershell 中重新加载路径 其中建议使用以下语法:

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") 

相关内容