Partilhar via


Gerenciar blobs de bloco com o PowerShell

O armazenamento de blobs suporta blobs de blocos, blobs de acréscimo e blobs de páginas. Os blobs de bloco são otimizados para carregar grandes quantidades de dados de forma eficiente. Os blobs de bloco são ideais para armazenar imagens, documentos e outros tipos de dados não submetidos a operações aleatórias de leitura e gravação. Este artigo explica como trabalhar com blobs de bloco.

Pré-requisitos

Configurar um objeto de contexto para encapsular credenciais

Todas as solicitações ao Armazenamento do Azure devem ser autorizadas. Você pode autorizar uma solicitação feita do PowerShell com sua conta do Microsoft Entra ou usando as chaves de acesso da conta. Os exemplos neste artigo usam a autorização do Microsoft Entra com objetos de contexto. Os objetos de contexto encapsulam suas credenciais do Microsoft Entra e as passam durante as operações de dados subsequentes.

Para entrar na sua conta do Azure com uma conta do Microsoft Entra, abra o PowerShell e chame o cmdlet Connect-AzAccount .

#Connect to your Azure subscription
Connect-AzAccount

Depois que a conexão for estabelecida, crie o contexto do Azure. A autenticação com o Microsoft Entra ID cria automaticamente um contexto do Azure para sua assinatura padrão. Em alguns casos, talvez seja necessário acessar recursos em uma assinatura diferente após a autenticação. Você pode alterar a assinatura associada à sua sessão atual do Azure modificando o contexto da sessão ativa.

Para usar sua assinatura padrão, crie o contexto chamando o New-AzStorageContext cmdlet. Inclua o parâmetro para que as -UseConnectedAccount operações de dados sejam executadas usando suas credenciais do Microsoft Entra.

#Create a context object using Azure AD credentials
$ctx = New-AzStorageContext -StorageAccountName <storage account name> -UseConnectedAccount

Para alterar assinaturas, recupere o objeto de contexto com o cmdlet Get-AzSubscription e, em seguida, altere o contexto atual com Set-AzContext. Para obter mais informações, consulte Alterar a assinatura ativa.

Criar um contentor

Todos os dados de blob são armazenados em contêineres, portanto, você precisa de pelo menos um recurso de contêiner antes de poder carregar dados. Se necessário, use o exemplo a seguir para criar um contêiner de armazenamento. Para obter mais informações, consulte Gerenciando contêineres de blob usando o PowerShell.

#Create a container object
$container = New-AzStorageContainer -Name "mycontainer" -Context $ctx

Ao usar os exemplos a seguir, você precisa substituir os valores de espaço reservado entre colchetes por seus próprios valores. Para obter mais informações sobre como entrar no Azure com o PowerShell, consulte Entrar com o Azure PowerShell.

Carregar um blob

Para carregar um arquivo em um blob de bloco, passe os valores de parâmetro necessários para o Set-AzStorageBlobContent cmdlet. Forneça o caminho e o nome do arquivo com o parâmetro e o nome do contêiner com o -File -Container parâmetro. Você também precisa fornecer uma referência ao objeto de contexto com o -Context parâmetro.

Este comando cria o blob, se ele não existir, ou solicita a confirmação de substituição, se ele existir. Você pode substituir o arquivo sem confirmação se passar o parâmetro para o -Force cmdlet.

O exemplo a seguir especifica um valor de parâmetro para carregar um -File único arquivo nomeado. Ele também demonstra o uso do operador de pipeline do PowerShell e Get-ChildItem do cmdlet para carregar vários arquivos. O Get-ChildItem cmdlet usa o -Path parâmetro para especificar C:\Temp\*.png. A inclusão do curinga asterisco (*) especifica todos os arquivos com a extensão de nome de arquivo .png . O -Recurse parâmetro pesquisa o diretório Temp e seus subdiretórios.

#Set variables
$path          = "C:\temp\" 
$containerName = "mycontainer"
$filename      = "demo-file.txt"
$imageFiles    = $path + "*.png"
$file          = $path + $filename

#Upload a single named file
Set-AzStorageBlobContent -File $file -Container $containerName -Context $ctx

#Upload multiple image files recursively
 Get-ChildItem -Path $imageFiles -Recurse | Set-AzStorageBlobContent -Container $containerName -Context $ctx

O resultado exibe o nome da conta de armazenamento, o nome do contêiner de armazenamento e fornece uma lista dos arquivos carregados.

   AccountName: demostorageaccount, ContainerName: demo-container

Name              BlobType   Length  ContentType                LastModified          AccessTier  IsDeleted
----              --------   ------  -----------                ------------          ----------  ---------
demo-file.txt     BlockBlob  222     application/octet-stream   2021-12-14 01:38:03Z  Cool        False     
hello-world.png   BlockBlob  14709   application/octet-stream   2021-12-14 01:38:03Z  Cool        False
hello-world2.png  BlockBlob  12472   application/octet-stream   2021-12-14 01:38:03Z  Cool        False
hello-world3.png  BlockBlob  13537   application/octet-stream   2021-12-14 01:38:03Z  Cool        False

Listar blobs

O Get-AzStorageBlob cmdlet é usado para listar blobs armazenados em um contêiner. Você pode usar várias abordagens para definir o escopo da sua pesquisa. Use o -Container parâmetro e -Name para listar um blob específico dentro de um contêiner conhecido. Para gerar uma lista não filtrada de todos os blobs dentro de um contêiner específico, use o -Container parâmetro sozinho, sem um -Name valor.

Não há restrição quanto ao número de contêineres ou blobs que uma conta de armazenamento pode ter. Para potencialmente evitar a recuperação de milhares de blobs, é uma boa ideia limitar a quantidade de dados retornados. Ao recuperar vários blobs, você pode usar o -Prefix parâmetro para especificar blobs cujos nomes começam com uma cadeia de caracteres específica. Você também pode usar o parâmetro com um curinga -Name para especificar nomes ou tipos de arquivo.

O -MaxCount parâmetro pode ser usado para limitar o número de blobs não filtrados retornados de um contêiner. Um limite de serviço de 5.000 é imposto a todos os recursos do Azure. Esse limite garante que quantidades gerenciáveis de dados sejam recuperadas e que o desempenho não seja afetado. Se o número de blobs retornados exceder o valor ou o -MaxCount limite de serviço, um token de continuação será retornado. Esse token permite que você use várias solicitações para recuperar qualquer número de blobs. Mais informações estão disponíveis em Enumerando recursos de blob.

O exemplo a seguir mostra várias abordagens usadas para fornecer uma lista de blobs. A primeira abordagem lista um único blob dentro de um recurso de contêiner específico. A segunda abordagem usa um curinga para listar todos os .jpg arquivos com um prefixo de Louis. A pesquisa é restrita a cinco contêineres usando o -MaxCount parâmetro. A terceira abordagem usa -MaxCount e -ContinuationToken parâmetros para limitar a recuperação de todos os blobs dentro de um contêiner.

#Set variables
$namedContainer  = "named-container"
$demoContainer   = "mycontainer"
$containerPrefix = "demo"

$maxCount = 1000
$total     = 0
$token     = $Null

#Approach 1: List all blobs in a named container
Get-AzStorageBlob -Container $namedContainer -Context $ctx

#Approach 2: Use a wildcard to list blobs in all containers
Get-AzStorageContainer -MaxCount 5 -Context $ctx | Get-AzStorageBlob -Blob "*louis*.jpg" 

#Approach 3: List batches of blobs using MaxCount and ContinuationToken parameters
Do
{
     #Retrieve blobs using the MaxCount parameter
     $blobs = Get-AzStorageBlob -Container $demoContainer `
         -MaxCount $maxCount `
         -ContinuationToken $token `
         -Context $ctx
     $blobCount = 1
     
     #Loop through the batch
     Foreach ($blob in $blobs)
     {
         #To-do: Perform some work on individual blobs here

         #Display progress bar
         $percent = $($blobCount/$maxCount*100)
         Write-Progress -Activity "Processing blobs" -Status "$percent% Complete" -PercentComplete $percent
         $blobCount++
     }

     #Update $total
     $total += $blobs.Count
      
     #Exit if all blobs processed
     If($blobs.Length -le 0) { Break; }
      
     #Set continuation token to retrieve the next batch
     $token = $blobs[$blobs.Count -1].ContinuationToken
 }
 While ($null -ne $token)
 Write-Host "`n`n   AccountName: $($ctx.StorageAccountName), ContainerName: $demoContainer `n"
 Write-Host "Processed $total blobs in $namedContainer."

As duas primeiras abordagens exibem os nomes da conta de armazenamento e do contêiner, além de uma lista dos blobs recuperados. A terceira abordagem exibe a contagem total de blobs dentro de um contêiner nomeado. Os blobs são recuperados em lotes e uma barra de status mostra o progresso durante a contagem.

   AccountName: demostorageaccount, ContainerName: named-container

Name                 BlobType    Length    ContentType    LastModified          AccessTier    IsDeleted
----                 --------    ------    -----------    ------------          ----------    ---------
index.txt            BlockBlob   222       text/plain     2021-12-15 22:00:10Z  Cool          False
miles-davis.txt      BlockBlob   23454     text/plain     2021-12-15 22:17:59Z  Cool          False
cab-calloway.txt     BlockBlob   18419     text/plain     2021-12-15 22:17:59Z  Cool          False
benny-goodman.txt    BlockBlob   17726     text/plain     2021-12-15 22:17:59Z  Cool          False


   AccountName: demostorageaccount, ContainerName: demo-container

Name                 BlobType    Length    ContentType    LastModified          AccessTier    IsDeleted
----                 --------    ------    -----------    ------------          ----------    ---------
louis-armstrong.jpg  BlockBlob   211482    image/jpeg     2021-12-14 01:38:03Z  Cool          False
louis-jordan.jpg     BlockBlob   55766     image/jpeg     2021-12-14 01:38:03Z  Cool          False
louis-prima.jpg      BlockBlob   290651    image/jpeg     2021-12-14 01:38:03Z  Cool          False


   AccountName: demostorageaccount, ContainerName: demo-container

Processed 5257 blobs in demo-container.

Transferir um blob

Dependendo do seu caso de uso, o Get-AzStorageBlobContent cmdlet pode ser usado para baixar um ou vários blobs. Como na maioria das operações, ambas as abordagens exigem um objeto de contexto.

Para baixar um único blob nomeado, você pode chamar o cmdlet diretamente e fornecer valores para os -Blob parâmetros e -Container . O blob é baixado para o diretório do PowerShell de trabalho por padrão, mas um local alternativo pode ser especificado. Para alterar o local de destino, um caminho válido e existente deve ser passado com o -Destination parâmetro. Como a operação não pode criar um destino, ela falhará com um erro se o caminho especificado não existir.

Vários blobs podem ser baixados combinando o cmdlet e o Get-AzStorageBlob operador de pipeline do PowerShell. Primeiro, crie uma lista de blobs com o Get-AzStorageBlob cmdlet. Em seguida, use o operador de pipeline e o Get-AzStorageBlobContent cmdlet para recuperar os blobs do contêiner.

O código de exemplo a seguir fornece um exemplo de abordagens de download único e múltiplo. Ele também oferece uma abordagem simplificada para pesquisar arquivos específicos em todos os contêineres usando um curinga. Como alguns ambientes podem ter centenas de milhares de recursos, o uso do -MaxCount parâmetro é recomendado.

#Set variables
$containerName = "mycontainer"
$path          = "C:\temp\downloads\"
$blobName      = "demo-file.txt"
$fileList      = "*.png"
$pipelineList  = "louis*"
$maxCount      = 10

#Download a single named blob
Get-AzStorageBlobContent -Container $containerName -Blob $blobName -Destination $path -Context $ctx

#Download multiple blobs using the pipeline
Get-AzStorageBlob -Container $containerName -Blob $fileList -Context $ctx | Get-AzStorageBlobContent

#Use wildcard to download blobs from all containers
Get-AzStorageContainer -MaxCount $maxCount `
     -Context $ctx | Get-AzStorageBlob `
     -Blob "louis*" | Get-AzStorageBlobContent

O resultado exibe os nomes da conta de armazenamento e do contêiner e fornece uma lista dos arquivos baixados.

   AccountName: demostorageaccount, ContainerName: demo-container

Name                 BlobType   Length  ContentType              LastModified          AccessTier  IsDeleted
----                 --------   ------  -----------              ------------          ----------  ---------
demo-file.txt        BlockBlob  222     application/octet-stream 2021-12-14 01:38:03Z  Unknown     False
hello-world.png      BlockBlob  14709   application/octet-stream 2021-12-14 01:38:03Z  Unknown     False
hello-world2.png     BlockBlob  12472   application/octet-stream 2021-12-14 01:38:03Z  Unknown     False
hello-world3.png     BlockBlob  13537   application/octet-stream 2021-12-14 01:38:03Z  Unknown     False

   AccountName: demostorageaccount, ContainerName: public-container

Name                 BlobType   Length  ContentType              LastModified          AccessTier  IsDeleted
----                 --------   ------  -----------              ------------          ----------  ---------
louis-armstrong.jpg  BlockBlob  211482  image/jpeg               2021-12-14 18:56:03Z  Unknown     False

   AccountName: demostorageaccount, ContainerName: read-only-container

Name                 BlobType   Length  ContentType              LastModified          AccessTier  IsDeleted
----                 --------   ------  -----------              ------------          ----------  ---------
louis-jordan.jpg     BlockBlob  55766   image/jpeg               2021-12-14 18:56:21Z  Unknown     False

   AccountName: demostorageaccount, ContainerName: hidden-container

Name                 BlobType   Length  ContentType              LastModified          AccessTier  IsDeleted
----                 --------   ------  -----------              ------------          ----------  ---------
louis-prima.jpg      BlockBlob  290651  image/jpeg               2021-12-14 18:56:45Z  Unknown     False

Gerenciar propriedades e metadados de blob

Um contêiner expõe as propriedades do sistema e os metadados definidos pelo usuário. As propriedades do sistema existem em cada recurso de Armazenamento de Blob. Algumas propriedades são somente leitura, enquanto outras podem ser lidas ou definidas. Sob as capas, algumas propriedades do sistema são mapeadas para determinados cabeçalhos HTTP padrão.

Os metadados definidos pelo usuário consistem em um ou mais pares nome-valor que você especifica para um recurso de Armazenamento de Blob. Você pode usar metadados para armazenar esses valores com o recurso. Os valores de metadados são apenas para seus próprios fins e não afetam como o recurso se comporta.

Lendo propriedades de blob

Para ler propriedades ou metadados de blob, você deve primeiro recuperar o blob do serviço. Use o Get-AzStorageBlob cmdlet para recuperar as propriedades e metadados de um blob, mas não seu conteúdo. Em seguida, use o BlobClient.GetProperties método para buscar as propriedades do blob. As propriedades ou metadados podem ser lidos ou definidos conforme necessário.

O exemplo a seguir recupera um blob e lista suas propriedades.

$blob = Get-AzStorageBlob -Blob "blue-moon.mp3" -Container "mycontainer" -Context $ctx
$properties = $blob.BlobClient.GetProperties()
Echo $properties.Value

O resultado exibe uma lista das propriedades do blob, conforme mostrado no exemplo a seguir.

LastModified                         : 11/16/2021 3:42:07 PM +00:00
CreatedOn                            : 11/16/2021 3:42:07 PM +00:00
Metadata                             : {}
BlobType                             : Block
LeaseDuration                        : Infinite
LeaseState                           : Available
LeaseStatus                          : Unlocked
ContentLength                        : 2163298
ContentType                          : audio/mpeg
ETag                                 : 0x8D9C0AA9E0CBA78
IsServerEncrypted                    : True
AccessTier                           : Cool
IsLatestVersion                      : False
TagCount                             : 0
ExpiresOn                            : 1/1/0001 12:00:00 AM +00:00
LastAccessed                         : 1/1/0001 12:00:00 AM +00:00
HasLegalHold                         : False

Ler e gravar metadados de blob

Os metadados de Blob são um conjunto opcional de pares nome/valor associados a um blob. Como mostrado no exemplo anterior, não há metadados associados a um blob inicialmente, embora eles possam ser adicionados quando necessário. Para atualizar metadados de blob, use o BlobClient.UpdateMetadata método. Esse método só aceita pares chave-valor armazenados em um objeto genérico IDictionary . Para obter mais informações, consulte a definição de classe BlobClient .

O exemplo abaixo primeiro atualiza e, em seguida, confirma os metadados de um blob e, em seguida, recupera-os. O blob de exemplo é liberado da memória para garantir que os metadados não estejam sendo lidos do objeto na memória.

#Set variable
$container = "mycontainer"
$blobName  = "blue-moon.mp3"

#Retrieve blob
$blob = Get-AzStorageBlob -Blob $blobName -Container $container -Context $ctx

#Create IDictionary, add key-value metadata pairs to IDictionary
$metadata = New-Object System.Collections.Generic.Dictionary"[String,String]"
$metadata.Add("YearWritten","1934")
$metadata.Add("YearRecorded","1958")
$metadata.Add("Composer","Richard Rogers")
$metadata.Add("Lyricist","Lorenz Hart")
$metadata.Add("Artist","Tony Bennett")

#Update metadata
$blob.BlobClient.SetMetadata($metadata, $null)

#Flush blob from memory, retrieve updated blob, retrieve properties
$blob = $null
$blob = Get-AzStorageBlob -Blob $blobName -Container $container -Context $ctx
$properties = $blob.BlobClient.GetProperties()
 
#Display metadata
Echo $properties.Value.Metadata

O resultado retorna os metadados recém-atualizados do blob, conforme mostrado no exemplo a seguir.

Key          Value         
---          -----         
YearWritten  1934          
YearRecorded 1958          
Composer     Richard Rogers
Lyricist     Lorenz Hart   
Artist       Tony Bennett

Operações de cópia para blobs

Há muitos cenários em que blobs de diferentes tipos podem ser copiados. Os exemplos neste artigo são limitados a blobs de bloco.

Copiar um blob de origem para um blob de destino

Para uma operação de cópia simplificada dentro da mesma conta de armazenamento, use o Copy-AzStorageBlob cmdlet. Como a operação está copiando um blob dentro da mesma conta de armazenamento, é uma operação síncrona. As operações entre contas são assíncronas.

Você deve considerar o uso do AzCopy para facilidade e desempenho, especialmente ao copiar blobs entre contas de armazenamento. O AzCopy é um utilitário da linha de comandos que pode utilizar para copiar blobs ou ficheiros de/para uma conta de armazenamento. Saiba mais sobre como começar a usar o AzCopy.

O exemplo abaixo copia o blob bannerphoto.png do contêiner de fotos para a pasta de fotos dentro do contêiner de arquivamento. Ambos os contêineres existem dentro da mesma conta de armazenamento. O resultado verifica o sucesso da operação de cópia.

$blobname = "bannerphoto.png"
Copy-AzStorageBlob -SrcContainer "photos" `
     -SrcBlob $blobname -DestContainer "archive" `
     -DestBlob $("photos/$blobname") -Context $ctx

AccountName: demostorageaccount, ContainerName: archive

Name                BlobType   Length  ContentType  LastModified          AccessTier  IsDeleted  VersionId
----                --------   ------  -----------  ------------          ----------  ---------  ---------
photos/bannerphoto  BlockBlob  12472   image/png    2021-11-27 23:11:43Z  Cool        False

Você pode usar o parâmetro para substituir um blob existente com o -Force mesmo nome no destino. Esta operação substitui efetivamente o blob de destino. Ele também remove quaisquer blocos não confirmados e substitui os metadados do blob de destino.

Copiar um instantâneo para um blob de destino com um nome diferente

O blob de destino resultante é um blob gravável e não um instantâneo.

O blob de origem para uma operação de cópia pode ser um blob de bloco, um blob de acréscimo, um blob de página ou um instantâneo. Se o blob de destino já existir, ele deverá ser do mesmo tipo de blob que o blob de origem. Um blob de destino existente é substituído.

O blob de destino não pode ser modificado enquanto uma operação de cópia estiver em andamento. Um blob de destino só pode ter uma operação de cópia pendente. Em outras palavras, um blob não pode ser o destino de várias operações de cópia pendentes.

Quando você copia um blob dentro da mesma conta de armazenamento, é uma operação síncrona. As operações de cópia entre contas são assíncronas.

Todo o blob ou arquivo de origem é sempre copiado. Não há suporte para copiar um intervalo de bytes ou um conjunto de blocos.

Quando um blob é copiado, suas propriedades do sistema são copiadas para o blob de destino com os mesmos valores.

Ele também mostra como abortar uma operação de cópia assíncrona.

Blobs de instantâneo

Um instantâneo é uma versão somente leitura de um blob que é tirado em um determinado momento. Um instantâneo de blob é idêntico ao seu blob base, exceto que um valor DateTime é acrescentado ao URI. Esse valor indica o momento em que o instantâneo foi tirado e oferece a única distinção entre o blob base e o instantâneo.

Quaisquer concessões associadas ao blob base não afetam o snapshot. Não é possível adquirir uma concessão em um instantâneo. Leia mais sobre instantâneos de Blob.

O código de exemplo a seguir recupera um blob de um contêiner de armazenamento e cria um instantâneo dele.

$blob = Get-AzStorageBlob -Container "manuscripts" -Blob "novels/fast-cars.docx" -Context $ctx
$blob.BlobClient.CreateSnapshot()

Definir camada de blob

Ao alterar a camada de um blob, você move o blob e todos os seus dados para a camada de destino. Para fazer a alteração, recupere um blob com o cmdlet e chame o Get-AzStorageBlob BlobClient.SetAccessTier método. Essa abordagem pode ser usada para alterar a camada entre quente, frio e arquivamento.

A mudança de níveis de frio ou quente para arquivamento ocorre quase imediatamente. Depois que um blob é movido para a camada de arquivamento, ele é considerado offline e não pode ser lido ou modificado. Antes de ler ou modificar os dados de um blob arquivado, você precisa reidratá-los para uma camada online. Leia mais sobre a reidratação de Blob a partir da camada de arquivo.

O código de exemplo a seguir define a camada como hot para todos os blobs dentro do archive contêiner.

$blobs = Get-AzStorageBlob -Container archive -Context $ctx
Foreach($blob in $blobs) {
    $blob.BlobClient.SetAccessTier("Hot")
}

Operações usando tags de blob

As tags de índice de Blob facilitam o gerenciamento e a descoberta de dados. As tags de índice de Blob são atributos de índice de chave-valor definidos pelo usuário que você pode aplicar aos seus blobs. Uma vez configurado, você pode categorizar e localizar objetos dentro de um contêiner individual ou em todos os contêineres. Os recursos de Blob podem ser categorizados dinamicamente atualizando suas tags de índice sem exigir uma alteração na organização do contêiner. As tags de índice oferecem uma maneira flexível de lidar com as mudanças nos requisitos de dados. Você pode usar metadados e tags de índice simultaneamente. Para obter mais informações sobre marcas de índice, consulte Gerenciar e localizar dados de Blob do Azure com marcas de índice de blob.

O exemplo a seguir ilustra como adicionar tags de índice de blob a uma série de blobs. O exemplo lê dados de um arquivo XML e os usa para criar marcas de índice em vários blobs. Para usar o código de exemplo, crie um arquivo blob-list.xml local no diretório C:\temp. Os dados XML são fornecidos no exemplo a seguir.

<Venue Name="House of Prime Rib" Type="Restaurant">
  <Files>
    <File path="transactions/12027121.csv" />
    <File path="campaigns/radio-campaign.docx" />
    <File path="photos/bannerphoto.png" />
    <File path="archive/completed/2020review.pdf" />
    <File path="logs/2020/01/01/logfile.txt" />
  </Files>
</Venue>

O código de exemplo cria uma tabela de hash e atribui a variável $tags a ela. Em seguida, ele usa os Get-Content cmdlets e Get-Data para criar um objeto com base na estrutura XML. Em seguida, ele adiciona pares chave-valor à tabela de hash para ser usado como os valores de tag. Finalmente, ele itera através do objeto XML e cria tags para cada File nó.

#Set variables
$filePath = "C:\temp\blob-list.xml"
$tags     = @{}

#Get data, set tag key-values
[xml]$data = Get-Content -Path $filepath
$tags.Add("VenueName", $data.Venue.Name)
$tags.Add("VenueType", $data.Venue.Type)
 
#Loop through files and add tag
$data.Venue.Files.ChildNodes | ForEach-Object {
    #break the path: container name, blob
    $path = $_.Path -split "/",2
   
    #set apply the blob tags
    Set-AzStorageBlobTag -Container $location[0] -Blob $location[1] -Tag $tags -Context $ctx
 }

Eliminar blobs

Você pode excluir um único blob ou uma série de blobs com o Remove-AzStorageBlob cmdlet. Ao excluir vários blobs, você pode utilizar operações condicionais, loops ou o pipeline do PowerShell, conforme mostrado nos exemplos a seguir.

Aviso

A execução dos exemplos a seguir pode excluir blobs permanentemente. A Microsoft recomenda habilitar a exclusão suave de contêiner para proteger contêineres e blobs contra exclusão acidental. Para obter mais informações, consulte Exclusão suave para contêineres.

#Create variables
$containerName  = "mycontainer"
$blobName       = "demo-file.txt"
$prefixName     = "file"

#Delete a single, named blob
Remove-AzStorageBlob -Blob $blobName -Container $containerName -Context $ctx

#Iterate a loop, deleting blobs
for ($i = 1; $i -le 3; $i++) { 
    Remove-AzStorageBlob -Blob (-join($prefixName, $i, ".txt")) -Container $containerName -Context $ctx
} 

#Retrieve blob list, delete using a pipeline
Get-AzStorageBlob -Prefix $prefixName -Container $containerName -Context $ctx | Remove-AzStorageBlob

Em alguns casos, é possível recuperar blobs que foram excluídos. Se a opção de proteção de dados de exclusão suave da sua conta de armazenamento estiver ativada, o -IncludeDeleted parâmetro retornará blobs excluídos dentro do período de retenção associado. Para saber mais sobre a exclusão suave, consulte o artigo Exclusão suave para blobs .

Use o exemplo a seguir para recuperar uma lista de blobs excluídos dentro do período de retenção associado ao contêiner. O resultado exibe uma lista de blobs excluídos recentemente.

#Retrieve a list of blobs including those recently deleted
Get-AzStorageBlob -Prefix $prefixName -IncludeDeleted -Context $ctx

AccountName: demostorageaccount, ContainerName: demo-container

Name       BlobType   Length  ContentType                LastModified          AccessTier    IsDeleted
----       --------   ------  -----------                ------------          ----------    ---------
file.txt   BlockBlob  22      application/octet-stream   2021-12-16 20:59:41Z  Cool          True
file2.txt  BlockBlob  22      application/octet-stream   2021-12-17 00:14:24Z  Cool          True
file3.txt  BlockBlob  22      application/octet-stream   2021-12-17 00:14:24Z  Cool          True
file4.txt  BlockBlob  22      application/octet-stream   2021-12-17 00:14:25Z  Cool          True

Restaurar um blob excluído

Conforme mencionado na seção Listar blobs, você pode configurar a opção de proteção de dados de exclusão suave em sua conta de armazenamento. Quando ativado, é possível restaurar blobs excluídos dentro do período de retenção associado. Você também pode usar o controle de versão para manter versões anteriores de seus blobs para cada recuperação e restauração.

Se o controle de versão do blob e o blob soft delete estiverem habilitados, modificar, substituir, excluir ou restaurar um blob criará automaticamente uma nova versão. O método usado para restaurar um blob excluído depende se o controle de versão está habilitado na sua conta de armazenamento.

O exemplo de código a seguir restaura todos os blobs excluídos por software ou, se o controle de versão estiver habilitado, restaura a versão mais recente de um blob. Primeiro, ele determina se o controle de versão está habilitado com o Get-AzStorageBlobServiceProperty cmdlet.

Se o controle de versão estiver habilitado, o Get-AzStorageBlob cmdlet recuperará uma lista de todas as versões de blob com nome exclusivo. Em seguida, as versões de blob na lista são recuperadas e ordenadas por data. Se nenhuma versão for encontrada com o valor do atributo, o LatestVersion Copy-AzBlob cmdlet será usado para fazer uma cópia ativa da versão mais recente.

Se o controle de versão estiver desabilitado, o BlobBaseClient.Undelete método será usado para restaurar cada blob excluído suavemente no contêiner.

Antes de seguir este exemplo, você precisa habilitar a exclusão virtual ou o controle de versão em pelo menos uma de suas contas de armazenamento.

Importante

O exemplo a seguir enumera um grupo de blobs e os armazena na memória antes de processá-los. Se o controle de versão estiver habilitado, os blobs também serão classificados. O uso do -ContinuationToken parâmetro com $maxCount variável limita o número de blobs dentro do grupo para conservar recursos. Se um contêiner tiver milhões de bolhas, isso será extremamente caro. Você pode ajustar o valor da $maxCount variável, embora se um contêiner tiver milhões de blobs, o script processará os blobs lentamente.

Para saber mais sobre a opção de proteção de dados de exclusão suave, consulte o artigo Exclusão suave para blobs .

$accountName   ="myStorageAccount"
$groupName     ="myResourceGroup"
$containerName ="mycontainer"
$maxCount      = 1000
$token         = $null


$blobSvc = Get-AzStorageBlobServiceProperty `
    -StorageAccountName $accountName `
    -ResourceGroupName $groupName

# If soft delete is enabled
if($blobSvc.DeleteRetentionPolicy.Enabled)
{
    # If versioning is enabled
    if($blobSvc.IsVersioningEnabled -eq $true)
    {
        # Set context
        $ctx = New-AzStorageContext `
            -StorageAccountName $accountName `
            -UseConnectedAccount
        do
        {
            # Get all blobs and versions using -Unique 
            # to avoid processing duplicates/versions
            $blobs = Get-AzStorageBlob `
                -Container $containerName `
                -Context $ctx -IncludeVersion | `
                    Where-Object {$_.VersionId -ne $null} | `
                    Sort-Object -Property Name -Unique

            # Iterate the collection
            foreach ($blob in $blobs)
            {
                # Process versions
                if($blob.VersionId -ne $null)
                {
            
                    # Get all versions of the blob, newest to oldest
                    $delBlob = Get-AzStorageBlob `
                        -Container $containerName `
                        -Context $ctx `
                        -Prefix $blob.Name `
                        -IncludeDeleted -IncludeVersion  | `
                            Sort-Object -Property VersionId -Descending

                    # Verify that the newest version is NOT the latest (that the version is "deleted")
                    if (-Not $delBlob[0].IsLatestVersion)
                    {
                        $delBlob[0] | Copy-AzStorageBlob `
                            -DestContainer $containerName `
                            -DestBlob $delBlob[0].Name
                    }
                
                    #Dispose the temporary object
                    $delBlob = $null
                }
            }
            $token = $blobs[$blobs.Count -1].ContinuationToken;
        }
        while ($null -ne $token)
    }

    # Otherwise (if versioning is disabled)
    else
    {
        $blobs = Get-AzStorageBlob `
            -Container $containerName `
            -Context $ctx -IncludeDeleted | `
                Where-Object {$_.IsDeleted}
        foreach($blob in $blobs)
        {
            if($blob.IsDeleted) { $blob.BlobBaseClient.Undelete() }
        }
    }
}
else
{
    echo "Sorry, the delete retention policy is not enabled."
}

Próximos passos