我一直在使用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结合使用?
答案 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;