Tải xuống một tệp với powershell trên Nano Server?


9

Tôi đã gặp một số khó khăn đáng kể khi tìm hiểu chính xác cách tải xuống tệp bằng PowerShell trong Máy chủ Nano.

Thách thức là như sau:

  • Không có Invoke-WebRequest

  • Không có System.Net.WebClient

  • Không có Start-BitsTransfer

  • Không có bitadmin

Có ai biết làm nhiệm vụ này (có vẻ đơn giản) không?

Câu trả lời:


4

Có một ví dụ ở đây về việc tải xuống tệp zip bằng PowerShell trên Nano, bạn có thể phải sửa đổi nó một chút cho mục đích của mình;

(từ đây: https://docs.asp.net/en/latest/tutorials/nano-server.html#installing-the-asp-net-core-module-ancm )

$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
}

3
Cảm ơn! Điều này là khá phức tạp cho những gì nó là mặc dù.
Tuy nhiên, một người dùng khác

1
A. Không phải tất cả các lệnh ghép ngắn đều có sẵn
Jim B

4

Invoke-WebRequestđã được thêm vào máy chủ nano như một phần của Bản cập nhật tích lũy ngày 26 tháng 9 năm 2016 cho Windows Server 2016 .


Tôi tin rằng các mẫu mã powershell mà bạn đang đề cập sẽ được chạy trên máy khách, không phải máy chủ lưu trữ Nano (nó nói "Trên hệ thống từ xa nơi bạn sẽ làm việc, hãy tải xuống ứng dụng khách Docker.: Invoke-WebRequest ...")
qbik

Tôi có thể sai nhưng tôi giả sử @ yet-other-user muốn sử dụng nó từ bên trong máy khách docker trong quá trình xây dựng.
mikebridge

2

Thật điên rồ khi một hệ điều hành máy chủ được thiết kế để cung cấp năng lượng cho khối lượng công việc đám mây không có phương thức thuận tiện được xây dựng sẵn cho một yêu cầu REST / Web đơn giản: O

Dù sao, bạn có thể thử tập lệnh powershell này wget.ps1 , đây là bản sửa đổi của tập lệnh từ Microsoft. Sao chép dán ở đây để thuận tiện

<#
.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"
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.