Public/Install-DotNetSDK.ps1
<#
.SYNOPSIS Installs the .Net SDK on Windows or Linux. Compatible with Windows PowerShell 5.1 and PowerShell Core. .DESCRIPTION See .SYNOPSIS .NOTES .EXAMPLE # Launch PowerShell and ... PS C:\Users\zeroadmin> Install-DotNetSDK #> function Install-DotNetSDK { [CmdletBinding()] Param () if ($PSVersionTable.Platform -eq "Unix" -or $PSVersionTable.OS -match "Darwin" -and $env:SudoPwdPrompt) { if (GetElevation) { Write-Error "You should not be running the $($MyInvocation.MyCommand.Name) function as root! Halting!" $global:FunctionResult = "1" return } RemoveMySudoPwd NewCronToAddSudoPwd $env:SudoPwdPrompt = $False } if (!$PSVersionTable.Platform -or $PSVersionTable.Platform -eq "Win32NT") { if (!$(GetElevation)) { Write-Error "The $($MyInvocation.MyCommand.Name) function must be run from an elevated PowerShell session! Halting!" $global:FunctionResult = "1" return } } if (!$PSVersionTable.Platform -or $PSVersionTable.Platform -eq "Win32NT") { try { $null = Install-Program -ProgramName dotnetcore-sdk -CommandName dotnet.exe -ErrorAction Stop } catch { Write-Error $_ $global:FunctionResult = "1" return } # Make sure $env:Path is updated $DotNetExeDir = "C:\Program Files\dotnet" [System.Collections.Arraylist][array]$CurrentEnvPathArray = $env:Path -split ';' | Where-Object {![System.String]::IsNullOrWhiteSpace($_)} | Sort-Object | Get-Unique if ($CurrentEnvPathArray -notcontains $DotNetExeDir) { $CurrentEnvPathArray.Insert(0,$DotNetExeDir) $env:Path = $CurrentEnvPathArray -join ';' } $DotNetCommandInfo = Get-Command dotnet } if ($PSVersionTable.Platform -eq "Unix" -or $PSVersionTable.OS -match "Darwin") { $HostNameCtlInfo = hostnamectl $OSVersionCheckPrep = $HostNameCtlInfo -match "Operating System:" $ArchitectureCheck = $HostNameCtlInfo -match "Architecture:" switch ($OSVersionCheckPrep) { {$_ -match "18\.04"} { $OSVerCheck = 'Ubuntu 18.04' $MicrosoftUrl = "https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb" } {$_ -match "16\.|16\.04"} { $OSVerCheck = 'Ubuntu 16.04' $MicrosoftUrl = "https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb" } {$_ -match "14\.|14\.04"} { $OSVerCheck = 'Ubuntu 14.04' $MicrosoftUrl = "https://packages.microsoft.com/config/ubuntu/14.04/packages-microsoft-prod.deb" } {$_ -match "stretch"} { $OSVerCheck = 'Debian 9' $MicrosoftUrl = "https://packages.microsoft.com/config/debian/9/prod.list" } {$_ -match "jessie"} { $OSVerCheck = 'Debian 8' $MicrosoftUrl = "https://packages.microsoft.com/config/debian/8/prod.list" } {$_ -match "CentOS.*7"} { $OSVerCheck = 'CentOS 7' $MicrosoftUrl = "https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm" } {$_ -match "openSUSE.*42"} { $OSVerCheck = 'openSUSE 42' $MicrosoftUrl = "https://packages.microsoft.com/config/opensuse/42.2/prod.repo" } } if (!$MicrosoftUrl) { Write-Error "Unable to identify Linux OS Version! Halting!" $global:FunctionResult = "1" return } if ($OSVerCheck -match "openSUSE" -and ![bool]$($ArchitectureCheck -match "arm")) { try { $SBAsString = @( 'Write-Host "`nOutputStartsBelow`n"' 'try {' ' rpm --import https://packages.microsoft.com/keys/microsoft.asc' ' zypper --non-interactive ar --gpgcheck-allow-unsigned-repo https://packages.microsoft.com/rhel/7/prod/ microsoft' ' zypper --non-interactive update' ' rpm -ivh --nodeps https://packages.microsoft.com/rhel/7/prod/dotnet-sdk-2.1.500-x64.rpm' " Get-Command dotnet -ErrorAction Stop | ConvertTo-Json -Depth 3" '}' 'catch {' ' @("ErrorMsg",$_.Exception.Message) | ConvertTo-Json -Depth 3' '}' ) $SBAsString = $SBAsString -join "`n" $DotNetInstallPrep = SudoPwsh -CmdString $SBAsString if ($DotNetInstallPrep.Output -match "ErrorMsg") { throw $DotNetInstallPrep.Output[-1] } if ($DotNetInstallPrep.OutputType -eq "Error") { if ($DotNetInstallPrep.Output -match "ErrorMsg") { throw $DotNetInstallPrep.Output[-1] } else { throw $DotNetInstallPrep.Output } } $DotNetCommandInfo = $DotNetInstallPrep.Output } catch { Write-Error $_ $global:FunctionResult = "1" return } } if ($OSVerCheck -match "CentOS" -and ![bool]$($ArchitectureCheck -match "arm")) { try { $SBAsString = @( 'Write-Host "`nOutputStartsBelow`n"' 'try {' " curl https://packages.microsoft.com/config/rhel/7/prod.repo | sudo tee /etc/yum.repos.d/microsoft.repo" ' yum update -y' ' yum install dotnet-sdk-2.1 -y' " Get-Command dotnet -ErrorAction Stop | ConvertTo-Json -Depth 3" '}' 'catch {' ' @("ErrorMsg",$_.Exception.Message) | ConvertTo-Json -Depth 3' '}' ) $SBAsString = $SBAsString -join "`n" $DotNetInstallPrep = SudoPwsh -CmdString $SBAsString if ($DotNetInstallPrep.Output -match "ErrorMsg") { throw $DotNetInstallPrep.Output[-1] } if ($DotNetInstallPrep.OutputType -eq "Error") { if ($DotNetInstallPrep.Output -match "ErrorMsg") { throw $DotNetInstallPrep.Output[-1] } else { throw $DotNetInstallPrep.Output } } $DotNetCommandInfo = $DotNetInstallPrep.Output } catch { Write-Error $_ $global:FunctionResult = "1" return } } if ($OSVerCheck -match "Ubuntu" -and ![bool]$($ArchitectureCheck -match "arm")) { try { $SBAsString = @( 'Write-Host "`nOutputStartsBelow`n"' 'try {' ' apt-get install -y apt-transport-https' " wget -q $MicrosoftUrl" ' dpkg -i packages-microsoft-prod.deb' ' apt-get update' ' apt-get install -y dotnet-sdk-2.1' " Get-Command dotnet -ErrorAction Stop | ConvertTo-Json -Depth 3" '}' 'catch {' ' @("ErrorMsg",$_.Exception.Message) | ConvertTo-Json -Depth 3' '}' ) $SBAsString = $SBAsString -join "`n" $DotNetInstallPrep = SudoPwsh -CmdString $SBAsString if ($DotNetInstallPrep.Output -match "ErrorMsg") { throw $DotNetInstallPrep.Output[-1] } if ($DotNetInstallPrep.OutputType -eq "Error") { if ($DotNetInstallPrep.Output -match "ErrorMsg") { throw $DotNetInstallPrep.Output[-1] } else { throw $DotNetInstallPrep.Output } } $DotNetCommandInfo = $DotNetInstallPrep.Output } catch { Write-Error $_ $global:FunctionResult = "1" return } } if ($OSVerCheck -match "Ubuntu" -and $ArchitectureCheck -match "arm") { try { $SBAsString = @( 'Write-Host "`nOutputStartsBelow`n"' 'try {' ' apt-get -y update' ' sudo apt-get -y install libunwind8 gettext' ' wget https://download.microsoft.com/download/8/8/5/88544F33-836A-49A5-8B67-451C24709A8F/dotnet-sdk-2.1.300-linux-arm.tar.gz' #' wget https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/2.1.0/aspnetcore-runtime-2.1.0-linux-arm.tar.gz' ' mkdir /opt/dotnet' ' tar -xvf dotnet-sdk-2.1.300-linux-arm.tar.gz -C /opt/dotnet/' #' tar -xvf aspnetcore-runtime-2.1.0-linux-arm.tar.gz -C /opt/dotnet/' ' ln -s /opt/dotnet/dotnet /usr/local/bin' " Get-Command dotnet -ErrorAction Stop | ConvertTo-Json -Depth 3" '}' 'catch {' ' @("ErrorMsg",$_.Exception.Message) | ConvertTo-Json -Depth 3' '}' ) $SBAsString = $SBAsString -join "`n" $DotNetInstallPrep = SudoPwsh -CmdString $SBAsString if ($DotNetInstallPrep.Output -match "ErrorMsg") { throw $DotNetInstallPrep.Output[-1] } if ($DotNetInstallPrep.OutputType -eq "Error") { if ($DotNetInstallPrep.Output -match "ErrorMsg") { throw $DotNetInstallPrep.Output[-1] } else { throw $DotNetInstallPrep.Output } } $DotNetCommandInfo = $DotNetInstallPrep.Output } catch { Write-Error $_ $global:FunctionResult = "1" return } } if ($OSVerCheck -match "Debian" -and ![bool]$($ArchitectureCheck -match "arm")) { if ($OSVerCheck -eq "Debian 9") { $AddAptSource = " sh -c 'echo `"deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-debian-stretch-prod stretch main`" > /etc/apt/sources.list.d/microsoft.list'" } elseif ($OSVerCheck -eq "Debian 8") { $AddAptSource = " sh -c 'echo `"deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-debian-jessie-prod jessie main`" > /etc/apt/sources.list.d/microsoft.list'" } try { $SBAsString = @( 'Write-Host "`nOutputStartsBelow`n"' 'try {' ' apt-get install -y curl gnupg apt-transport-https ca-certificates' ' curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -' $AddAptSource ' apt-get update' ' sudo apt-get install -y dotnet-sdk-2.1' " Get-Command dotnet -ErrorAction Stop | ConvertTo-Json -Depth 3" '}' 'catch {' ' @("ErrorMsg",$_.Exception.Message) | ConvertTo-Json -Depth 3' '}' ) $SBAsString = $SBAsString -join "`n" $DotNetInstallPrep = SudoPwsh -CmdString $SBAsString if ($DotNetInstallPrep.Output -match "ErrorMsg") { throw $DotNetInstallPrep.Output[-1] } if ($DotNetInstallPrep.OutputType -eq "Error") { if ($DotNetInstallPrep.Output -match "ErrorMsg") { throw $DotNetInstallPrep.Output[-1] } else { throw $DotNetInstallPrep.Output } } $DotNetCommandInfo = $DotNetInstallPrep.Output } catch { Write-Error $_ $global:FunctionResult = "1" return } } } $DotNetCommandInfo } |