Files
GSS2Rework/tools/dotnet_download_windows.ps1
T

90 lines
6.4 KiB
PowerShell

$uri = "https://builds.dotnet.microsoft.com/dotnet/Sdk/10.0.300/dotnet-sdk-10.0.300-win-x64.zip";
$targetDir = ".\dotnet_windows"
$zipFile = ".\dotnet_windows\dotnet-sdk.zip"
if (Test-Path $targetDir) {
Remove-Item $targetDir -Recurse -Force
}
New-Item -ItemType Directory -Path $targetDir | Out-Null
function Invoke-DownloadWithProgress {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[string]$Uri,
[Parameter(Mandatory = $true)]
[string]$OutFile,
[Parameter(Mandatory = $false)]
[string]$ActivityName = "Скачивание файла"
)
Add-Type -AssemblyName System.Net.Http
$httpClient = New-Object System.Net.Http.HttpClient
try {
$response = $httpClient.GetAsync($Uri, [System.Net.Http.HttpCompletionOption]::ResponseHeadersRead).GetAwaiter().GetResult()
if (-not $response.IsSuccessStatusCode) {
throw "Сервер вернул код ошибки: $([int]$response.StatusCode) ($($response.StatusCode))"
}
$totalBytes = $response.Content.Headers.ContentLength
$totalMB = if ($totalBytes) { [Math]::Round($totalBytes / 1MB, 3) } else { "Неизвестно" }
$downloadStream = $response.Content.ReadAsStreamAsync().GetAwaiter().GetResult()
$fileStream = [System.IO.File]::Create($OutFile)
$fileStream.Close()
$buffer = New-Object byte[] 8192
$bytesRead = 0
$totalBytesRead = 0
while (($bytesRead = $downloadStream.Read($buffer, 0, $buffer.Length)) -gt 0) {
$fileStream = [System.IO.File]::Open($OutFile, [System.IO.FileMode]::Append)
$fileStream.Write($buffer, 0, $bytesRead)
$fileStream.Close();
$totalBytesRead += $bytesRead
$currentMB = [Math]::Round($totalBytesRead / 1MB, 3)
$progressParams = @{
Activity = $ActivityName
Status = "Скачано: " + $currentMB.ToString("F3", [System.Globalization.CultureInfo]::InvariantCulture) + " МБ из " + $totalMB.ToString("F3", [System.Globalization.CultureInfo]::InvariantCulture) + " МБ"
}
if ($totalBytes) {
$progressParams.PercentComplete = [int](($totalBytesRead / $totalBytes) * 100)
}
Write-Progress @progressParams
}
$downloadStream.Close()
return [PSCustomObject]@{
StatusCode = [int]$response.StatusCode
StatusDescription = $response.StatusCode.ToString()
ContentLength = $totalBytes
Path = $OutFile
}
}
catch {
if (Test-Path $OutFile) { Remove-Item $OutFile -Force }
Write-Error $_.Exception.Message
return $null
}
finally {
if ($httpClient) { $httpClient.Dispose() }
Write-Progress -Activity $ActivityName -Completed
}
}
$res = Invoke-DownloadWithProgress -Uri $uri -OutFile $zipFile -ActivityName "Скачивание"
if (-not ($res -and $res.StatusCode -eq 200)) {
Write-Error "Не удалось скачать файл или сервер вернул ошибку."
} else {
Expand-Archive -Path $zipFile -DestinationPath $targetDir
}