Accedi al percorso appena aggiornato dallo script PowerShell


1

Sto scrivendo uno script PowerShell per configurare un ambiente di costruzione e poi effettuare la compilazione. Ciò comporta l'impostazione del percorso di sistema in modo che includa il compilatore e il sistema di compilazione (in questo caso, qmake e mingw32-make) e quindi procedendo con la compilazione.

Ho impostato le cose in modo che la funzione per modificare il percorso del sistema, in linea generale questo riferimento , è in un file separato come questo:

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')
    }
}

... così che nel mio file di script principale posso scrivere:

# 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

Se eseguo il mio script dal Powershell ISE, posso inserire un punto di interruzione nella riga 'qmake' e verificare dalla GUI di Windows che il mio percorso sia stato modificato come richiesto; Posso persino aprire una finestra separata di cmd ed eseguire qmake e mingw32-make abbastanza felicemente. La mia sceneggiatura, tuttavia, mi dà gli errori:

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. 

... e se controllo il valore di $ env: Path allora abbastanza sicuro che non riflette le modifiche che ho appena fatto.

In un certo senso, questo non è sorprendente; Ho letto molte volte che se si modifica il percorso del sistema da una finestra di PowerShell, è necessario chiudere e riaprire la finestra affinché la modifica abbia effetto. Il problema è che non riesco a capire come aggirarlo dal mio script - l'intero punto di questo è automatizzare il mio processo di compilazione, quindi non è proprio appropriato per me dover chiudere manualmente una finestra di Powershell e aprirla un altro prima che il mio script possa procedere. Ci deve essere un modo migliore.

Una cosa che mi è venuta in mente è che forse avevo bisogno di generare un nuovo processo, quindi ho provato a mettere i miei comandi di compilazione in un file di script separato e scrivere:

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

... ma non ha funzionato.

Quindi ora sono fuori di idee, non sono stato in grado di trovare una soluzione online e mi piacerebbe sapere qual è il modo corretto per farlo.

Risposte:


1

La modifica del PERCORSO in PowerShell è isolata per la sessione corrente ed è solo temporanea, che è quello che stai vedendo.

È possibile apportare modifiche permanenti alla variabile ambientale PATH modificando direttamente nel registro. Tutte le variabili sono memorizzate sotto la chiave di registro HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment.

Uno script PowerShell da aggiungere a PATH sarà simile a:

$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

Sarà necessario riavviare PowerShell per vedere la modifica, ma d'ora in poi tutte le applicazioni utilizzeranno il PATH aggiornato.

Questo è stato trovato nell'articolo "Hey, Scripting Guy! Blog" Utilizzare PowerShell per modificare il percorso dell'ambiente , dove troverai maggiori informazioni e idee.

Un altro post utile è Ricarica il percorso in powershell dove è stata proposta la seguente sintassi:

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

Grazie per la risposta, ma temo che non mi aiuti. Quello che vedo non ha nulla a che fare con il cambio di percorso essendo temporaneo. Perché lo faccio usando il comando .Net SetEnvironmentVariable, è in effetti permanente; L'ho testato con attenzione. Il problema è semplicemente che Powershell non vede il percorso aggiornato. Quello di cui ho bisogno è un modo per forzare Powershell a vederlo, anche se ciò significa riavviare Powershell e continuare il mio script. Poiché Powershell dovrebbe essere interamente basato sull'automazione, è difficile credere che non sia possibile automatizzare una build come questa,
Eos Pengwern

È necessario riavviare Powershell per ricreare il PERCORSO, ma non come figlio dello script corrente, poiché il figlio eredita l'ambiente del genitore. Ho aggiunto una possibile soluzione per ricaricare il PERCORSO nella sessione corrente dopo un cambiamento permanente.
harrymc

Sembra molto più promettente, ma temo che non riuscirò a provarlo per 24 ore circa; Ti farò sapere se fa il trucco, e accetta la tua risposta in caso affermativo.
Eos Pengwern

Nessuna fretta e buona fortuna.
harrymc

Sì, è inchiodato. Accetterò la tua risposta ora.
Eos Pengwern
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.