web-dev-qa-db-fra.com

Comment actualiser l'environnement d'une session PowerShell après une installation Chocolatey sans avoir besoin d'ouvrir une nouvelle session

J'écris un script automatisé pour cloner le code source de GitHub sur une machine locale.
J'ai échoué après avoir installé Git dans mon script, il a demandé une fermeture/ouverture de PowerShell.
Je ne peux donc pas cloner le code automatiquement après l'installation de Git.

Voici mon 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 | %{ "$_" } 

Erreur:

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.

S'il vous plaît laissez-moi ce que dois-je mettre pour redémarrer PowerShell sans quitter?

17
Priya Rani

Vous avez un problème d'amorçage:

  • refreshenv (un alias pour Update-SessionEnvironment) est généralement la bonne commande à utiliser pour mettre à jour la session en cours avec des changements de variables d'environnement après un choco install ... commande.

  • Cependant, immédiatement après l'installation de Chocolatey lui-même , refreshenv/Update-SessionEnvironment eux-mêmes ne seront disponibles que dans les futures sessions PowerShell, car le chargement de ces commandes se fait via du code ajouté au profil $PROFILE, basé sur la variable d'environnement $env:ChocolateyInstall.

Cela dit, vous devriez pouvoir émuler ce que Chocolatey fait quand $PROFILE provient de futures sessions afin de pouvoir utiliser refreshenv/Update-SessionEnvironment tout de suite, immédiatement après l'installation de Chocolatey:

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

Remarque: La solution d'origine utilisait . $PROFILE au lieu de Import-Module ... pour charger le profil Chocolatey, en s'appuyant sur Chocolatey pour avoir mis à jour $PROFILE déjà à ce point. Cependant, ferventcoder souligne que cette mise à jour de $PROFILE ne se produit pas toujours , donc ne peut pas être invoqué.

12
mklement0

Vous pouvez essayer d'utiliser pdate-SessionEnvironment :

Met à jour les variables d'environnement de la session powershell en cours avec toutes les modifications de variables d'environnement qui peuvent s'être produites lors de l'installation d'un package Chocolatey.

Cela testera si ce changement est toujours efficace après l'appel chocolaté.

Sinon, une solution de contournement simple consisterait au moins à utiliser un chemin absolu pour appeler git.

Pour appelez Git depuis Powershell :

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

Ensuite, vous pouvez essayer:

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