Delen via


Blok-blobs beheren met PowerShell

Blob-opslag ondersteunt blok-blobs, toevoeg-blobs en pagina-blobs. Blok-blobs zijn geoptimaliseerd voor het efficiënt uploaden van grote hoeveelheden gegevens. Blok-blobs zijn ideaal voor het opslaan van afbeeldingen, documenten en andere typen gegevens die niet worden onderworpen aan willekeurige lees- en schrijfbewerkingen. In dit artikel wordt uitgelegd hoe u met blok-blobs kunt werken.

Vereisten

Een contextobject configureren voor het inkapselen van referenties

Elke aanvraag bij Azure Storage moet worden geautoriseerd. U kunt een aanvraag van PowerShell autoriseren met uw Microsoft Entra-account of met behulp van de toegangssleutels voor het account. In de voorbeelden in dit artikel wordt Microsoft Entra-autorisatie gebruikt met contextobjecten. Contextobjecten kapselen uw Microsoft Entra-referenties in en geven deze door tijdens volgende gegevensbewerkingen.

Als u zich wilt aanmelden bij uw Azure-account met een Microsoft Entra-account, opent u PowerShell en roept u de cmdlet Verbinding maken-AzAccount aan.

#Connect to your Azure subscription
Connect-AzAccount

Nadat de verbinding tot stand is gebracht, maakt u de Azure-context. Bij verificatie met Microsoft Entra-id wordt automatisch een Azure-context voor uw standaardabonnement gemaakt. In sommige gevallen moet u na verificatie mogelijk toegang krijgen tot resources in een ander abonnement. U kunt het abonnement dat is gekoppeld aan uw huidige Azure-sessie wijzigen door de context van de actieve sessie te wijzigen.

Als u uw standaardabonnement wilt gebruiken, maakt u de context door de New-AzStorageContext cmdlet aan te roepen. Neem de -UseConnectedAccount parameter op zodat gegevensbewerkingen worden uitgevoerd met behulp van uw Microsoft Entra-referenties.

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

Als u abonnementen wilt wijzigen, haalt u het contextobject op met de Cmdlet Get-AzSubscription en wijzigt u vervolgens de huidige context met de Set-AzContext. Zie Het actieve abonnement wijzigen voor meer informatie.

Een container maken

Alle blobgegevens worden opgeslagen in containers, dus u hebt ten minste één containerresource nodig voordat u gegevens kunt uploaden. Gebruik zo nodig het volgende voorbeeld om een opslagcontainer te maken. Zie Blobcontainers beheren met Behulp van PowerShell voor meer informatie.

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

Wanneer u de volgende voorbeelden gebruikt, moet u de tijdelijke aanduidingen tussen haakjes vervangen door uw eigen waarden. Zie Aanmelden met Azure PowerShell voor meer informatie over aanmelden bij Azure met PowerShell.

Blob uploaden

Als u een bestand wilt uploaden naar een blok-blob, geeft u de vereiste parameterwaarden door aan de Set-AzStorageBlobContent cmdlet. Geef het pad en de bestandsnaam op met de -File parameter en de naam van de container met de -Container parameter. U moet ook een verwijzing naar het contextobject opgeven met de -Context parameter.

Met deze opdracht wordt de blob gemaakt als deze niet bestaat of wordt u gevraagd om bevestiging te overschrijven als deze bestaat. U kunt het bestand zonder bevestiging overschrijven als u de -Force parameter doorgeeft aan de cmdlet.

In het volgende voorbeeld wordt een -File parameterwaarde opgegeven voor het uploaden van één benoemd bestand. Het toont ook het gebruik van de PowerShell-pijplijnoperator en Get-ChildItem cmdlet voor het uploaden van meerdere bestanden. De Get-ChildItem cmdlet gebruikt de -Path parameter om C:\Temp\*.png op te geven. De opname van het sterretje (*) jokerteken geeft alle bestanden met de extensie .png bestandsnaam. De -Recurse parameter doorzoekt de map Temp en de bijbehorende submappen.

#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

In het resultaat worden de naam van het opslagaccount, de naam van de opslagcontainer en een lijst weergegeven met de bestanden die zijn geüpload.

   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

Blobs vermelden

De Get-AzStorageBlob cmdlet wordt gebruikt om blobs weer te geven die zijn opgeslagen in een container. U kunt verschillende benaderingen gebruiken om het bereik van uw zoekopdracht te definiëren. Gebruik de -Container en -Name parameter om een specifieke blob in een bekende container weer te geven. Als u een niet-gefilterde lijst met alle blobs in een specifieke container wilt genereren, gebruikt u alleen de -Container parameter, zonder een -Name waarde.

Er is geen beperking voor het aantal containers of blobs dat een opslagaccount kan hebben. Om te voorkomen dat duizenden blobs worden opgehaald, is het een goed idee om de hoeveelheid geretourneerde gegevens te beperken. Bij het ophalen van meerdere blobs kunt u de -Prefix parameter gebruiken om blobs op te geven waarvan de namen beginnen met een specifieke tekenreeks. U kunt ook de -Name parameter met een jokerteken gebruiken om bestandsnamen of -typen op te geven.

De -MaxCount parameter kan worden gebruikt om het aantal niet-gefilterde blobs te beperken dat wordt geretourneerd vanuit een container. Er wordt een servicelimiet van 5000 opgelegd voor alle Azure-resources. Deze limiet zorgt ervoor dat beheerbare hoeveelheden gegevens worden opgehaald en dat de prestaties niet worden beïnvloed. Als het aantal geretourneerde blobs de -MaxCount waarde of de servicelimiet overschrijdt, wordt een vervolgtoken geretourneerd. Met dit token kunt u meerdere aanvragen gebruiken om een willekeurig aantal blobs op te halen. Meer informatie is beschikbaar over het inventariseren van blobresources.

In het volgende voorbeeld ziet u verschillende methoden die worden gebruikt om een lijst met blobs te bieden. De eerste benadering bevat één blob binnen een specifieke containerresource. De tweede benadering gebruikt een jokerteken om alle .jpg bestanden met een voorvoegsel van Louis weer te geven. De zoekopdracht is beperkt tot vijf containers met behulp van de -MaxCount parameter. De derde benadering gebruikt -MaxCount en -ContinuationToken parameters om het ophalen van alle blobs in een container te beperken.

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

De eerste twee benaderingen geven de namen van het opslagaccount en de container weer en een lijst met de opgehaalde blobs. In de derde benadering wordt het totale aantal blobs in een benoemde container weergegeven. De blobs worden opgehaald in batches en op een statusbalk wordt de voortgang tijdens het aantal weergegeven.

   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.

Blob downloaden

Afhankelijk van uw use-case kan de Get-AzStorageBlobContent cmdlet worden gebruikt om één of meerdere blobs te downloaden. Net als bij de meeste bewerkingen hebben beide benaderingen een contextobject nodig.

Als u één benoemde blob wilt downloaden, kunt u de cmdlet rechtstreeks aanroepen en waarden opgeven voor de -Blob en -Container parameters. De blob wordt standaard gedownload naar de werkende PowerShell-map, maar er kan een alternatieve locatie worden opgegeven. Als u de doellocatie wilt wijzigen, moet een geldig, bestaand pad worden doorgegeven met de -Destination parameter. Omdat de bewerking geen bestemming kan maken, mislukt deze met een fout als uw opgegeven pad niet bestaat.

U kunt meerdere blobs downloaden door de Get-AzStorageBlob cmdlet en de PowerShell-pijplijnoperator te combineren. Maak eerst een lijst met blobs met de Get-AzStorageBlob cmdlet. Gebruik vervolgens de pijplijnoperator en de Get-AzStorageBlobContent cmdlet om de blobs op te halen uit de container.

De volgende voorbeeldcode biedt een voorbeeld van een enkele en meerdere downloadmethoden. Het biedt ook een vereenvoudigde benadering voor het doorzoeken van alle containers naar specifieke bestanden met behulp van een jokerteken. Omdat sommige omgevingen mogelijk honderdduizenden resources hebben, wordt het gebruik van de -MaxCount parameter aanbevolen.

#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

Het resultaat geeft de namen van het opslagaccount en de container weer en bevat een lijst met de gedownloade bestanden.

   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

Blob-eigenschappen en -metagegevens beheren

Een container bevat zowel systeemeigenschappen als door de gebruiker gedefinieerde metagegevens. Er bestaan systeemeigenschappen op elke Blob Storage-resource. Sommige eigenschappen zijn alleen-lezen, terwijl andere kunnen worden gelezen of ingesteld. Onder de covers zijn sommige systeemeigenschappen toegewezen aan bepaalde standaard HTTP-headers.

Door de gebruiker gedefinieerde metagegevens bestaan uit een of meer naam-waardeparen die u opgeeft voor een Blob Storage-resource. U kunt metagegevens gebruiken om deze waarden op te slaan met de resource. Metagegevenswaarden zijn alleen bedoeld voor uw eigen doeleinden en hebben geen invloed op het gedrag van de resource.

Blob-eigenschappen lezen

Als u blobeigenschappen of metagegevens wilt lezen, moet u eerst de blob ophalen uit de service. Gebruik de Get-AzStorageBlob cmdlet om de eigenschappen en metagegevens van een blob op te halen, maar niet de inhoud ervan. Gebruik vervolgens de methode om de BlobClient.GetProperties eigenschappen van de blob op te halen. De eigenschappen of metagegevens kunnen vervolgens indien nodig worden gelezen of ingesteld.

In het volgende voorbeeld wordt een blob opgehaald en worden de eigenschappen ervan vermeld.

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

In het resultaat wordt een lijst met de eigenschappen van de blob weergegeven, zoals wordt weergegeven in het volgende voorbeeld.

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

Blobmetagegevens lezen en schrijven

Blobmetagegevens is een optionele set naam-/waardeparen die zijn gekoppeld aan een blob. Zoals in het vorige voorbeeld wordt weergegeven, zijn er in eerste instantie geen metagegevens gekoppeld aan een blob, maar deze kunnen indien nodig worden toegevoegd. Gebruik de methode om blobmetagegevens bij te BlobClient.UpdateMetadata werken. Deze methode accepteert alleen sleutel-waardeparen die zijn opgeslagen in een algemeen IDictionary object. Zie de blobClient-klassedefinitie voor meer informatie.

In het onderstaande voorbeeld worden eerst de metagegevens van een blob bijgewerkt en vervolgens opgehaald. De voorbeeld-blob wordt uit het geheugen leeggemaakt om ervoor te zorgen dat de metagegevens niet worden gelezen uit het in-memory object.

#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

Het resultaat retourneert de zojuist bijgewerkte metagegevens van de blob, zoals wordt weergegeven in het volgende voorbeeld.

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

Kopieerbewerkingen voor blobs

Er zijn veel scenario's waarin blobs van verschillende typen kunnen worden gekopieerd. Voorbeelden in dit artikel zijn beperkt tot blok-blobs.

Een bron-blob kopiëren naar een doel-blob

Gebruik de Copy-AzStorageBlob cmdlet voor een vereenvoudigde kopieerbewerking binnen hetzelfde opslagaccount. Omdat de bewerking een blob kopieert binnen hetzelfde opslagaccount, is dit een synchrone bewerking. Bewerkingen tussen accounts zijn asynchroon.

Overweeg het gebruik van AzCopy voor gemak en prestaties, met name bij het kopiëren van blobs tussen opslagaccounts. AzCopy is een opdrachtregelprogramma dat u kunt gebruiken om blobs of bestanden te kopiëren vanuit of naar een opslagaccount. Meer informatie over hoe u aan de slag gaat met AzCopy.

In het onderstaande voorbeeld wordt de bannerphoto.png-blob gekopieerd van de container foto's naar de map foto's in de archiefcontainer . Beide containers bevinden zich in hetzelfde opslagaccount. Het resultaat controleert het succes van de kopieerbewerking.

$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

U kunt de -Force parameter gebruiken om een bestaande blob met dezelfde naam op de bestemming te overschrijven. Met deze bewerking wordt de doel-blob effectief vervangen. Ook worden eventuele niet-doorgevoerde blokken verwijderd en worden de metagegevens van de doel-blob overschreven.

Een momentopname kopiëren naar een doel-blob met een andere naam

De resulterende doel-blob is een beschrijfbare blob en geen momentopname.

De bron-blob voor een kopieerbewerking kan een blok-blob, een toevoeg-blob, een pagina-blob of een momentopname zijn. Als de doel-blob al bestaat, moet deze van hetzelfde blobtype zijn als de bron-blob. Een bestaande doel-blob wordt overschreven.

De doel-blob kan niet worden gewijzigd terwijl er een kopieerbewerking wordt uitgevoerd. Een doel-blob kan slechts één uitstekende kopieerbewerking hebben. Met andere woorden, een blob kan niet de bestemming zijn voor meerdere in behandeling zijnde kopieerbewerkingen.

Wanneer u een blob in hetzelfde opslagaccount kopieert, is dit een synchrone bewerking. Kopieerbewerkingen voor meerdere accounts zijn asynchroon.

De volledige bron-blob of het hele bestand wordt altijd gekopieerd. Het kopiëren van een bereik van bytes of een set blokken wordt niet ondersteund.

Wanneer een blob wordt gekopieerd, worden de systeemeigenschappen gekopieerd naar de doel-blob met dezelfde waarden.

Ook ziet u hoe u een asynchrone kopieerbewerking kunt afbreken.

Momentopname-blobs

Een momentopname is een alleen-lezen versie van een blob die op een bepaald moment wordt gemaakt. Een blobmomentopname is identiek aan de basis-blob, behalve dat een Datum/tijd-waarde wordt toegevoegd aan de URI. Deze waarde geeft het tijdstip aan waarop de momentopname is gemaakt en biedt het enige onderscheid tussen de basis-blob en de momentopname.

Leases die zijn gekoppeld aan de basis-blob, hebben geen invloed op de momentopname. U kunt geen lease verkrijgen voor een momentopname. Lees meer over Blob-momentopnamen.

Met de volgende voorbeeldcode wordt een blob opgehaald uit een opslagcontainer en wordt er een momentopname van gemaakt.

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

Bloblaag instellen

Wanneer u de laag van een blob wijzigt, verplaatst u de blob en alle bijbehorende gegevens naar de doellaag. Als u de wijziging wilt aanbrengen, haalt u een blob op met de Get-AzStorageBlob cmdlet en roept u de methode aan BlobClient.SetAccessTier . Deze methode kan worden gebruikt om de laag te wijzigen tussen dynamisch, statisch en archief.

Het wijzigen van lagen van statisch of dynamisch naar archief vindt vrijwel onmiddellijk plaats. Nadat een blob is verplaatst naar de archieflaag , wordt deze beschouwd als offline en kan deze niet worden gelezen of gewijzigd. Voordat u de gegevens van een gearchiveerde blob kunt lezen of wijzigen, moet u deze reactiveren naar een onlinelaag. Lees meer over rehydratatie van blobs vanuit de archieflaag.

Met de volgende voorbeeldcode wordt de laag ingesteld op dynamisch voor alle blobs in de archive container.

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

Bewerkingen met blobtags

Blob-indextags maken gegevensbeheer en detectie eenvoudiger. Blob-indextags zijn door de gebruiker gedefinieerde indexkenmerken die u op uw blobs kunt toepassen. Zodra deze is geconfigureerd, kunt u objecten in een afzonderlijke container of in alle containers categoriseren en zoeken. Blob-resources kunnen dynamisch worden gecategoriseerd door hun indextags bij te werken zonder dat er een wijziging in de containerorganisatie nodig is. Indextags bieden een flexibele manier om te voldoen aan veranderende gegevensvereisten. U kunt zowel metagegevens als indextags tegelijk gebruiken. Zie Azure Blob-gegevens beheren en zoeken met blobindextags voor meer informatie over indextags.

In het volgende voorbeeld ziet u hoe u blobindextags toevoegt aan een reeks blobs. In het voorbeeld worden gegevens uit een XML-bestand gelezen en gebruikt voor het maken van indextags op verschillende blobs. Als u de voorbeeldcode wilt gebruiken, maakt u een lokaal blob-list.xml-bestand in de map C:\temp . De XML-gegevens worden weergegeven in het volgende voorbeeld.

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

De voorbeeldcode maakt een hash-tabel en wijst de $tags variabele eraan toe. Vervolgens worden de Get-Content en Get-Data cmdlets gebruikt om een object te maken op basis van de XML-structuur. Vervolgens worden sleutel-waardeparen toegevoegd aan de hash-tabel die als tagwaarden moeten worden gebruikt. Ten slotte wordt het XML-object herhaald en worden tags voor elk File knooppunt gemaakt.

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

Blobs verwijderen

U kunt één blob of een reeks blobs verwijderen met de Remove-AzStorageBlob cmdlet. Wanneer u meerdere blobs verwijdert, kunt u voorwaardelijke bewerkingen, lussen of de PowerShell-pijplijn gebruiken, zoals wordt weergegeven in de volgende voorbeelden.

Waarschuwing

Als u de volgende voorbeelden uitvoert, kunnen blobs definitief worden verwijderd. Microsoft raadt aan om voorlopig verwijderen van containers in te schakelen om containers en blobs te beschermen tegen onbedoelde verwijdering. Zie Voorlopig verwijderen voor containers voor meer informatie.

#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 sommige gevallen is het mogelijk om blobs op te halen die zijn verwijderd. Als de optie voor gegevensbeveiliging voor voorlopig verwijderen van uw opslagaccount is ingeschakeld, retourneert de -IncludeDeleted parameter blobs die zijn verwijderd binnen de bijbehorende bewaarperiode. Raadpleeg het artikel Voorlopig verwijderen voor blobs voor meer informatie over voorlopig verwijderen.

Gebruik het volgende voorbeeld om een lijst met blobs op te halen die zijn verwijderd binnen de gekoppelde bewaarperiode van de container. In het resultaat wordt een lijst met onlangs verwijderde blobs weergegeven.

#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

Een verwijderde blob herstellen

Zoals vermeld in de sectie Lijst-blobs , kunt u de optie voor gegevensbeveiliging voor voorlopig verwijderen configureren voor uw opslagaccount. Wanneer deze optie is ingeschakeld, is het mogelijk om blobs te herstellen die zijn verwijderd binnen de bijbehorende bewaarperiode. U kunt versiebeheer ook gebruiken om eerdere versies van uw blobs te onderhouden voor elk herstel en herstel.

Als versiebeheer van blobs en voorlopig verwijderen van blobs beide zijn ingeschakeld, wordt automatisch een nieuwe versie gemaakt door een blob te wijzigen, te overschrijven, te verwijderen of te herstellen. De methode die u gebruikt om een verwijderde blob te herstellen, is afhankelijk van of versiebeheer is ingeschakeld voor uw opslagaccount.

In het volgende codevoorbeeld worden alle voorlopig verwijderde blobs hersteld of, als versiebeheer is ingeschakeld, wordt de nieuwste versie van een blob hersteld. Eerst wordt bepaald of versiebeheer is ingeschakeld met de Get-AzStorageBlobServiceProperty cmdlet.

Als versiebeheer is ingeschakeld, haalt de Get-AzStorageBlob cmdlet een lijst op met alle unieke blobversies. Vervolgens worden de blobversies in de lijst opgehaald en gesorteerd op datum. Als er geen versies worden gevonden met de LatestVersion kenmerkwaarde, wordt de Copy-AzBlob cmdlet gebruikt om een actieve kopie van de nieuwste versie te maken.

Als versiebeheer is uitgeschakeld, wordt de BlobBaseClient.Undelete methode gebruikt om elke voorlopig verwijderde blob in de container te herstellen.

Voordat u dit voorbeeld kunt volgen, moet u voorlopig verwijderen of versiebeheer inschakelen voor ten minste één van uw opslagaccounts.

Belangrijk

In het volgende voorbeeld wordt een groep blobs opgesomd en opgeslagen in het geheugen voordat ze worden verwerkt. Als versiebeheer is ingeschakeld, worden de blobs ook gesorteerd. Het gebruik van de -ContinuationToken parameter met $maxCount variabele beperkt het aantal blobs in de groep om resources te besparen. Als een container miljoenen blobs heeft, is dit zeer duur. U kunt de waarde van de $maxCount variabele aanpassen, maar als een container miljoenen blobs bevat, worden de blobs langzaam verwerkt door het script.

Raadpleeg het artikel Voorlopig verwijderen voor blobs voor meer informatie over de optie voor gegevensbeveiliging voor voorlopig verwijderen.

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

Volgende stappen