2012-02-04 9 views
4

の/ POST X MBのPUTするPowerShellのV3のinvoke-RestMethodを使用して、私はそうのようにPowerShellのV3(hereからCTP2)とその新しい呼び出し-RestMethodと仕事のビットをやっている:はバイナリファイル

Invoke- RestMethod -uri $ destの-method -Credential $クレド-infile $ファイルに

をPUTしかし、私は非常に大きなバイナリオブジェクトをプッシュするためにこれを使用したいのですが、そのための範囲をプッシュすることができるように大きなバイナリファイルのバイト数。

たとえば、20GbのVHDを使用している場合は、それぞれを5Gb(個々のチャンクを分割して保存せずに)に分割し、S3、RackspaceなどのBLOBストレージにPUT/POSTします、Azure、etc.私はまた、チャンクサイズが利用可能なメモリよりも大きいと仮定しています。

大きなバイナリファイルではGet-Contentがあまり効率的に機能しませんが、これはあいまいな要件ではありません。 PowerShellの新しいInvoke-RestMethodと組み合わせて、誰もこれに使用できるappraochesを持っていますか?

答えて

1

私は、あなたが探している起動-RestMethodパラメータは

-TransferEncoding Chunked 

ですが、チャンクまたはバッファサイズに対する制御がないと信じています。私が間違っていると誰かが私を修正できますが、チャンクサイズは4KBだと思います。各チャンクはメモリにロードされて送信されるので、送信しているファイルはメモリでいっぱいになりません。

0

ファイルのセクション(チャンク)を取得するには、便利なダンディRead([Byte[]] buffer, [int] offset, [int] length)メソッドを持つSystem.IO.BinaryReaderを作成できます。ここには簡単にする関数があります:

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; 
+0

とても便利です。これをinvoke-restmethodと組み合わせて、特定のファイルのXGbを最初にメモリにロードせずにurlにポストする例を教えてください(おそらく@ JakeRobinsonの以下のメソッドを使用しています)? – Aaron

関連する問題