Как скачать файл как поток байтов? - PullRequest
1 голос
/ 03 июля 2019

Я пишу сценарий PS, который должен загрузить ключ дешифрования с сервера.Однако движок PS анализирует файл как текст, когда я хочу получить его как поток байтов.Например, файл содержит 84416e8e (ASCII: «AnŽ»), а загруженный файл содержит 6539653832646439 (ASCII: e9e82dd9). Я безуспешно пробовал оба Invoke-WebRequest и System.Net.WebClient, даже если у iwr есть опция -ContentType "application/octet-stream"

Редактировать: проблема может не касаться PS, я заметил, что открытие URL-адреса ключа через Firefox позволяет мне правильно загрузить файл, но открытие его через Chrome приводит к измененной версии.Я что-то упускаю здесь?

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

Я не совсем уверен, правильно ли я понял вопрос, но вы можете скачать двоичный файл и сохранить байты в файле.
Для демонстрации я использовал 7zip.exe.

$Response = Invoke-WebRequest -Uri "https://www.7-zip.org/a/7z1900-x64.exe" -OutFile "D:\decryption.key"

или с помощью BitsTransfer

Import-Module BitsTransfer
Start-BitsTransfer -Source "https://www.7-zip.org/a/7z1900-x64.exe" -Destination "D:\decryption.key"

Затем вы можете прочитать этот файл как байтовый массив, используя:

[byte[]]$bytes = [System.IO.File]::ReadAllBytes("D:\decryption.key")

Или как строку с отображением байтов 1: 1 с помощью этого помощника.функция:

function Import-BinaryString {
    # Imports the bytes of a file to a string that has a
    # 1-to-1 mapping back to the file's original bytes. 
    # Useful for performing binary regular expressions.
    Param (
        [Parameter(Mandatory = $True, ValueFromPipeline = $True, Position = 0)]
        [ValidateScript( { Test-Path $_ -PathType Leaf } )]
        [String]$Path
    )

    $Stream = New-Object System.IO.FileStream -ArgumentList $Path, 'Open', 'Read'

    # Note: Codepage 28591 returns a 1-to-1 char to byte mapping
    $Encoding     = [Text.Encoding]::GetEncoding(28591)
    $StreamReader = New-Object System.IO.StreamReader -ArgumentList $Stream, $Encoding
    $BinaryText   = $StreamReader.ReadToEnd()

    $StreamReader.Close()
    $Stream.Close()

    return $BinaryText
}

и использовать его с:

$binaryString = Import-BinaryString -Path "D:\decryption.key"

Надеюсь, что поможет

0 голосов
/ 03 июля 2019

Параметры OutFile записывают тело ответа в файл (в двоичном виде):

Invoke-WebRequest -OutFile tmp.png -Uri "https://upload.wikimedia.org/wikipedia/en/thumb/1/1d/Information_icon4.svg/40px-Information_icon4.svg.png"  

Возможно, вы обрабатывали тело ответа в конвейере как текст, что вы не можете сделать (кроме как после преобразования в Base64 или аналогичное).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...