web-dev-qa-db-de.com

So aktualisieren Sie die Umgebung einer PowerShell-Sitzung nach einer Chocolatey-Installation, ohne eine neue Sitzung öffnen zu müssen

Ich schreibe ein automatisiertes Skript zum Klonen des GitHub-Quellcodes auf einen lokalen Computer.
Ich habe nach der Installation von Git in meinem Skript einen Fehler gemacht.
Ich kann also nach der Installation von Git keinen Code automatisch klonen.

Hier ist mein Code:

iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
 choco install -y git
 refreshenv
 Start-Sleep -Seconds 15

 git clone --mirror https://${username}:${password}@$hostname/${username}/$Projectname.git D:\GitTemp -q 2>&1 | %{ "$_" } 

Error:

git : The term 'git' is not recognized as the name of a cmdlet, 
      function, script file, or operable program. 
      Check the spelling of the name, or if a path was included, 
      verify that the path is correct and try again.

Bitte lassen Sie mich wissen, wie ich PowerShell neu starten soll, ohne es zu beenden.

5
Priya Rani

Sie haben ein Bootstrapping-Problem:

  • refreshenv (ein Alias ​​für Update-SessionEnvironment) ist im Allgemeinen der richtige Befehl zum Aktualisieren der aktuellen Sitzung mit Änderungen an Umgebungsvariablen nach einem choco install ...-Befehl.

  • unmittelbar nach der Installation von Chocolatey selbst , refreshenv/Update-SessionEnvironment sind jedoch nur in zukünftigen PowerShell-Sitzungen verfügbar, da das Laden dieser Befehle über Code erfolgt, der dem Profil $PROFILE basierend auf der Umgebungsvariablen $env:ChocolateyInstall hinzugefügt wurde.

Das heißt, Sie sollten in der Lage sein, zu emulieren was Chocolatey macht, wenn $PROFILE in zukünftigen Sitzungen bezogen wird, um refreshenv/Update-SessionEnvironment sofort nach der Installation von Chocolatey verwenden zu können:

iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

choco install -y git

# Make `refreshenv` available right away, by defining the $env:ChocolateyInstall variable
# and importing the Chocolatey profile module.
$env:ChocolateyInstall = Convert-Path "$((Get-Command choco).path)\..\.."
Import-Module "$env:ChocolateyInstall\helpers\chocolateyProfile.psm1"

# refreshenv is now an alias for Update-SessionEnvironment
# (rather than invoking refreshenv.cmd, the *batch file* for use with cmd.exe)
# This should make git.exe accessible via the refreshed $env:PATH, so that it can be 
# called by name only.
refreshenv

# Verify that git can be called.
git --version

Hinweis: Bei der ursprünglichen Lösung wurde zum Laden des Chocolatey-Profils . $PROFILE anstelle von Import-Module ... verwendet, wobei darauf vertraut wurde, dass Chocolatey den $PROFILE bereits zu diesem Zeitpunkt aktualisiert hat. ferventcoder weist jedoch darauf hin, dass diese Aktualisierung von $PROFILE nicht immer erfolgt und daher nicht als zuverlässig angesehen werden kann.

9
mklement0

Sie können versuchen, Update-SessionEnvironment zu verwenden:

Aktualisiert die Umgebungsvariablen der aktuellen Powershell-Sitzung mit allen Umgebungsvariablenänderungen, die möglicherweise während einer Chocolatey-Paketinstallation aufgetreten sind.

Damit wird geprüft, ob diese Änderung nach dem Chocolatey-Aufruf noch wirksam ist.

Wenn nicht, besteht eine einfache Lösung darin, mindestens einen absoluten Pfad zum Aufrufen von git zu verwenden.

Um Git von Powershell aus anzurufen :

new-item -path alias:git -value 'C:\Program Files\Git\bin\git.exe'

Dann können Sie versuchen:

git clone --mirror https://${username}:${password}@$hostname/${username}/$Projectname.git D:\GitTemp -q 2>&1 | %{ "$_" } 
1
VonC