Я пишу сценарий 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, что мой путь был изменен, как требуется; Я даже могу открыть отдельное окно 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
... но это тоже не сработало.
Так что теперь у меня нет идей, я не смог найти решение в Интернете, и я хотел бы знать, как правильно это сделать.