删除一个“;文件夹";在Azure Blob存储中

删除一个“;文件夹";在Azure Blob存储中,azure,azure-storage-blobs,azure-blob-storage,Azure,Azure Storage Blobs,Azure Blob Storage,我想从Azure Blob存储帐户的容器中删除文件夹。这一个包含3000多个文件,使用Azure Storage Explorer这是一个相当长的过程(1000个文件/5分钟),因此我想知道是否可以立即删除文件夹 我知道Azure Blob存储中没有“文件夹”,它更像是访问Blob的虚拟路径,但对于大量Blob的批量删除,这是有问题的。Ben我建议使用此Powershell脚本,允许每次删除10000个Blob: 此PowerShell脚本设计用于在Azure Automatiom中运行,通过一

我想从Azure Blob存储帐户的容器中删除文件夹。这一个包含3000多个文件,使用Azure Storage Explorer这是一个相当长的过程(1000个文件/5分钟),因此我想知道是否可以立即删除文件夹


我知道Azure Blob存储中没有“文件夹”,它更像是访问Blob的虚拟路径,但对于大量Blob的批量删除,这是有问题的。

Ben我建议使用此Powershell脚本,允许每次删除10000个Blob:

此PowerShell脚本设计用于在Azure Automatiom中运行,通过一次处理10000个blob来删除容器中的大量blob。当blob的数量超过几千个时,一次删除每个blob的常用方法可能会被挂起而无法完成任务。 这可用于删除所有Blob(当参数retentionDays提供为0时),或删除某些Blob,这些Blob在最近的RentutionDays天数内未被修改

脚本可在此处下载:


函数删除blob
{   
param(
[参数(必需=$true)]
[字符串]$CredentialsSetName,
[参数(必需=$true)]
[字符串]$Subscription,
[参数(必需=$true)]
[字符串]$container,
[参数(必需=$true)]
[字符串]$AzStorageName,
[参数(必需=$true)]
[Int]$保留天数
)
$Cred=获取自动PSCredential-名称$CredentialsSetName
$Account=添加AzureAccount-凭证$Cred
如果(!$Account)
{
写入输出“使用凭据资产连接到Azure订阅失败…”
打破
}
设置AzureSubscription-SubscriptionName$Subscription
$AzStorageKey=(获取AzureStorageKey-StorageAccountName$AzStorageName)。主
$context=New AzureStorageContext-StorageAccountName$AzStorageName-StorageAccountKey$AzStorageKey
$blobsremoved=0
$MaxReturn=10000
$Total=0
$Token=$Null
$TotalDel=0
$dateLimit=(获取日期).AddDays(-$retentionDays)
尝试
{
做
{
写入输出“检索blob”
$blobs=Get-AzureStorageBlob-Container$Container-context$context-MaxCount$MaxReturn-ContinuationToken$Token
$blobstodelete=$blobs |其中LastModified-LE$dateLimit
$Total+=$Blobs.Count
写入输出“$Total Retrieved Blob”
$Token=$Blobs[$Blobs.Count-1].ContinuationToken;
如果($Blobs.Length-le 0)
{ 
打破
}
如果($blobstodelete.Length-le 0)
{ 
继续;
}
$TotalDel+=$blobstodelete.Count
$blobstodelete |删除AzureStorageBlob-强制
写入输出“$TotalDel blobs已删除”
}
While($Token-ne$Null)
}
抓住
{
写入输出$_
}
}

Ben我建议使用此Powershell脚本,允许每次删除10000个:

此PowerShell脚本设计用于在Azure Automatiom中运行,通过一次处理10000个blob来删除容器中的大量blob。当blob的数量超过几千个时,一次删除每个blob的常用方法可能会被挂起而无法完成任务。 这可用于删除所有Blob(当参数retentionDays提供为0时),或删除某些Blob,这些Blob在最近的RentutionDays天数内未被修改

脚本可在此处下载:


函数删除blob
{   
param(
[参数(必需=$true)]
[字符串]$CredentialsSetName,
[参数(必需=$true)]
[字符串]$Subscription,
[参数(必需=$true)]
[字符串]$container,
[参数(必需=$true)]
[字符串]$AzStorageName,
[参数(必需=$true)]
[Int]$保留天数
)
$Cred=获取自动PSCredential-名称$CredentialsSetName
$Account=添加AzureAccount-凭证$Cred
如果(!$Account)
{
写入输出“使用凭据资产连接到Azure订阅失败…”
打破
}
设置AzureSubscription-SubscriptionName$Subscription
$AzStorageKey=(获取AzureStorageKey-StorageAccountName$AzStorageName)。主
$context=New AzureStorageContext-StorageAccountName$AzStorageName-StorageAccountKey$AzStorageKey
$blobsremoved=0
$MaxReturn=10000
$Total=0
$Token=$Null
$TotalDel=0
$dateLimit=(获取日期).AddDays(-$retentionDays)
尝试
{
做
{
写入输出“检索blob”
$blobs=Get-AzureStorageBlob-Container$Container-context$context-MaxCount$MaxReturn-ContinuationToken$Token
$blobstodelete=$blobs |其中LastModified-LE$dateLimit
$Total+=$Blobs.Count
写入输出“$Total Retrieved Blob”
$Token=$Blobs[$Blobs.Count-1].ContinuationToken;
如果($Blobs.Length-le 0)
{ 
打破
}
如果($blobstodelete.Length-le 0)
{ 
继续;
}
$TotalDel+=$blobstodelete.Count
$blobstodelete |删除AzureStorageBlob-强制
写入输出“$TotalDel blobs已删除”
}
While($Token-ne$Null)
}
抓住
{
写入输出$_
}
}

正如其他人已经提到的,您无法删除Azure Blob存储中的“文件夹”。您必须使用变通方法,例如列出带有前缀的所有文件,然后运行for循环来删除每个文件

在PowerShell中,通过运行以下命令(使用AzureRM模块),可以在一行中简化这两个步骤:

-WhatIf
选项将打印出它将要执行的确切操作。我观察到,它将为“文件夹”中的每个文件打印
What if:在目标上执行“Remove blob”操作…
。这可能意味着,这实际上是在做
    <#
.Synopsis
  Deletes large number of blobs in a container of Storage account, which are older than x days

.DESCRIPTION
  This Runbook deletes huge number of blobs in a container, by processing them in chunks of 10,000 blobs at a time. When the number of blobs grow beyond a couple of thousands, the usual method of deleting each blob at a time may just get suspended without completing the task. 

.PARAMETER CredentialAssetName
    The Credential asset which contains the credential for connecting to subscription

.PARAMETER Subscription
    Name of the subscription attached to the credential in CredentialAssetName

.PARAMETER container
    Container name from which the blobs are to be deleted

.PARAMETER AzStorageName
    The Storage Name to which the container belong to

.PARAMETER retentionDays
    Retention days. Blobs older than these many days will be deleted. To delete all, use 0

.NOTES
   AUTHOR: Anurag Singh, MSFT
   LASTEDIT: March 30, 2016
#>

function delete-blobs
{   
    param (
        [Parameter(Mandatory=$true)] 
        [String]  $CredentialAssetName,

        [Parameter(Mandatory=$true)]
        [String] $Subscription,

        [Parameter(Mandatory=$true)] 
        [String] $container,

        [Parameter(Mandatory=$true)] 
        [String] $AzStorageName,

        [Parameter(Mandatory=$true)] 
        [Int] $retentionDays
    )

$Cred = Get-AutomationPSCredential -Name $CredentialAssetName
$Account = Add-AzureAccount -Credential $Cred

if(!$Account) 
{
    write-output "Connection to Azure Subscription using the Credential asset failed..."
    Break;
}

set-AzureSubscription -SubscriptionName $Subscription

$AzStorageKey = (Get-AzureStorageKey -StorageAccountName $AzStorageName).Primary
$context = New-AzureStorageContext -StorageAccountName $AzStorageName -StorageAccountKey $AzStorageKey


$blobsremoved = 0
$MaxReturn = 10000
$Total = 0
$Token = $Null
$TotalDel = 0
$dateLimit = (get-date).AddDays(-$retentionDays) 

try
{
    do
    {
        Write-Output "Retrieving blobs"
        $blobs = Get-AzureStorageBlob -Container $container -context $context -MaxCount $MaxReturn  -ContinuationToken $Token 
        $blobstodelete =  $blobs | where LastModified -LE $dateLimit
        $Total += $Blobs.Count
        Write-Output "$Total  total Retrieved blobs"

        $Token = $Blobs[$blobs.Count -1].ContinuationToken;

        if($Blobs.Length -le 0) 
        { 
            break;
        }

        if($blobstodelete.Length -le 0) 
        { 
            continue;
        }

        $TotalDel += $blobstodelete.Count

        $blobstodelete  | Remove-AzureStorageBlob -Force 

        Write-Output "$TotalDel  blobs deleted"
    }
    While ($Token -ne $Null)
}

catch 
{
    write-output $_
}

}
Get-AzureStorageBlob -Context $context -Container $container -Blob 'FolderName*' | Remove-AzureStorageBlob -WhatIf