Использование метода PowerShell v3 Invoke-RestMethod для PUT / POST X Mb двоичного файла - PullRequest
4 голосов
/ 04 февраля 2012

Я немного поработал с PowerShell v3 (CTP2 из здесь ) и его новым Invoke-RestMethod примерно так:

Invoke-RestMethod -Uri $ dest -method PUT-Credential $ cred -InFile $ file

Тем не менее, я хотел бы использовать это для проталкивания очень больших двоичных объектов и, следовательно, чтобы иметь возможность выдвигать диапазон байтов из большого двоичного файла.

Например, если у меня есть виртуальный жесткий диск 20 ГБ, я хотел бы разбить его на куски, скажем, по 5 ГБ каждый (без разбиения и сохранения отдельных блоков) иРазместите их в хранилище больших двоичных объектов, таких как S3, Rackspace, Azure и т. Д. Я также предполагаю, что размер порции больше доступной памяти.

Я прочитал, что Get-Content не очень эффективно работает на большихбинарные файлы, но это не кажется непонятным требованием.Есть ли у кого-нибудь appraoches, которые могут быть использованы для этого, особенно в сочетании с новым PowerShell Invoke-RestMethod?

Ответы [ 2 ]

1 голос
/ 25 июля 2012

Я считаю, что параметр Invoke-RestMethod, который вы ищете, равен

-TransferEncoding Chunked

, но нет никакого контроля над размером чанка или буфера.Кто-то может исправить меня, если я ошибаюсь, но я думаю, что размер чанка составляет 4 КБ.Каждый кусок загружается в память, а затем отправляется, поэтому память не заполняется отправляемым файлом.

0 голосов
/ 28 июля 2012

Чтобы получить разделы (порции) файла, вы можете создать System.IO.BinaryReader, который имеет удобный метод Read( [Byte[]] buffer, [int] offset, [int] length).Вот функция, чтобы сделать это легко:

function Read-Bytes {
    [CmdletBinding()]
    param (
          [Parameter(Mandatory = $true, Position = 0)]
          [string] $Path
        , [Parameter(Mandatory = $true, Position = 1)]
          [int] $Offset
        , [Parameter(Mandatory = $true, Position = 2)]
          [int] $Size
    )

    if (!(Test-Path -Path $Path)) {
        throw ('Could not locate file: {0}' -f $Path);
    }

    # Initialize a byte array to hold the buffer
    $Buffer = [Byte[]]@(0)*$Size;

    # Get a reference to the file
    $FileStream = (Get-Item -Path $Path).OpenRead();

    if ($Offset -lt $FileStream.Length) {
        $FileStream.Position = $Offset;
        Write-Debug -Message ('Set FileStream position to {0}' -f $Offset);
    }
    else {
        throw ('Failed to set $FileStream offset to {0}' -f $Offset);
    }

    $ReadResult = $FileStream.Read($Buffer, 0, $Size);
    $FileStream.Close();

    # Write buffer to PowerShell pipeline
    Write-Output -InputObject $Buffer;

}

Read-Bytes -Path C:\Windows\System32\KBDIT142.DLL -Size 10 -Offset 90;
...