使用PowerShell v3的Invoke-RestMethod来PUT / POST X Mb的二进制文件

时间:2012-02-04 08:23:05

标签: powershell powershell-v3.0

我一直在使用PowerShell v3(来自here的CTP2)及其新的Invoke-RestMethod做一些工作:

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

但是,我想使用它来推送非常大型二进制对象,因此能够从大型二进制文件中推送范围字节。

例如,如果我有一个20Gb的VHD,我想把它分解成每个5Gb的块(不先拆分并保存各个块)并将它们PUT / POST到BLOB存储,如S3,Rackspace, Azure等我也假设块大小比可用内存大。

我读过Get-Content在大型二进制文件上效率不高,但这似乎不是一个模糊的要求。有没有人可以使用任何appraoches,特别是与PowerShell的新Invoke-RestMethod结合使用?

2 个答案:

答案 0 :(得分:1)

我相信您正在寻找的Invoke-RestMethod参数是

-TransferEncoding Chunked

但无法控制块或缓冲区大小。如果我错了,有人可以纠正我,但我认为块大小是4KB。每个块都被加载到内存中然后发送,因此你的内存不会填满你发送的文件。

答案 1 :(得分:0)

要检索文件的部分(块),您可以创建一个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;