Загрузить файл с powershell на Nano Server?
У меня возникли значительные трудности с выяснением того, как именно загрузить файл с помощью PowerShell под Nano Server.
Проблема заключается в следующем:
Нет Invoke-WebRequest
Там нет System.Net.WebClient
Старт-БитсТрансфера нет
Нет битсадмина
Кто-нибудь знает, как сделать эту (казалось бы, простую) задачу?
4 ответа
Здесь приведен пример загрузки zip-файла с помощью PowerShell в Nano, возможно, вам придется немного его изменить для своих целей;
(отсюда: https://docs.asp.net/en/latest/tutorials/nano-server.html)
$SourcePath = "https://dotnetcli.blob.core.windows.net/dotnet/beta/Binaries/Latest/dotnet-win-x64.latest.zip"
$DestinationPath = "C:\dotnet"
$EditionId = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' -Name 'EditionID').EditionId
if (($EditionId -eq "ServerStandardNano") -or
($EditionId -eq "ServerDataCenterNano") -or
($EditionId -eq "NanoServer") -or
($EditionId -eq "ServerTuva")) {
$TempPath = [System.IO.Path]::GetTempFileName()
if (($SourcePath -as [System.URI]).AbsoluteURI -ne $null)
{
$handler = New-Object System.Net.Http.HttpClientHandler
$client = New-Object System.Net.Http.HttpClient($handler)
$client.Timeout = New-Object System.TimeSpan(0, 30, 0)
$cancelTokenSource = [System.Threading.CancellationTokenSource]::new()
$responseMsg = $client.GetAsync([System.Uri]::new($SourcePath), $cancelTokenSource.Token)
$responseMsg.Wait()
if (!$responseMsg.IsCanceled)
{
$response = $responseMsg.Result
if ($response.IsSuccessStatusCode)
{
$downloadedFileStream = [System.IO.FileStream]::new($TempPath, [System.IO.FileMode]::Create, [System.IO.FileAccess]::Write)
$copyStreamOp = $response.Content.CopyToAsync($downloadedFileStream)
$copyStreamOp.Wait()
$downloadedFileStream.Close()
if ($copyStreamOp.Exception -ne $null)
{
throw $copyStreamOp.Exception
}
}
}
}
else
{
throw "Cannot copy from $SourcePath"
}
[System.IO.Compression.ZipFile]::ExtractToDirectory($TempPath, $DestinationPath)
Remove-Item $TempPath
}
Invoke-WebRequest
был добавлен в nanoserver в рамках накопительного обновления от 26 сентября 2016 г. для Windows Server 2016.
Сумасшедший факт, что серверная ОС, предназначенная для поддержки облачных рабочих нагрузок, не имеет встроенного удобного метода для простого запроса REST/Web:O
В любом случае, вы можете попробовать этот скрипт PowerShell wget.ps1, который является модификацией от Microsoft. Скопируйте сюда для удобства
<#
.SYNOPSIS
Downloads a file
.DESCRIPTION
Downloads a file
.PARAMETER Url
URL to file/resource to download
.PARAMETER Filename
file to save it as locally
.EXAMPLE
C:\PS> .\wget.ps1 https://dist.nuget.org/win-x86-commandline/latest/nuget.exe
#>
Param(
[Parameter(Position=0,mandatory=$true)]
[string]$Url,
[string]$Filename = ''
)
# Get filename
if (!$Filename) {
$Filename = [System.IO.Path]::GetFileName($Url)
}
Write-Host "Download: $Url to $Filename"
# Make absolute local path
if (![System.IO.Path]::IsPathRooted($Filename)) {
$FilePath = Join-Path (Get-Item -Path ".\" -Verbose).FullName $Filename
}
if (($Url -as [System.URI]).AbsoluteURI -ne $null)
{
# Download the bits
$handler = New-Object System.Net.Http.HttpClientHandler
$client = New-Object System.Net.Http.HttpClient($handler)
$client.Timeout = New-Object System.TimeSpan(0, 30, 0)
$cancelTokenSource = [System.Threading.CancellationTokenSource]::new()
$responseMsg = $client.GetAsync([System.Uri]::new($Url), $cancelTokenSource.Token)
$responseMsg.Wait()
if (!$responseMsg.IsCanceled)
{
$response = $responseMsg.Result
if ($response.IsSuccessStatusCode)
{
$downloadedFileStream = [System.IO.FileStream]::new($FilePath, [System.IO.FileMode]::Create, [System.IO.FileAccess]::Write)
$copyStreamOp = $response.Content.CopyToAsync($downloadedFileStream)
# TODO: Progress bar? Total size?
Write-Host "Downloading ..."
$copyStreamOp.Wait()
$downloadedFileStream.Close()
if ($copyStreamOp.Exception -ne $null)
{
throw $copyStreamOp.Exception
}
}
}
}
else
{
throw "Cannot download from $Url"
}
С тех пор, как Microsoft выпустила новый образ контейнера Windows Nano Server 1709, загрузка и извлечение файлов без PowerShell стало сложной задачей.
Недавно компания Microsoft Virtualization объявила, что в Windows 10 и Windows Nano Server будут добавлены два инструмента командной строки.
Инструменты:
Tar.exe — позволяет нам извлекать файлы и создавать архивы без PowerShell, что означает, что вы можете использовать его из командной строки.
Curl .exe– позволяет нам загружать файлы из интернет-источников и серверов, расположенных в нашей сети.
curl.exe -o node.zip https://nodejs.org/dist/v9.2.0/node-v9.2.0-win-x64.zip
Ссылка: https://www.ntweekly.com/2019/10/27/tar-and-curl-come-to-windows-nano-server-insider-image/