Condividi tramite


Gestire i BLOB in blocchi con PowerShell

L'archiviazione BLOB supporta BLOB in blocchi, BLOB di aggiunta e BLOB di pagine. I BLOB in blocchi sono ottimizzati per il caricamento efficiente di grandi quantità di dati. I BLOB in blocchi sono ideali per l'archiviazione di immagini, documenti e altri tipi di dati non sottoposti a operazioni di lettura e scrittura casuali. Questo articolo illustra come usare i BLOB in blocchi.

Prerequisiti

Configurare un contesto di ambiente per incapsulare le credenziali

Ogni richiesta di Archiviazione di Azure deve essere autorizzata. È possibile autorizzare una richiesta effettuata da PowerShell con l'account Microsoft Entra o usando le chiavi di accesso dell'account. Gli esempi in questo articolo usano l'autorizzazione di Microsoft Entra con contesti di ambiente. Gli oggetti di contesto incapsulano le credenziali di Microsoft Entra e le passano durante le successive operazioni di dati.

Per accedere all'account Azure con un account Microsoft Entra, aprire PowerShell e chiamare il cmdletConnect-AzAccount.

#Connect to your Azure subscription
Connect-AzAccount

Dopo aver stabilito la connessione, creare il contesto di Azure. L'autenticazione con Microsoft Entra ID crea automaticamente un contesto di Azure per la sottoscrizione predefinita. In alcuni casi, potrebbe essere necessario accedere alle risorse in una sottoscrizione diversa dopo l'autenticazione. È possibile modificare la sottoscrizione associata alla sessione di Azure corrente modificando il contesto della sessione attiva.

Per usare la sottoscrizione predefinita, creare il contesto chiamando il cmdlet New-AzStorageContext. Includere il parametro -UseConnectedAccount in modo che le operazioni sui dati vengano eseguite usando le credenziali di Microsoft Entra.

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

Per modificare le sottoscrizioni, recuperare il contesto di ambiente con il cmdlet Get-AzSubscription, quindi modificare il contesto corrente con Set-AzContext. Per altre informazioni, vedere Modificare la sottoscrizione attiva.

Creazione di un contenitore

Tutti i dati BLOB vengono archiviati all'interno di contenitori, quindi è necessaria almeno una risorsa contenitore prima di poter caricare i dati. Se necessario, attenersi all'esempio seguente per creare un contenitore di archiviazione. Per altre informazioni, vedere Gestione dei contenitori BLOB tramite PowerShell.

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

Quando si usano gli esempi seguenti, è necessario sostituire i valori segnaposto tra parentesi quadre con i propri valori. Per altre informazioni sull'accesso ad Azure con PowerShell, vedere Accedere con Azure PowerShell.

Caricare un BLOB

Per caricare un file in un BLOB in blocchi, passare i valori dei parametri necessari a cmdlet Set-AzStorageBlobContent. Specificare il percorso e il nome del file con il parametro -File e il nome del contenitore con il parametro -Container. È anche necessario fornire un riferimento al contesto di ambiente con il parametro -Context.

Questo comando crea il BLOB se non esiste o richiede la conferma della sovrascrittura, se esistente. È possibile sovrascrivere il file senza confermare se si passa il parametro -Force al cmdlet.

Nell'esempio seguente viene specificato un valore del parametro -File per caricare un singolo file con nome. L'esempio seguente illustra anche l'uso dell'operatore della pipeline di PowerShell e del cmdlet Get-ChildItem per caricare più file. Il cmdlet Get-ChildItem usa il parametro -Path per specificare C:\Temp\*.png. L'inclusione del carattere jolly asterisco (*) specifica tutti i file con l'estensione del filename .png. Il parametro -Recurse cerca nella directory Temp e nelle relative sottodirectory.

#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

Il risultato visualizza il nome dell'account di archiviazione, il nome del contenitore di archiviazione e fornisce un elenco dei file caricati.

   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

Elencare i BLOB

Il cmdlet Get-AzStorageBlob viene usato per elencare i BLOB archiviati all'interno di un contenitore. È possibile usare vari approcci per definire l'ambito della ricerca. Usare il parametro -Container e -Name per elencare un BLOB specifico all'interno di un contenitore noto. Per generare un elenco non filtrato di tutti i BLOB all'interno di un contenitore specifico, usare il parametro -Container da solo, senza un valore -Name.

Non esiste alcuna restrizione sul numero di contenitori o BLOB che un account di archiviazione può avere. Per evitare di dover potenzialmente recuperare migliaia di BLOB, è consigliabile limitare la quantità di dati restituiti. Quando si recuperano più BLOB, è possibile usare il parametro -Prefix per specificare i BLOB i cui nomi iniziano con una stringa specifica. È possibile anche usare il parametro -Name con un carattere jolly per specificare i nomi o i tipi di file.

Il parametro -MaxCount può essere usato per limitare il numero di BLOB non filtrati restituiti da un contenitore. A tutte le risorse di Azure è imposto un limite di servizio di 5.000. Questo limite garantisce che vengano recuperate quantità gestibili di dati e che le prestazioni non siano interessate. Se il numero di BLOB restituiti supera il valore -MaxCount o il limite di servizio, viene restituito un token di continuazione. Questo token consente di usare più richieste per recuperare un numero qualsiasi di BLOB. Altre informazioni sono disponibili in Enumerazione di risorse BLOB.

L'esempio seguente illustra diversi approcci usati per fornire un elenco di BLOB. Il primo approccio elenca un singolo BLOB all'interno di una risorsa contenitore specifica. Il secondo approccio usa un carattere jolly per elencare tutti i file .jpg con un prefisso Louis. La ricerca è limitata a cinque contenitori usando il parametro -MaxCount. Nel terzo approccio vengono utilizzati i parametri -MaxCount e -ContinuationToken per limitare il recupero di tutti i BLOB all'interno di un contenitore.

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

I primi due approcci visualizzano l'account di archiviazione e i nomi dei contenitori e un elenco dei BLOB recuperati. Il terzo approccio visualizza il numero totale di BLOB all'interno di un contenitore con nome. I BLOB vengono recuperati in batch e una barra di stato mostra lo stato di avanzamento durante il conteggio.

   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.

Scaricare un BLOB

A seconda del caso d'uso, il cmdlet Get-AzStorageBlobContent può essere usato per scaricare uno o più BLOB. Come per la maggior parte delle operazioni, entrambi gli approcci richiedono un contesto di ambiente.

Per scaricare un singolo BLOB con nome, è possibile chiamare direttamente il cmdlet e specificare i valori per i parametri -Blob e -Container. Il BLOB viene scaricato nella directory di PowerShell funzionante per impostazione predefinita, ma è possibile specificare un percorso alternativo. Per modificare la posizione di destinazione, è necessario passare un percorso esistente valido con il parametro -Destination. Poiché l'operazione non può creare una destinazione, se il percorso specificato non esiste, l'operazione dà esito negativo e presenta un errore.

È possibile scaricare più BLOB combinando il cmdlet Get-AzStorageBlob e l'operatore della pipeline di PowerShell. Creare prima di tutto un elenco di BLOB con il cmdlet Get-AzStorageBlob. Usare quindi l'operatore pipeline e il cmdlet Get-AzStorageBlobContent per recuperare i BLOB dal contenitore.

Il codice di esempio seguente illustra approcci di download singoli e multipli. Offre anche un approccio semplificato alla ricerca di tutti i contenitori per file specifici usando un carattere jolly. Poiché alcuni ambienti possono avere molte centinaia di migliaia di risorse, è consigliabile usare il parametro -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

Il risultato visualizza i nomi dell'account di archiviazione e dei contenitori e fornisce un elenco dei file scaricati.

   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

Gestire proprietà e metadati dei BLOB

Un contenitore restituisce sia le proprietà di sistema che i metadati definiti dall'utente. Le proprietà di sistema esistono su ogni risorsa di Archivio BLOB. Alcune proprietà sono di sola lettura, mentre altre possono essere lette o impostate. Anche se in modo non esplicito, alcune proprietà di sistema eseguono il mapping a determinate intestazioni HTTP standard.

I metadati definiti dall'utente sono costituiti da una o più coppie nome-valore specificate per una risorsa di Archiviazione di Azure. È possibile usare i metadati per archiviare questi valori con la risorsa. I valori dei metadati sono solo per gli scopi dell'utente e non influiscono sul comportamento della risorsa.

Lettura delle proprietà del BLOB

Per leggere le proprietà o i metadati del BLOB, è prima necessario recuperare il BLOB dal servizio. Usare cmdlet Get-AzStorageBlob per recuperare le proprietà e i metadati di un BLOB, ma non il relativo contenuto. Usare quindi il metodo BlobClient.GetProperties per recuperare le proprietà del BLOB. Le proprietà o i metadati possono quindi essere letti o impostati in base alle esigenze.

Nell'esempio seguente viene recuperato un BLOB e vengono elencate le relative proprietà.

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

Il risultato visualizza un elenco delle proprietà del BLOB, come illustrato nell'esempio seguente.

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

Leggere e scrivere metadati BLOB

I metadati BLOB sono un set facoltativo di coppie nome/valore associate a un BLOB. Come illustrato nell'esempio precedente, inizialmente a un BLOB non sono associati metadati, anche se possono essere aggiunti quando necessario. Per aggiornare i metadati del BLOB, usare il metodo BlobClient.UpdateMetadata. Questo metodo accetta solo coppie chiave-valore archiviate in un oggetto generico IDictionary. Per altre informazioni, vedere la definizione della classe BlobClient.

L'esempio seguente prima aggiorna i metadati di un BLOB, poi ne esegue il commit e quindi lo recupera. Il BLOB di esempio viene scaricato dalla memoria per fare in modo che i metadati non vengano letti dall'oggetto in 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

Il risultato restituisce i metadati appena aggiornati del BLOB, come illustrato nell'esempio seguente.

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

Operazioni di copia per i BLOB

Esistono molti scenari in cui possono essere copiati BLOB di tipi diversi. Gli esempi contenuti in questo articolo sono limitati ai BLOB in blocchi.

Copiare un BLOB di origine in un BLOB di destinazione

Per un'operazione di copia semplificata all'interno dello stesso account di archiviazione, usare il cmdlet Copy-AzStorageBlob. Poiché l'operazione copia un BLOB all'interno dello stesso account di archiviazione, si tratta di un'operazione sincrona. Le operazioni tra account sono asincrone.

È consigliabile prendere in considerazione l'uso di AzCopy per semplificare e aumentare le prestazioni, soprattutto quando si copiano BLOB tra account di archiviazione. AzCopy è un'utilità della riga di comando che è possibile usare per copiare i BLOB o i file da e verso un account di archiviazione. Altre informazioni sulle Attività iniziali con AzCopy.

L'esempio seguente copia il BLOB bannerphoto.png dal contenitore foto alla cartella foto all'interno del contenitore archivio. Entrambi i contenitori esistono all'interno dello stesso account di archiviazione. Il risultato verifica l'esito positivo dell'operazione di copia.

$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

È possibile usare il parametro -Force per sovrascrivere un BLOB esistente con lo stesso nome nella destinazione. Questa operazione sostituisce efficacemente il BLOB di destinazione. Rimuove anche tutti i blocchi di cui non è stato eseguito il commit e sovrascrive i metadati del BLOB di destinazione.

Copiare uno snapshot in un BLOB di destinazione con un nome diverso

Il BLOB di destinazione risultante è un BLOB scrivibile, non uno snapshot.

Il BLOB di origine per un'operazione di copia può essere un BLOB in blocchi, un BLOB di accomodamento, un BLOB di pagine oppure uno snapshot. Se il BLOB di destinazione esiste già, deve essere dello stesso tipo del BLOB di origine. Un BLOB di destinazione esistente viene sovrascritto.

Non è possibile modificare il BLOB di destinazione se è in corso un'operazione di copia. A un BLOB di destinazione può corrispondere una sola operazione di copia in attesa. In altre parole, un BLOB non può essere la destinazione di più operazioni di copia in sospeso.

La copia di un BLOB all'interno dello stesso account di archiviazione è un'operazione sincrona. Le operazioni di copia tra account sono asincrone.

L'intero BLOB o file di origine viene sempre copiato. La copia di un intervallo di byte o di un set di blocchi non è supportata.

Quando viene copiato un BLOB, le relative proprietà di sistema vengono copiate nel BLOB di destinazione con gli stessi valori.

Viene inoltre illustrato come interrompere un'operazione di copia asincrona.

BLOB di snapshot

Uno snapshot è una versione di sola lettura di un BLOB eseguito in un determinato momento. Uno snapshot del BLOB è identico al BLOB di base, ad eccezione del fatto che all'URI viene aggiunto un valore DateTime. Questo valore indica l'ora in cui è stato creato lo snapshot e offre l'unica distinzione tra il BLOB di base e lo snapshot.

Tutti i lease associati al BLOB di base non influiscono sullo snapshot. Non è possibile acquisire un lease su uno snapshot. Altre informazioni sugli snapshot di BLOB.

Il codice di esempio seguente recupera un BLOB da un contenitore di archiviazione e ne crea uno snapshot.

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

Impostare il livello di BLOB

Quando si modifica il livello di un BLOB, si sposta il BLOB e tutti i relativi dati nel livello di destinazione. Per apportare la modifica, recuperare un BLOB con il cmdlet Get-AzStorageBlob e chiamare il metodo BlobClient.SetAccessTier. Questo approccio può essere usato per modificare il livello di accesso frequente, sporadico e il livello archivio.

La modifica da livello di accesso sporadico o livello di accesso frequente al livello archivio avviene quasi immediatamente. Quando un BLOB viene spostato al livello archivio, viene considerato offline e non può essere letto o modificato. Prima di poter leggere o modificare i dati di un BLOB archiviato, è necessario riattivarlo in un livello online. Altre informazioni sulla Riattivazione dei BLOB dal livello archivio.

Il codice di esempio seguente imposta il livello su livello di accesso frequente per tutti i BLOB all'interno del contenitore archive.

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

Operazioni che usano tag BLOB

I tag indice BLOB semplificano la gestione e l'individuazione dei dati. I tag indice BLOB sono attributi di indice chiave-valore definiti dall'utente che è possibile applicare ai BLOB. Dopo la configurazione, è possibile classificare e trovare oggetti all'interno di un singolo contenitore o in tutti i contenitori. Le risorse BLOB possono essere categorizzate in modo dinamico aggiornando i tag indice senza richiedere una modifica nell'organizzazione del contenitore. I tag indice offrono un modo flessibile per gestire i requisiti dei dati mutevoli. È possibile usare contemporaneamente sia i metadati che i tag indice. Per altre informazioni sui tag indice, vedere Gestire e trovare dati BLOB di Azure con tag indice BLOB.

Nell'esempio seguente viene illustrato come aggiungere tag indice BLOB a una serie di BLOB. L'esempio legge i dati da un file XML e lo usa per creare tag indice in diversi BLOB. Per usare il codice di esempio, creare un file blob-list.xml locale nella directory C:\temp. I dati XML vengono forniti nell'esempio seguente.

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

Il codice di esempio crea una tabella hash e assegna la variabile $tags. Successivamente, usa i cmdlet Get-Content e Get-Data per creare un oggetto basato sulla struttura XML. Aggiunge quindi coppie chiave-valore alla tabella hash da usare come valori di tag. Infine, esegue l'iterazione dell'oggetto XML e crea tag per ogni 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
 }

Eliminare i BLOB

È possibile eliminare un singolo BLOB o una serie di BLOB con cmdlet Remove-AzStorageBlob. Quando si eliminano più BLOB, è possibile usare operazioni condizionali, cicli o pipeline di PowerShell, come illustrato negli esempi seguenti.

Avviso

L'esecuzione degli esempi seguenti può eliminare definitivamente i BLOB. Microsoft consiglia di abilitare l'eliminazione temporanea dei contenitori per proteggere i contenitori e i BLOB dall'eliminazione accidentale. Per altre informazioni, vedere Eliminazione temporanea per i contenitori.

#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

In alcuni casi, è possibile recuperare i BLOB eliminati. Se l'opzione di protezione dei dati di eliminazione temporanea dell'account di archiviazione è abilitata, il parametro -IncludeDeleted restituisce i BLOB eliminati entro il periodo di conservazione associato. Per altre informazioni sull'eliminazione temporanea, vedere l'articolo Eliminazione temporanea per i BLOB.

Attenersi all'esempio seguente per recuperare un elenco di BLOB eliminati nel periodo di conservazione associato al contenitore. Il risultato visualizza un elenco di BLOB eliminati di recente.

#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

Ripristinare un BLOB eliminato

Come indicato nella sezione BLOB di elenco, è possibile configurare l'opzione di protezione dei dati di eliminazione temporanea nell'account di archiviazione. Se abilitata, è possibile ripristinare i BLOB eliminati entro il periodo di conservazione associato. Anche il controllo delle versioni consente di mantenere le versioni precedenti dei BLOB per ogni recupero e ripristino.

Se il controllo delle versioni dei BLOB e l'eliminazione temporanea del BLOB sono entrambi abilitati, la modifica, la sovrascrittura, l'eliminazione o il ripristino di un BLOB creano automaticamente una nuova versione. Il metodo che viene usato per ripristinare un BLOB eliminato dipende dal fatto che il controllo delle versioni sia abilitato nell'account di archiviazione.

L'esempio di codice seguente ripristina tutti i BLOB eliminati temporaneamente o, se il controllo delle versioni è abilitato, ripristina la versione più recente di un BLOB. Determina innanzitutto se il controllo delle versioni è abilitato con cmdlet Get-AzStorageBlobServiceProperty.

Se il controllo delle versioni è abilitato, cmdlet Get-AzStorageBlob recupera un elenco di tutte le versioni BLOB denominate in modo univoco. Successivamente, le versioni del BLOB nell'elenco vengono recuperate e ordinate in base alla data. Se non vengono trovate versioni con il valore dell'attributo LatestVersion, cmdlet Copy-AzBlob viene usato per creare una copia attiva della versione più recente.

Se il controllo delle versioni è disabilitato, il metodo BlobBaseClient.Undelete viene usato per ripristinare ogni BLOB eliminato predefinito nel contenitore.

Prima di seguire questo esempio, è necessario abilitare l'eliminazione temporanea o il controllo delle versioni in almeno uno degli account di archiviazione.

Importante

L'esempio seguente enumera un gruppo di BLOB e li archivia in memoria prima di elaborarli. Se il controllo delle versioni è abilitato, vengono ordinati anche i BLOB. L'uso del parametro -ContinuationToken con la variabile $maxCount limita il numero di BLOB all'interno del gruppo per risparmiare risorse. Se un contenitore ha milioni di BLOB, questo sarà estremamente costoso. È possibile modificare il valore della variabile $maxCount: anche se un contenitore ha milioni di BLOB, lo script elabora lentamente i BLOB.

Per altre informazioni sull'opzione di protezione dei dati di eliminazione temporanea, vedere l'articolo Eliminazione temporanea per i BLOB.

$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."
}

Passaggi successivi