首页 > 解决方案 > Powershell 代码将 Blob 内容的所有子文件夹下载到本地到单个文件夹中

问题描述

场景说明 - 以前我尝试使用 PS 代码针对特定的 blob 路径文件夹和日期参数化进行将 blob 内容下载到本地的活动。现在工作正常。但是需要进行如下更改-当然欢迎提出想法,以便我可以推动它。我在 blob 路径中有多个子文件夹假设 - A/B/C、C 有文件夹 1、文件夹 2 等。我如何使用 PS 代码将所有内容放在一个文件夹中。现在,在 C 中,具有多个 blob 内容的子文件夹正在下载为一个文件夹,假设为 -00,01,02,就像 blob 中可用的内容一样。

标签: azurepowershellazure-blob-storage

解决方案


更新 0327:

下面的代码会将每个文件下载到每个文件夹中:

$container_name="test10"
$destination_path="d:\ccc"

$user="xxx"
$pwd = "xxxxxx"
$context = New-AzStorageContext -StorageAccountName $user -StorageAccountKey $pwd

$path = "A/B" 
#$date = (get-date).AddDays(-1).ToString("yyyy-MM-dd")
$date="2020-03-24"

$blobs = Get-AzStorageBlob -Container $container_name -Prefix "$path/$date" -Context $context

$i=0
foreach($blob in $blobs )
{

$blobName = $blob.Name -split "/" | select -Last 1
Write-Output "downloading blob $blobName"

$finalDirectory = New-Item -ItemType Directory -Force -Path "$($destination_path)\$i"

$finalPath = "$($finalDirectory)\$($blobName)"
$blob.ICloudBlob.DownloadToFile($finalPath,[System.IO.FileMode]::CreateNew)
$i=$i+1
}

Write-Output "***completed downloading***"

原答案:

如果您使用Get-AzStorageBlobContentcmdlet 下载 blob,则无法更改结构。

但是您可以使用$blob.ICloudBlob.DownloadToFile的方法$blob object,它可以满足您的要求:

示例代码(我自己测试,所有的blob,包括子文件夹中的blob都下载到本地一个文件夹中):

$container_name="test10"
$destination_path="d:\ccc"

$user="storage_account_name"
$pwd = "storage_account_key"
$context = New-AzStorageContext -StorageAccountName $user -StorageAccountKey $pwd    

$path = "A/B" 
$date = (get-date).AddDays(-1).ToString("yyyy-MM-dd")

$blobs = Get-AzStorageBlob -Container $container_name -Prefix "$path/$date" -Context $context

foreach($blob in $blobs )
{

#get the name by removing the directory/folder name of a blob
$blobName = $blob.Name -split "/" | select -Last 1
Write-Output "downloading blob $blobName"

$finalPath = "$($destination_path)\$($blobName)"
$blob.ICloudBlob.DownloadToFile($finalPath,[System.IO.FileMode]::CreateNew)

}

Write-Output "***completed downloading***"

如果您还有更多问题,请告诉我。


推荐阅读