Установите GIT, если не установлен, и клонируйте - PullRequest
1 голос
/ 04 марта 2020

Я хотел бы установить GIT, если он не установлен, а затем использовать клон git с помощью PowerShell.

Моя первая попытка выглядит следующим образом:

try {
  git --version | Out-Null
  Write-Host "GIT is already installed."

} catch [System.Management.Automation.CommandNotFoundException]{
  Write-Host "GIT ist not installed."
  Write-Host "Installing..."
  & gitsetup.exe /VERYSILENT /PathOption=CmdTools | Out-Null
}

git clone https://github.com/username/repository

Я получаю Ошибка command not found при получении клона git, поскольку GIT не завершил установку.

Есть ли хороший способ решения этой проблемы?

Ответы [ 3 ]

2 голосов
/ 04 марта 2020
  • Используйте Start-Process с переключателем -Wait, чтобы запустить установщик и дождаться его завершения .

    • Примечание: Как указывает ответ TToni , передача по номеру | Out-Null, как и в вашем вопросе, является несколько неясным способом сделать синхронный вызов приложения GUI; в целом
      , однако, Start-Process дает вам больше контроля над вызовом, например, возможность вызывать приложение скрыто .
  • Кроме того, вам придется добавить Git установочный каталог $env:PATH вручную для текущего сеанса (поскольку изменения $env:PATH, сделанные установщиком, видны только для будущих сеансов ), так что вызов с git успешен; код ниже предполагает стандартное местоположение, C:\Program Files\Git\cmd; отрегулируйте по мере необходимости - мне неясно, что делает /PathOption=CmdTools.

    • Примечание: Ответ TToni показывает альтернативный подход, который не требует знания каталога установки заранее : путем переопределения $env:PATH на основе обновленных определений реестра установочный каталог Git. должны быть добавлены; Единственное предостережение заключается в том, что вы потенциально можете уничтожить пользовательские внутрипроцессные изменения $env:PATH, такие как дополнения, выполненные в вашем файле $PROFILE.
  • Чтобы сделать код более надежный, добавьте проверку, если установка прошла успешно, повторив исходный тест.

$retrying = $false
do {
  try {

    # Test if git can be invoked.
    $null = git --version
    if (-not $retrying) { Write-Host "Git is already installed." }
    break # Git is (now) available, exit.

  } catch [System.Management.Automation.CommandNotFoundException] {

    if ($retrying) {
      Throw "Git is not installed, and installation on demand failed."
    }

    Write-Host "Git ist not installed."
    Write-Host "Installing..."

    # Install synchronously (wait for the installer to complete).
    Start-Process -NoNewWindow -Wait gitsetup.exe '/VERYSILENT /PathOption=CmdTools'

    # So that invocation by mere file name (`git`) works in this session too,
    # add the Git installation dir to $env:Path manually.
    $env:Path += ';C:\Program Files\Git\cmd'

    # Continue the loop, to see if git is now installed.
    $retrying = $true
  }
} while ($true)

git clone https://github.com/username/repository

1 голос
/ 04 марта 2020

| Out-Null после установки уже должно быть достаточно для ожидания выхода из процесса.

Но установщик, вероятно, изменит глобальную переменную PATH, включив в нее путь git, и он пока не виден в вашем текущем процессе powershell. Он только ищет и копирует среду при запуске процесса.

Если вы поставите следующую строку после вызова установки, я ожидаю, что она будет работать:

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
0 голосов
/ 04 марта 2020

добавьте в область видимости этот код, чтобы создать паузу до завершения процесса:

while(Get-Process -Name <NameInstallerProc> -ErrorAction SilentlyContinue){
Start-Sleep -Seconds 2
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...