Как обновить среду сеанса PowerShell после установки Chocolatey без необходимости открывать новый сеанс

Я пишу автоматический скрипт для клонирования исходного кода GitHub на локальный компьютер.
После установки Git в моем скрипте мне не удалось, он попросил закрыть/открыть powershell.
Поэтому я не могу автоматически клонировать код после установки Git.

Вот мой код:

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

Ошибка:

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.

Подскажите пожалуйста, что мне поставить для перезагрузки PowerShell не выходя?


person Priya Rani    schedule 15.10.2017    source источник


Ответы (2)


У вас проблема с загрузкой:

  • refreshenv (псевдоним для Update-SessionEnvironment) обычно правильная команда для обновления текущего сеанса с изменениями переменных среды после команды choco install ....

  • Однако сразу после установки самой Chocolatey сами refreshenv / Update-SessionEnvironment доступны только в будущих сеансах PowerShell, поскольку загрузка этих команд происходит с помощью кода, добавленного в профиль $PROFILE на основе переменной среды. $env:ChocolateyInstall.

Тем не менее, вы должны иметь возможность эмулировать то, что делает Chocolatey при получении $PROFILE в будущих сеансах, чтобы иметь возможность использовать refreshenv / Update-SessionEnvironment сразу после установки 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.
# Note: Using `. $PROFILE` instead *may* work, but isn't guaranteed to.
$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

Примечание: исходное решение использовало . $PROFILE вместо Import-Module ... для загрузки профиля Chocolatey, полагаясь на то, что Chocolatey уже обновил $PROFILE на тот момент. Однако ferventcoder указывает, что это обновление $PROFILE происходит не всегда, поэтому не может быть полагался.

person mklement0    schedule 15.10.2017
comment
Обязательна перезагрузка профиля, иначе иногда Refrenv не работает! - person Pikesh Prasoon; 05.04.2018
comment
@ mklement0 было бы здорово, если бы вы могли процитировать источник из feventcoder. Я знаю, что это точно, но я хотел бы увидеть контекст, почему это может быть так. - person Mattisdada; 22.06.2020
comment
@Mattisdada: Насколько я понимаю, $PROFILE обновляется только в том случае, если этот файл уже существует, но у меня нет официальной документации, на которую можно было бы указать, поэтому я предлагаю вам спросить самого \@ferventcoder. - person mklement0; 22.06.2020
comment
Если вам нравится предполагать (я плохо об этом), вы также можете использовать Import-Module "$env:ProgramData\chocolatey\helpers\chocolateyInstaller.psm1"; Update-SessionEnvironment, где $env:ProgramData\chocolatey — это путь по умолчанию, по которому будет устанавливаться Chocolatey. - person dragon788; 03.11.2020

Вы можете попробовать использовать Update-SessionEnvironment:

Обновляет переменные среды текущего сеанса powershell с учетом любых изменений переменных среды, которые могли произойти во время установки пакета Chocolatey.

Это проверит, действует ли это изменение после шоколадного звонка.

Если нет, одним из простых обходных путей было бы, по крайней мере, использовать абсолютный путь для вызова git.

Чтобы вызвать Git из Powershell:

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

Тогда вы можете попробовать:

git clone --mirror https://${username}:${password}@$hostname/${username}/$Projectname.git D:\GitTemp -q 2>&1 | %{ "$_" } 
person VonC    schedule 15.10.2017
comment
@PriyaRani Это то, что я предложил в качестве альтернативы использованию полного пути для Git: C:\path\to\git.exe clone --mirror ... - person VonC; 15.10.2017
comment
Но, сэр, я хочу запустить команду один раз после установки git, она должна клонировать репозиторий..... Если я передаю путь к git, он выдает ошибку, путь не распознан..., C:\Program: The термин 'C:\Program' не распознан как имя командлета, функция iex ((New-Object System.Net.WebClient).DownloadString('chocolatey.org/install.ps1')) choco install -y git refreshenv Start-Sleep -Seconds 15 git clone --mirror https://${ имя_пользователя}:${пароль}@$имя_хоста/${имя_пользователя}/$имя_проекта.git D:\G - person Priya Rani; 15.10.2017
comment
@PriyaRani Используйте кавычки: "C:\Program Files\path\to\git.exe" clone... - person VonC; 15.10.2017
comment
возникает проблема при размещении кавычек: - Неожиданный «клон» токена в выражении или операторе .......... C:\Program Files\Git\bin\git.exe clone github.com/Priyaran ... + ~~~~~ Неожиданный токен "клон" в выражении или операторе. + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : UnexpectedToken - person Priya Rani; 15.10.2017
comment
@PriyaRani Возможно, вы не можете напрямую вызвать команду из сценария Powershell: см. github.com/PowerShell/PowerShell /вопросы/1583 - person VonC; 15.10.2017
comment
OP действительно пытался использовать Update-SessionEnvironment, а именно через свой псевдоним refreshenv, но проблема в том, что эти команды недоступны сразу после установки Chocolatey. Хотя ваша команда определения псевдонима работает, более простое и идиоматичное определение — Set-Alias git 'C:\Program Files\Git\bin\git.exe'. Кроме того, хотя ваш подход работает с git, не все пакеты, установленные Chocolatey, устанавливаются в обычные места, поэтому более надежным подходом является поиск способа начальной загрузки с использованием Update-SessionEnvironment / refreshenv. - person mklement0; 16.10.2017