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
Una sottoscrizione di Azure. Vedere Ottenere una versione di prova gratuita di Azure.
Il modulo Azure PowerShell
Az
, ovvero il modulo di PowerShell consigliato per l'interazione con Azure. Per iniziare a usare il modulo Az PowerShell, vedere Installare Azure PowerShell.
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."
}