Compartir por


Administración de blobs en bloques con PowerShell

Blob Storage admite blobs en bloques, blobs en anexos y blobs en páginas. Los blobs en bloques están optimizados para cargar grandes cantidades de datos de forma eficaz. Resultan muy adecuados para almacenar imágenes, documentos y otros tipos de datos que no están sujetos a operaciones aleatorias de lectura y escritura. En este artículo se explica cómo trabajar con los blobs en bloques.

Prerrequisitos

Configuración de un objeto de contexto para encapsular credenciales

Cada solicitud para Azure Storage se debe autorizar. Puede autorizar una solicitud realizada desde PowerShell con su cuenta Microsoft Entra o utilizando las claves de acceso a la cuenta. Los ejemplos de este artículo utilizan la autorización Microsoft Entra con objetos de contexto. Los objetos de contexto encapsulan sus credenciales de Microsoft Entra y las pasan durante operaciones de datos subsecuentes.

Para iniciar sesión en su cuenta Azure con una cuenta Microsoft Entra, abra PowerShell y llame al cmdlet Connect-AzAccount.

#Connect to your Azure subscription
Connect-AzAccount

Una vez establecida la conexión, cree el contexto de Azure. La autenticación con Microsoft Entra ID crea automáticamente un contexto Azure para su suscripción predeterminada. En algunos casos, puede que necesite acceder a los recursos de otra suscripción después de la autenticación. Para ello, puede cambiar la suscripción asociada a la sesión de Azure actual mediante la modificación del contexto de la sesión activa.

Para usar la suscripción predeterminada, llame al cmdlet New-AzStorageContext para crear el contexto. Incluya el parámetro -UseConnectedAccount para que las operaciones de datos se realicen utilizando sus credenciales de Microsoft Entra.

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

Para cambiar las suscripciones, recupere el objeto de contexto con el cmdlet Get-AzSubscription y, a continuación, cambie el contexto actual con Set-AzContext. Para obtener más información, consulte Cambio de la suscripción activa.

Crear un contenedor

Todos los datos de blob se almacenan en contenedores, por lo que necesita al menos un recurso de contenedor antes de poder cargar datos. Si es necesario, use el ejemplo siguiente para crear un contenedor de almacenamiento. Para obtener más información, consulte Administración de contenedores de blobs con PowerShell.

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

Cuando use los ejemplos siguientes, tiene que reemplazar los valores de marcador de posición entre corchetes por sus propios valores. Para obtener más información sobre cómo iniciar sesión en Azure con PowerShell, consulte Inicio de sesión con Azure PowerShell.

Carga de un blob

Para cargar un archivo en un blob en bloques, pase los valores de parámetro requeridos al cmdlet Set-AzStorageBlobContent. Proporcione la ruta de acceso y el nombre de archivo con el parámetro -File y el nombre del contenedor con el parámetro -Container. También debe proporcionar una referencia al objeto de contexto con el parámetro -Context.

Este comando crea el blob si no existe o solicita la confirmación de sobrescritura si existe. Puede sobrescribir el archivo sin confirmación si pasa el parámetro -Force al cmdlet.

En el ejemplo siguiente se especifica un valor de parámetro -File para cargar un único archivo con nombre. También se muestra el uso del operador de canalización y el cmdlet Get-ChildItem de PowerShell para cargar varios archivos. El cmdlet Get-ChildItem usa el parámetro -Path para especificar C:\Temp\*.png. La inclusión del carácter comodín de asterisco (*) especifica todos los archivos con la extensión de nombre de archivo .png. El parámetro -Recurse busca en el directorio Temp y sus subdirectorios.

#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

El resultado muestra el nombre de la cuenta de almacenamiento, el nombre del contenedor de almacenamiento y proporciona una lista de los archivos cargados.

   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

Enumeración de blobs

El cmdlet Get-AzStorageBlob se usa para enumerar los blobs almacenados en un contenedor. Puede usar varios enfoques para definir el ámbito de la búsqueda. Use los parámetros -Container y -Name para enumerar un blob específico dentro de un contenedor conocido. Para generar una lista sin filtrar de todos los blobs de un contenedor específico, use el parámetro -Container solo, sin el valor -Name.

No hay ninguna restricción respecto al número de contenedores o blobs que puede tener una cuenta de almacenamiento. Para evitar que se recuperen miles de blobs, es conveniente limitar la cantidad de datos que se devuelven. Al recuperar varios blobs, puede usar el parámetro -Prefix para especificar los blobs cuyos nombres comienzan con una cadena específica. También puede usar el parámetro -Name con un carácter comodín para especificar tipos o nombres de archivo.

El parámetro -MaxCount se puede usar para limitar el número de blobs sin filtrar devueltos desde un contenedor. Se impone un límite de servicio de 5000 en todos los recursos de Azure. Este límite garantiza que se recuperen cantidades de datos administrables y que el rendimiento no se vea afectado. Si el número de blobs devueltos supera el valor -MaxCount o el límite de servicio, se devuelve un token de continuación. Este token le permite usar varias solicitudes para recuperar un número de blobs cualquiera. Puede encontrar más información en Enumeración de recursos de blob.

En el ejemplo siguiente se muestran varios enfoques usados para proporcionar una lista de blobs. En el primer enfoque se enumera un solo blob dentro de un recurso de contenedor específico. En el segundo enfoque se usa un carácter comodín para enumerar todos los archivos .jpg con el prefijo Louis. La búsqueda se restringe a cinco contenedores con el parámetro -MaxCount. En el tercer enfoque se usan los parámetros -MaxCount y -ContinuationToken para limitar la recuperación de todos los blobs de un contenedor.

#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."

Los dos primeros enfoques muestran los nombres de la cuenta de almacenamiento y del contenedor, así como una lista de los blobs recuperados. El tercer enfoque muestra el recuento total de blobs de un contenedor con nombre. Los blobs se recuperan por lotes y una barra de estado muestra el progreso durante el recuento.

   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.

Descarga de un blob

En función de su caso de uso, el cmdlet Get-AzStorageBlobContent se puede usar para descargar uno o varios blobs. Al igual que con la mayoría de las operaciones, ambos enfoques requieren un objeto de contexto.

Para descargar un único blob con nombre, puede llamar al cmdlet directamente y proporcionar valores para los parámetros -Blob y -Container. De forma predeterminada, el blob se descarga en el directorio de trabajo de PowerShell, pero puede especificarse una ubicación alternativa. Para cambiar la ubicación de destino, se debe pasar una ruta de acceso válida y existente con el parámetro -Destination. Dado que la operación no puede crear un destino, se produce un error si la ruta de acceso especificada no existe.

Para descargar varios blobs, combine el cmdlet Get-AzStorageBlob y el operador de canalización de PowerShell. En primer lugar, cree una lista de blobs con el cmdlet Get-AzStorageBlob. A continuación, use el operador de canalización y el cmdlet Get-AzStorageBlobContent para recuperar los blobs del contenedor.

En el código de ejemplo siguiente se proporcionan enfoques de descarga única y múltiple. También se ofrece un enfoque simplificado para buscar archivos específicos en todos los contenedores con un carácter comodín. Dado que algunos entornos pueden tener cientos de miles de recursos, se recomienda usar el 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

El resultado muestra los nombres de la cuenta de almacenamiento y del contenedor y proporciona una lista de los archivos descargados.

   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

Administración de propiedades y metadatos de blobs

Un contenedor expone tanto propiedades del sistema como metadatos definidos por el usuario. Existen propiedades del sistema en todos los recursos de Blob Storage. Algunas propiedades son de solo lectura, mientras que otras se pueden leer o establecer. En segundo plano, algunas propiedades del sistema se asignan a ciertos encabezados HTTP estándar.

Los metadatos definidos por el usuario se componen de uno o varios pares nombre-valor que especifica para un recurso de Blob Storage. Puede usar metadatos para almacenar estos valores con el recurso. Los valores de metadatos se proporcionan para uso personal y no afectan a cómo se comporta el recurso.

Lectura de propiedades de un blob

Para leer las propiedades o los metadatos de un blob, primero debe recuperar el blob del servicio. Use el cmdlet Get-AzStorageBlob para recuperar las propiedades y los metadatos de un blob, pero no su contenido. A continuación, use el método BlobClient.GetProperties para capturar las propiedades del blob. Las propiedades o los metadatos se pueden leer o establecer después según sea necesario.

En el ejemplo siguiente se recupera un blob y se enumeran sus propiedades.

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

El resultado muestra una lista de las propiedades del blob, como se muestra en el siguiente ejemplo.

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

Lectura y escritura de los metadatos de un blob

Los metadatos de un blob son un conjunto opcional de pares nombre-valor asociados a un blob. Tal y como se muestra en el ejemplo anterior, no hay metadatos asociados a un blob inicialmente, aunque se pueden agregar cuando sea necesario. Para actualizar los metadatos del blob, se usa el método BlobClient.UpdateMetadata. Este método solo acepta pares clave-valor almacenados en un objeto IDictionary genérico. Para obtener más información, vea la definición de clase BlobClient.

En el ejemplo siguiente, primero se actualizan los metadatos de un blob, luego se confirman y, a continuación, se recuperan. El blob de ejemplo se vacía de la memoria para asegurarse de que los metadatos no se lean desde el objeto en memoria.

#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

El resultado devuelve los metadatos recién actualizados del blob, como se muestra en el siguiente ejemplo.

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

Operaciones de copia de los blobs

Hay muchos escenarios en los que se pueden copiar blobs de diferentes tipos. Los ejemplos de este artículo se limitan a los blobs en bloques.

Copia de un blob de origen en un blob de destino

Para realizar una operación de copia simplificada dentro de la misma cuenta de almacenamiento, use el cmdlet Copy-AzStorageBlob. Dado que la operación copia un blob dentro de la misma cuenta de almacenamiento, se trata de una operación sincrónica. Las operaciones entre cuentas son asincrónicas.

Considere la posibilidad de usar AzCopy para mayor facilidad y un mejor rendimiento, sobre todo al copiar blobs entre cuentas de almacenamiento. AzCopy es una utilidad de línea de comandos que puede usar para copiar blobs o archivos a una cuenta de almacenamiento o desde una cuenta de almacenamiento. Obtenga más información sobre cómo empezar en Introducción a AzCopy.

En el ejemplo siguiente se copia el blob bannerphoto.png del contenedor photos a la carpeta photos dentro del contenedor archive. Ambos contenedores existen dentro de la misma cuenta de almacenamiento. El resultado comprueba si la operación de copia se ha realizado correctamente.

$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

Puede usar el parámetro -Force para sobrescribir un blob existente con el mismo nombre en el destino. Esta operación reemplaza de forma eficaz el blob de destino. También quita los bloques sin confirmar y sobrescribe los metadatos del blob de destino.

Copia de una instantánea en un blob de destino con otro nombre

El blob resultante de destino es un blob en el que se puede escribir y no una instantánea.

El blob de origen para una operación de copia puede ser un blob en bloques, un blob en anexos, un blob en páginas o una instantánea. Si el blob de destino ya existe, debe ser del mismo tipo que el blob de origen. Si existe un blob de destino, se sobrescribe.

No se puede modificar el blob de destino mientras haya una operación de copia en curso. Un blob de destino solo puede tener una operación de copia pendiente. En otras palabras, un blob no puede ser el destino de varias operaciones de copia pendientes.

Cuando se copia un blob dentro de la misma cuenta de almacenamiento, se trata de una operación sincrónica. Las operaciones de copia entre cuentas son asincrónicas.

Siempre se copia el blob o el archivo de origen completo, No se admite la copia de un intervalo de bytes o un conjunto de bloques.

Cuando se copia un blob, las propiedades del sistema al que pertenece se copian en el blob de destino con los mismos valores.

También se muestra cómo anular una operación de copia asincrónica.

Blobs de instantáneas

Una instantánea es una versión de solo lectura de un blob que se ha realizado en un momento dado. Una instantánea de blob es idéntica a su blob base, excepto que se anexa un valor DateTime al URI. Este valor indica la hora en la que se tomó la instantánea y ofrece la única distinción entre el blob base y la instantánea.

Las concesiones asociadas con el blob base no afectan a la instantánea. No puede adquirir una concesión sobre una instantánea. Obtenga más información sobre las Instantáneas de blob.

El código de ejemplo siguiente recupera un blob de un contenedor de almacenamiento y crea una instantánea de este.

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

Establecer nivel de blob

Cuando se cambia el nivel de un blob, se mueve el blob y todos sus datos al nivel de destino. Para ello, recupere un blob con el cmdlet Get-AzStorageBlob y llame al método BlobClient.SetAccessTier. Este enfoque se puede usar para cambiar el nivel entre frecuente, esporádico y archivo.

El cambio de los niveles de esporádico o frecuente a archivo se realiza de forma casi inmediata. Una vez que un blob se mueve al nivel archivo, se considera que está desconectado y no se puede leer ni modificar. Antes de poder leer o modificar los datos de un blob archivado, tiene que rehidratarlo a un nivel en línea. Obtenga más información sobre la Rehidratación de blobs desde el nivel de archivo.

El siguiente código de ejemplo establece el nivel en frecuente para todos los blobs dentro del contenedor archive.

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

Operaciones con etiquetas de blob

Las etiquetas de índice de blobs facilitan la administración y la detección de datos. Estas etiquetas son atributos de índice de clave-valor definidos por el usuario que pueden aplicarse a los blobs. Una vez configuradas, puede clasificar y buscar objetos en un único contenedor o en todos los contenedores. Los recursos de blob se pueden clasificar de forma dinámica mediante la actualización de sus etiquetas de índice sin requerir ningún cambio en la organización del contenedor. Las etiquetas de índice ofrecen una forma flexible de hacer frente a los cambios en los requisitos de los datos. Puede usar tanto etiquetas de metadatos como de índice de forma simultánea. Para obtener más información sobre las etiquetas de índice, consulte Administración y búsqueda de datos de Azure Blob con etiquetas de índice de blobs.

En el ejemplo siguiente se muestra cómo agregar etiquetas de índice de blobs a una serie de blobs. En el ejemplo se leen los datos de un archivo XML y se usan para crear etiquetas de índice en varios blobs. Para usar el código de ejemplo, cree un archivo blob-list.xml local en el directorio C:\temp. En el siguiente ejemplo se proporcionan los datos XML.

<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>

El código de ejemplo crea una tabla hash y le asigna la variable $tags. Después, usa los cmdlets Get-Content y Get-Data para crear un objeto basado en la estructura XML. A continuación, agrega pares clave-valor a la tabla hash para usarlos como valores de la etiqueta. Por último, itera en el objeto XML y crea etiquetas para cada nodo 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
 }

Eliminar blobs

Puede eliminar un único blob o una serie de blobs con el cmdlet Remove-AzStorageBlob. Al eliminar varios blobs, puede utilizar las operaciones condicionales, los bucles o la canalización de PowerShell, tal y como se muestra en los ejemplos siguientes.

Advertencia

Al ejecutar los siguientes ejemplos se pueden eliminar los blobs de forma permanente. Microsoft recomienda habilitar la eliminación temporal de contenedores para proteger los contenedores y blobs contra la eliminación accidental. Para más información, consulte Eliminación temporal para contenedores.

#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

En algunos casos, es posible recuperar blobs que se hayan eliminado. Si la opción de protección de datos de eliminación temporal de su cuenta de almacenamiento está habilitada, el parámetro -IncludeDeleted devuelve los blobs eliminados dentro del período de retención asociado. Para obtener más información sobre la eliminación temporal, consulte el artículo Eliminación temporal para blobs.

Use el ejemplo siguiente para recuperar una lista de los blobs eliminados dentro del período de retención asociado al contenedor. El resultado muestra una lista de blobs eliminados recientemente.

#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

Restauración de un blob eliminado

Tal y como se mencionó en la sección Enumeración de blobs, puede configurar la opción de protección de datos de eliminación temporal en su cuenta de almacenamiento. Cuando se habilita, se pueden restaurar los blobs eliminados dentro del período de retención asociado. También puede usar el control de versiones para conservar las versiones anteriores de los blobs para cada recuperación y restauración.

Si están habilitados el control de versiones y la eliminación temporal de blobs, al modificar, sobrescribir, eliminar o restaurar un blob se crea una versión automáticamente. El método que usa para restaurar un blob eliminado depende de si el control de versiones está habilitado en la cuenta de almacenamiento.

En el ejemplo de código siguiente se restauran todos los blobs eliminados temporalmente o, si el control de versiones está habilitado, se restaura la versión más reciente de un blob. Primero determina si el control de versiones está habilitado con el cmdlet Get-AzStorageBlobServiceProperty.

Si el control de versiones está habilitado, el cmdlet Get-AzStorageBlob recupera una lista de todas las versiones de blob con nombre único. A continuación, las versiones de blob de la lista se recuperan y ordenan por fecha. Si no se encuentra ninguna versión con el valor de atributo LatestVersion, el cmdlet Copy-AzBlob se usa para realizar una copia activa de la versión más reciente.

Si el control de versiones está deshabilitado, el método BlobBaseClient.Undelete se usa para restaurar cada blob eliminado temporalmente en el contenedor.

Para poder seguir este ejemplo, antes debe habilitar la eliminación temporal o el control de versiones en al menos una de sus cuentas de almacenamiento.

Importante

En el ejemplo siguiente se enumera un grupo de blobs y se almacenan en memoria antes de procesarlos. Si el control de versiones está habilitado, los blobs también se ordenan. El uso del parámetro -ContinuationToken con la variable $maxCount limita el número de blobs dentro del grupo para conservar los recursos. Si un contenedor tiene millones de blobs, esto será extremadamente caro. Puede ajustar el valor de la variable $maxCount, aunque si un contenedor tiene millones de blobs, el script procesará los blobs lentamente.

Para obtener más información sobre la opción de protección de datos de eliminación temporal, consulte el artículo Eliminación temporal 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."
}

Pasos siguientes