Gerenciar blobs de blocos com o PowerShell
O Armazenamento de Blobs dá suporte a blobs de blocos, blobs de acréscimo e blobs de páginas. Os blobs de blocos são otimizados para carregar grandes quantidades de dados de forma eficiente. Os blobs de blocos são ideais para armazenar imagens, documentos e outros tipos de dados não sujeitos a operações aleatórias de leitura e gravação. Este artigo explica como trabalhar com os blobs de blocos.
Pré-requisitos
Uma assinatura do Azure. Consulte Obter a avaliação gratuita do Azure.
O módulo
Az
do Azure PowerShell é o módulo do PowerShell recomendado para interagir com o Azure. Para começar a usar o módulo do Az PowerShell, confira Instalar o Azure PowerShell.
Configurar um objeto de contexto para encapsular credenciais
Toda solicitação para o Armazenamento do Microsoft Azure deve ser autorizada. Você pode autorizar uma solicitação feita no 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 operações de dados subsequentes.
Para entrar em 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 tiver sido 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. É possível alterar a assinatura associada à sessão atual do Azure modificando o contexto de sessão ativa.
Para usar sua assinatura padrão, crie o contexto chamando o cmdlet New-AzStorageContext
. Inclua o parâmetro -UseConnectedAccount
para que as 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 altere o contexto atual com Set-AzContext. Para obter mais informações, consulte Alterar a assinatura ativa.
Criar um contêiner
Todos os dados de blob são armazenados em contêineres, portanto, você precisa de pelo menos um recurso de contêiner antes de 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 em colchetes por seus próprios valores. Para obter mais informações sobre como entrar no Azure com o PowerShell, veja Conectar-se com o Azure PowerShell.
Carregar um blob
Para carregar um arquivo em um blob de blocos passe os valores de parâmetro necessários para o cmdlet Set-AzStorageBlobContent
. Fornece o caminho e o nome do arquivo -File
com o parâmetro e o nome do contêiner com o parâmetro -Container
. Você também precisa fornecer uma referência ao objeto de contexto com o parâmetro -Context
.
Esse comando cria o blob se ele não existir, ou solicita a confirmação de substituição, se existir. É possível substituir o arquivo sem confirmação se passar o parâmetro -Force
para o cmdlet.
O exemplo a seguir especifica um valor de parâmetro -File
para carregar um único arquivo nomeado. Ele também demonstra o uso do operador de pipeline e do cmdlet Get-ChildItem
do PowerShell para carregar vários arquivos. O Get-ChildItem
cmdlet usa o parâmetro -Path
para especificar C:\Temp\*.png. A inclusão do caractere curinga asterisco (*
) especifica todos os arquivos com a extensão .png do nome do arquivo. 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 cmdlet Get-AzStorageBlob
é usado para listar blobs armazenados em um contêiner. É possível usar várias abordagens para definir o escopo da pesquisa. Use o parâmetro -Container
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 em um contêiner específico, use o parâmetro -Container
sozinho, sem um valor -Name
.
Não há restrição no número de contêineres ou blobs que uma conta de armazenamento pode ter. Para 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 parâmetro -Prefix
para especificar blobs cujos nomes começam com uma cadeia de caracteres específica. Você também pode usar o parâmetro -Name
com um curinga para especificar nomes de arquivo ou tipos.
O parâmetro -MaxCount
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 -MaxCount
ou o 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 arquivos .jpg
com um prefixo de Louis. A pesquisa é restrita a cinco contêineres usando o parâmetro -MaxCount
. A terceira abordagem usa os parâmetros -MaxCount
e -ContinuationToken
para limitar 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 a conta de armazenamento e os nomes do contêiner, e uma lista dos blobs recuperados. A terceira abordagem exibe a contagem total de blobs em 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.
Baixar um blob
Dependendo do caso de uso, o cmdlet Get-AzStorageBlobContent
pode ser usado para baixar blobs individuais ou múltiplos. Assim 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 parâmetros -Blob
e -Container
. Por padrão, o download do blob é feito no diretório de trabalho do PowerShell, mas um local alternativo pode ser especificado. Para alterar o local de destino, um caminho válido e existente deve ser passado com o parâmetro -Destination
. Como a operação não pode criar um destino, ela vai falhar com um erro se o caminho especificado não existir.
Vários blobs podem ser baixados combinando o cmdlet Get-AzStorageBlob
e o operador de pipeline do PowerShell. Primeiro, crie uma lista de blobs com o cmdlet Get-AzStorageBlob
. Em seguida, use o operador de pipeline e o cmdlet Get-AzStorageBlobContent
para recuperar os blobs do contêiner.
O código de exemplo a seguir fornece um exemplo de abordagens de download simples e múltiplas. Ele também oferece uma abordagem simplificada para pesquisar todos os contêineres para arquivos específicos usando um curinga. Como alguns ambientes podem ter centenas de milhares de recursos, é recomendável usar o parâmetro -MaxCount
.
#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 a conta de armazenamento e os nomes de 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 metadados e propriedades de blob
Um contêiner expõe as propriedades do sistema e os metadados definidos pelo usuário. Existem propriedades do sistema em cada recurso de Armazenamento de Blobs. Algumas propriedades são somente leitura, enquanto outras podem ser lidas ou definidas. Internamente, algumas propriedades do sistema correspondem a certos 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 Blobs. É possível usar os metadados para armazenar esses valores com o recurso. Os valores de metadados são apenas para serem usados para os objetivos que você desejar e não afetam o comportamento do recurso.
Leitura de propriedades blob
Para ler propriedades de blob ou metadados, você deve primeiro recuperar o blob do serviço. Use o cmdlet Get-AzStorageBlob
para recuperar as propriedades e os metadados de um blob, mas não seu conteúdo. Em seguida, use o método BlobClient.GetProperties
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 seguinte exemplo.
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 blob são um conjunto opcional de pares de nome/valor associados a um blob. Como mostrado no exemplo anterior, não há metadados associados a um blob inicialmente, embora ele possa ser adicionado quando necessário. Para atualizar os metadados do blob, use o método BlobClient.UpdateMetadata
. Este método aceita apenas pares de valores-chave armazenados em um objeto IDictionary
genérico. Para obter mais informações, consulte a definição da classe BlobClient.
O exemplo abaixo primeiro atualiza e, em seguida, confirma os metadados de um blob e, em seguida, os recupera. O blob de exemplo é liberado da memória para garantir que os metadados não estão 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 seguinte exemplo.
Key Value
--- -----
YearWritten 1934
YearRecorded 1958
Composer Richard Rogers
Lyricist Lorenz Hart
Artist Tony Bennett
Copiar operações para blobs
Há muitos cenários em que blobs de diferentes tipos podem ser copiados. Os exemplos neste artigo estão limitados a blob de blocos.
Copiar um blob de origem para um blob de destino
Para uma operação de cópia simplificada na mesma conta de armazenamento, use o cmdlet Copy-AzStorageBlob
. Como a operação está copiando um blob dentro da mesma conta de armazenamento, é uma operação síncrona. Operações entre contas são assíncronas.
Você deve considerar o uso do AzCopy para facilitar e melhorar o desempenho, especialmente ao copiar blobs entre contas de armazenamento. AzCopy é um utilitário de linha de comando que você pode usar para copiar blobs ou arquivos de ou para uma conta de armazenamento. Saiba mais sobre como Introdução ao AzCopy.
O exemplo a seguir copia o blob bannerphoto.png do contêiner de fotos para a pasta de fotos dentro do contêiner de arquivo morto. Ambos os contêineres existem na 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 -Force
para substituir um blob existente com o mesmo nome no destino. Essa operação substitui efetivamente o blob de destino. Ela também remove todos os blocos não confirmadas 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 blocos, um blob de acréscimo, um blob de páginas ou um instantâneo. Se o blob de destino já existir, ele deverá ser do mesmo tipo do blob de origem. Um blob de destino existente é substituído.
O blob de destino não pode ser modificado quando uma operação de cópia está em andamento. Um blob de destino pode ter apenas uma operação pendente de cópia. Em outras palavras, um blob não pode ser o destino de várias operações pendentes de cópia.
Quando você copia um blob dentro da mesma conta de armazenamento, a operação é síncrona. As operações de cópia entre contas são assíncronas.
O arquivo ou blob de origem completo é sempre copiado. Não há suporte para a cópia de um intervalo de bytes ou um conjunto de blocos.
Quando um blob é copiado, suas propriedades do sistema são copiadas no blob de destino com os mesmos valores.
Ele também mostra como anular uma operação de cópia assíncrona.
Instantâneos de blobs
Um instantâneo é uma versão somente leitura de um blob capturada em um momento no tempo. Um instantâneo de blob é idêntico ao blob base, exceto que um valor DateTime é acrescentado ao URI. Esse valor indica a hora 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 básico não afetam o instantâneo. 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 do blob
Ao alterar a camada de um blob, você move o blob e todos os dados dele para a camada de destino. Para fazer isso, recupere um blob com o cmdlet Get-AzStorageBlob
e chame o método BlobClient.SetAccessTier
. Essa abordagem pode ser usada para alterar a camada entre frequente, esporádico e arquivos.
A alteração das camadas de esporádico ou frequente para arquivos ocorre quase imediatamente. Depois que um blob é movido para a camada arquivos, ele será considerado offline e não poderá ser lido nem alterado. Antes de poder ler ou modificar os dados de um blob arquivado, você precisa reidratá-lo para uma camada de serviço online. Leia mais sobre a Reidratação de blob da camada de arquivos.
O código de exemplo a seguir define a camada como frequente para todos os blobs dentro do contêiner archive
.
$blobs = Get-AzStorageBlob -Container archive -Context $ctx
Foreach($blob in $blobs) {
$blob.BlobClient.SetAccessTier("Hot")
}
Operações usando marcas blob
As marcas de índice de blob facilitam o gerenciamento e a descoberta de dados. As marcas de índice blob são atributos de índice de valor-chave definidos pelo usuário que você pode aplicar aos seus blobs. Depois de configurado, você pode categorizar e encontrar objetos em um contêiner individual ou em todos os contêineres. Os recursos blob podem ser categorizados dinamicamente atualizando suas marcas de índice sem exigir uma alteração na organização do contêiner. As marcas de índice oferecem um modo flexível de lidar com a alteração dos requisitos de dados. É possível usar metadados e marcas de índice simultaneamente. Para obter mais informações sobre marcas de índice, confira Gerenciar e localizar dados de blob do Azure com marcas de índice de blob.
O exemplo a seguir ilustra como adicionar marcas 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 no diretório C:\temp. Os dados XML são fornecidos no seguinte exemplo.
<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 $tags variável a ela. Em seguida, ele usa Get-Content
e os cmdlets Get-Data
para criar um objeto com base na estrutura XML. Em seguida, adiciona pares de valores-chave à tabela de hash a ser usada como os valores de marca. Por fim, ele itera através do objeto XML e cria marcas para cada nó File
.
#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
}
Excluir blobs
Você pode excluir um único blob ou uma série de blobs com o cmdlet Remove-AzStorageBlob
. Ao excluir vários blobs, você pode utilizar operações condicionais, loops ou o pipeline do PowerShell, conforme mostrado nos seguintes exemplos.
Aviso
Executar os exemplos a seguir pode excluir permanentemente os blobs. A Microsoft recomenda habiltar a exclusão temporária do contêiner para proteger contêineres e blobs contra exclusão acidental. Para obter mais informações, consulte Exclusão temporária 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 temporária de sua conta de armazenamento estiver habilitada, o parâmetro -IncludeDeleted
vai retornar blobs excluídos dentro do período de retenção associado. Para saber mais sobre a exclusão temporária, confira o artigo Exclusão temporária para blobs.
Use o exemplo a seguir para recuperar uma lista de blobs excluídos no 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, é possível configurar a opção de proteção de dados de exclusão temporária em sua conta de armazenamento. Quando habilitado, é possível restaurar contêineres excluídos dentro do período de retenção associado. Use o controle de versão para manter automaticamente as versões anteriores dos blobs para recuperação e restauração.
Se o controle de versão de blob e a exclusão temporária de blob estiverem habilitados em uma conta de armazenamento, a substituição de um blob criará automaticamente uma nova versão. O método usado para restaurar um blob excluído depende de o controle de versão estar habilitado em sua conta de armazenamento.
O exemplo de código a seguir restaura todos os blobs com exclusão temporária ou, caso o controle de versão estiver habilitado, restaura a versão mais recente de um blob. Ele determina primeiro se o controle de versão está habilitado com o cmdlet Get-AzStorageBlobServiceProperty
.
Se o controle de versão estiver habilitado, o cmdlet Get-AzStorageBlob
recuperará uma lista de todas as versões de blob nomeadas exclusivamente. Em seguida, as versões de blob na lista são recuperadas e ordenadas por data. Se não for encontrada nenhuma versão com o valor do atributo LatestVersion
, o cmdlet Copy-AzBlob
será usado para fazer uma cópia ativa da versão mais recente.
Se o controle de versão estiver desabilitado, o método BlobBaseClient.Undelete
será usado para restaurar cada blob excluído de forma reversível no contêiner.
Antes de seguir este exemplo, você precisa habilitar a exclusão temporária ou o controle de versão em pelo menos uma de suas contas de armazenamento.
Importante
O seguinte exemplo 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 parâmetro -ContinuationToken
com a variável $maxCount
limita o número de blobs dentro do grupo para conservar recursos. Se um contêiner tiver milhões de blobs, isto será extremamente caro. Você pode ajustar o valor da variável $maxCount
, mas 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 temporária, confira o artigo Exclusão temporária 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."
}