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
Uma subscrição do Azure. Veja Obter versão de avaliação gratuita do Azure.
Módulo
Az
do Azure PowerShell , que é o módulo do PowerShell recomendado para interagir com o Azure. Para começar a utilizar o módulo Azure PowerShell, veja Instalar o Azure PowerShell.
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."
}