-
Notifications
You must be signed in to change notification settings - Fork 2
/
Install-GitForWindows.ps1
171 lines (125 loc) · 5.9 KB
/
Install-GitForWindows.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
Function Install-GitForWindows {
<#
.SYNOPSIS
This cmdlet is used to install/update Git For Windows on a machine. It can also be used to simply download the installer
.DESCRIPTION
Download the lates Git For Windows installed for Windows, verify that hash and instal the file
.PARAMETER OutFile
Define where to save the installer file. Default location is your Temp directory
.PARAMETER InfFile
Define an INF configuration file for Git if you have customizations you prefere to make.
SAMPLE INF FILE CONTENTS
[Setup]
Lang=default
Dir=C:\Program Files\Git
Group=Git
NoIcons=0
SetupType=default
Compontents=ext,ext\shellhere,ext\guihere,gitlfs,assoc,autoupdate
Tasks=
EditorOption=powershell
CustomEditorPath=
PathOption=Cmd
SSHOption=OpenSSH
TortoiseOption=false
CURLOption=WinSSL
CRLFOption=LFOnly
BashTerminalOption=ConHost
PerformanceTweaksFSCache=Enabled
UseCredentialManager=Enabled
UseCredentialManager=Enabled
EnableSymlinks=Disabled
EnalbedBuiltinInteractiveAdd=Disabled
.PARAMETER DownloadOnly
Switch parameter to specify you only want to download the installer
.PARAMETER TryTLSv13
Switch parameter that tells PowerShell to try download file using TLSv1.3. This seems to fail as of 3/28/2023 due to 1.3 being so new
.EXAMPLE
Install-GitForWindows
# This example downloads the Git For Windows installer and verifies the checksum before installing it
.EXAMPLE
Install-GitForWindows -OutFile "$env:TEMP\git-for-windows-x64-bit.exe"
# This example downloads the Git For Windows installer and verifies the checksum before installing it
.EXAMPLE
Install-GitForWindows -OutFile "$env:TEMP\git-for-windows-x64-bit.exe" -DownloadOnly
# This example downloads the Git For Windows installer and verifies the checksum
.NOTES
Author: Robert H. Osborne
Alias: tobor
Contact: [email protected]
.LINK
https://github.com/tobor88
https://github.com/osbornepro
https://www.powershellgallery.com/profiles/tobor
https://osbornepro.com
https://writeups.osbornepro.com
https://encrypit.osbornepro.com
https://btpssecpack.osbornepro.com
https://www.powershellgallery.com/profiles/tobor
https://www.hackthebox.eu/profile/52286
https://www.linkedin.com/in/roberthosborne/
https://www.credly.com/users/roberthosborne/badges
.INPUTS
None
.OUTPUTS
System.Management.Automation.PSObject
#>
[OutputType([System.Management.Automation.PSObject])]
[CmdletBinding()]
param(
[Parameter(
Position=0,
Mandatory=$False
)] # End Parameter
[ValidateScript({$_ -like "*.exe"})]
[String]$OutFile = "$env:TEMP\git-for-windows-x64-bit.exe",
[Parameter(
Position=1,
Mandatory=$False
)] # End Parameter
[ValidateScript({ ($_ -like "*.inf") -and (Test-Path -Path $_) })]
[String]$InfFile,
[Parameter(
Mandatory=$False
)] # End Parameter
[Switch]$DownloadOnly,
[Parameter(
Mandatory=$False
)] # End Parameter
[Switch]$TryTLSv13
) # End param
$TlsVersion = "TLSv1.2"
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12
If ($TryTLSv13.IsPresent) {
$TlsVersion = "TLSv1.3"
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls13
} # End If
Write-Verbose -Message "[v] $(Get-Date -Format 'MM-dd-yyyy hh:mm:ss') utilizing $TlsVersion"
$UserAgent = [Microsoft.PowerShell.Commands.PSUserAgent]::FireFox
$Uri = 'https://api.github.com/repos/git-for-windows/git/releases/latest'
Write-Verbose -Message "[v] $(Get-Date -Format 'MM-dd-yyyy hh:mm:ss') Downloading Git for Windows from GitHub"
Try {
$GetLinks = Invoke-RestMethod -Uri $Uri -Method GET -UseBasicParsing -UserAgent $UserAgent -ContentType 'application/json; charset=utf-8' -Verbose:$False
$DownloadLink = ($GetLinks | ForEach-Object { $_.Assets } | Where-Object -Property Name -like "*64-bit.exe").browser_download_url
Invoke-WebRequest -Uri $DownloadLink -UseBasicParsing -UserAgent $UserAgent -OutFile $OutFile -Method GET -ContentType 'application/octet-stream' -Verbose:$False | Out-Null
} Catch {
Throw $Error[0]
} # End Try Catch Catch
$FileHash = (Get-FileHash -Path $OutFile -Algorithm SHA256).Hash.ToLower()
$CheckSum = ($GetLinks.body.Split("`n") | Where-Object -FilterScript { $_ -like "*Git-*-64-bit.exe*" } | Out-String).Split(" ")[-1].Trim()
If ($FileHash -eq $CheckSum) {
Write-Verbose -Message "[v] $(Get-Date -Format 'MM-dd-yyyy hh:mm:ss') Successfully verified hash of newly downloaded file for Git for Windows"
If ($DownloadOnly.IsPresent -and (Test-Path -Path $OutFile)) {
Write-Output -InputObject "[*] $(Get-Date -Format 'MM-dd-yyyy hh:mm:ss') Successfully downloaded file and verified hash.`n[i] File saved to $OutFile"
} Else {
Write-Verbose -Message "[v] $(Get-Date -Format 'MM-dd-yyyy hh:mm:ss') Executing installation of Git for Windows"
If ($PSBoundParameters.ContainsKey("InfFile")) {
Start-Process -FilePath $OutFile -ArgumentList @('/SP-','/VERYSILENT', '/SUPPRESSMSGBOXES', '/NOCANCEL', '/NORESTART', '/CLOSEAPPLICATIONS', '/RESTARTAPPLICATIONS', '/LOADINF=`"$InfFile`"') -NoNewWindow -Wait -PassThru
} Else {
Start-Process -FilePath $OutFile -ArgumentList @('/SP-','/VERYSILENT', '/SUPPRESSMSGBOXES', '/NOCANCEL', '/NORESTART', '/CLOSEAPPLICATIONS', '/RESTARTAPPLICATIONS') -NoNewWindow -Wait -PassThru
} # End If Else
} # End If Else
} Else {
Throw "[x] $(Get-Date -Format 'MM-dd-yyyy hh:mm:ss') Failed to validate hash of newly downloaded file for Git for Windows"
} # End If Else
} # End Function Install-GitForWindows