Powershell Azure存储API:下载整个文件夹/前缀/目录

Powershell Azure存储API:下载整个文件夹/前缀/目录,powershell,azure,azure-storage,Powershell,Azure,Azure Storage,我需要能够仅使用Azure storage REST API从blob存储帐户下载包含其内容的文件夹 我创建了一个函数(New-StorageAccountAthorisationHeader),该函数创建了(身份验证)头,我可以下载单个文件,但我找不到有关如何下载整个文件夹的任何参考 如果我将文件夹作为$blob参数传递,则会得到BlobNotFound错误 所述文件夹的URL为:。“somefolder”的内容如下所示: Folder1 FolderA FileA.txt

我需要能够仅使用Azure storage REST API从blob存储帐户下载包含其内容的文件夹

我创建了一个函数(
New-StorageAccountAthorisationHeader
),该函数创建了(身份验证)头,我可以下载单个文件,但我找不到有关如何下载整个文件夹的任何参考

如果我将文件夹作为
$blob
参数传递,则会得到
BlobNotFound
错误

所述文件夹的URL为:。“somefolder”的内容如下所示:

Folder1
  FolderA
     FileA.txt
  FolderB
    FileB.txt
    FileC.txt
新的StorageAccountAthorisationHeader:

function New-StorageAccountAuthorizationHeader
{
    [cmdletbinding()]
    param
    (
        [string]$StorageAccountName,
        [string]$Container,
        [string]$Blob,
        [string]$accesskey ,
        [string]$ResourceUri,
        [string]$xmsversion = "2017-04-17"
    )

    $xmsdate = Get-Date
    $xmsdate = $xmsdate.ToUniversalTime()
    $xmsdate = $xmsdate.toString('r')

    function GetRestApiParameters
    {
        [cmdletbinding()]
        param
        (
            [Parameter(Mandatory=$true)]
            [string]$Uri
        )

        if($Uri.Contains("?"))
        {
            Write-Verbose "URI to extract REST parameters: $uri"
            return ($Uri.Split("?")[1]).Split("&")
        }
    }

    Write-Verbose "Generating string for signature encryption..."

    $partUrl = "/$StorageAccountName/"

    if($Container)
    {
        $partUrl = $partUrl + "$Container/"
    }

    if($Blob)
    {
        $parturl = $partUrl + "$Blob"
    }

######Don't change the line count or indentation of the here-string#####
$hereString = @"
GET











x-ms-date:$xmsdate
x-ms-version:$xmsversion
$partUrl
"@


    $hereString =$hereString -replace "$([char]13)$([char]10)","$([char]10)" #Change `r`n to just `n

    $empty = $oSignature = New-Object System.Text.StringBuilder
    $empty = $oSignature.Append($hereString)

    Write-Verbose "Appending parameters from URI into authorisation string..."

    $restParameters = GetRestApiParameters -Uri $ResourceUri -Verbose

    if ($restParameters -ne $null)
    {
        foreach ($param in $restParameters)
        {
            $empty = $oSignature.Append("$([char]10)$($param.Replace('=',':'))")   
        }
    }

    #$oSignature.toString()

    Write-Verbose "Encrypting string..."
    $hmacsha = New-Object System.Security.Cryptography.HMACSHA256
    $hmacsha.key = [Convert]::FromBase64String($accesskey)
    $signature = $hmacsha.ComputeHash([Text.Encoding]::UTF8.GetBytes($oSignature.ToString()))
    $signature = [Convert]::ToBase64String($signature)

    Write-Verbose "Building header..."
    $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
    $headers.Add("x-ms-version", $xmsversion)
    $headers.Add("x-ms-date", $xmsdate)
    $headers.Add("Authorization", "SharedKey " + $StorageAccountName + ":" + $signature)
    #$headers.Add("x-ms-blob-type","BlockBlob")
    #$headers.Add("Content-Type", "application\xml")

    Write-Verbose ("Header: $($headers | Out-String)")

    Return $headers
}
我称之为:

$StorageAccountName = "mystorageaccount"
$container = "acontainer"
$blob = "somefile.txt"

$uriToDownloadBlobs = "https://" + $StorageAccountName + ".blob.core.windows.net/$container/$blob"

$header = $null
$header = New-StorageAccountAuthorizationHeader -StorageAccountName $StorageAccountName -ResourceUri $uriToDownloadBlobs -Verbose -Container $container -Blob $blob

$result = Invoke-WebRequest -Headers $header -Uri $uriToDownloadBlobs -OutFile C:\Temp\$blob -PassThru

$result

所以这是可行的,但正如我所说的,我需要任何提示来帮助下载整个文件夹。

看起来这是不可能的?尽管我很想看看Azure存储资源管理器是如何实现的


我的解决方案是压缩文件,然后使用上面的方法下载单个压缩文件。在两端都有几行额外的代码要压缩和提取,但这是当时最快的方法,并且可以很好地用于VSTS任务。

看起来这是不可能的?尽管我很想看看Azure存储资源管理器是如何实现的

我的解决方案是压缩文件,然后使用上面的方法下载单个压缩文件。两端都有几行额外的代码要压缩和提取,但这是当时最快的方法,并且可以很好地用于VSTS任务