Hantera blockblobar med PowerShell

Blob Storage stöder blockblobar, tilläggsblobar och sidblobar. Blockblobar är optimerade för att ladda upp stora mängder data effektivt. Blockblobar är idealiska för att lagra bilder, dokument och andra typer av data som inte utsätts för slumpmässiga läs- och skrivåtgärder. Den här artikeln beskriver hur du arbetar med blockblobar.

Förutsättningar

Konfigurera ett kontextobjekt för att kapsla in autentiseringsuppgifter

Varje begäran till Azure Storage måste godkännas. Du kan auktorisera en begäran från PowerShell med ditt Microsoft Entra-konto eller med hjälp av kontoåtkomstnycklarna. Exemplen i den här artikeln använder Microsoft Entra-auktorisering med kontextobjekt. Kontextobjekt kapslar in dina Microsoft Entra-autentiseringsuppgifter och skickar dem under efterföljande dataåtgärder.

Om du vill logga in på ditt Azure-konto med ett Microsoft Entra-konto öppnar du PowerShell och anropar cmdleten Anslut-AzAccount.

#Connect to your Azure subscription
Connect-AzAccount

När anslutningen har upprättats skapar du Azure-kontexten. Om du autentiserar med Microsoft Entra-ID skapas automatiskt en Azure-kontext för din standardprenumeration. I vissa fall kan du behöva komma åt resurser i en annan prenumeration efter autentiseringen. Du kan ändra prenumerationen som är associerad med din aktuella Azure-session genom att ändra den aktiva sessionskontexten.

Om du vill använda din standardprenumeration skapar du kontexten genom att anropa cmdleten New-AzStorageContext . Inkludera parametern -UseConnectedAccount så att dataåtgärder utförs med dina Microsoft Entra-autentiseringsuppgifter.

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

Om du vill ändra prenumerationer hämtar du kontextobjektet med cmdleten Get-AzSubscription och ändrar sedan den aktuella kontexten med Set-AzContext. Mer information finns i Ändra den aktiva prenumerationen.

Skapa en container

Alla blobdata lagras i containrar, så du behöver minst en containerresurs innan du kan ladda upp data. Om det behövs använder du följande exempel för att skapa en lagringscontainer. Mer information finns i Hantera blobcontainrar med PowerShell.

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

När du använder följande exempel måste du ersätta platshållarvärdena inom hakparenteser med dina egna värden. Mer information om hur du loggar in på Azure med PowerShell finns i Logga in med Azure PowerShell.

Ladda upp en blob

Om du vill ladda upp en fil till en blockblob skickar du de obligatoriska parametervärdena till cmdleten Set-AzStorageBlobContent . Ange sökvägen och filnamnet med parametern -File och namnet på containern med parametern -Container . Du måste också ange en referens till kontextobjektet med parametern -Context .

Det här kommandot skapar bloben om den inte finns eller uppmanar till att skriva över bekräftelsen om den finns. Du kan skriva över filen utan bekräftelse om du skickar parametern -Force till cmdleten.

I följande exempel anges ett -File parametervärde för att ladda upp en enda namngiven fil. Det visar också användningen av PowerShell-pipelineoperatorn och Get-ChildItem cmdleten för att ladda upp flera filer. Cmdleten Get-ChildItem använder parametern -Path för att ange C:\Temp\*.png. Inkluderingen av jokertecknet asterisk (*) anger alla filer med filnamnstillägget .png . Parametern -Recurse söker i Temp-katalogen och dess underkataloger.

#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

Resultatet visar lagringskontots namn, lagringscontainerns namn och en lista över de filer som laddats upp.

   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

Lista blobar

Cmdleten Get-AzStorageBlob används för att lista blobar som lagras i en container. Du kan använda olika metoder för att definiera sökomfånget. Använd parametern -Container och -Name för att lista en specifik blob i en känd container. Om du vill generera en ofiltrerad lista över alla blobar i en specifik container använder du parametern -Container ensam, utan ett -Name värde.

Det finns ingen begränsning för antalet containrar eller blobar som ett lagringskonto kan ha. För att eventuellt undvika att hämta tusentals blobar är det en bra idé att begränsa mängden data som returneras. När du hämtar flera blobar kan du använda parametern -Prefix för att ange blobar vars namn börjar med en specifik sträng. Du kan också använda parametern -Name med ett jokertecken för att ange filnamn eller typer.

Parametern -MaxCount kan användas för att begränsa antalet ofiltrerade blobar som returneras från en container. En tjänstgräns på 5 000 tillämpas på alla Azure-resurser. Den här gränsen säkerställer att hanterbara mängder data hämtas och att prestanda inte påverkas. Om antalet returnerade blobar överskrider antingen -MaxCount värdet eller tjänstgränsen returneras en fortsättningstoken. Med den här token kan du använda flera begäranden för att hämta valfritt antal blobar. Mer information finns i Räkna upp blobresurser.

I följande exempel visas flera metoder som används för att tillhandahålla en lista över blobar. Den första metoden visar en enda blob i en specifik containerresurs. Den andra metoden använder ett jokertecken för att lista alla .jpg filer med prefixet Louis. Sökningen är begränsad till fem containrar med hjälp av parametern -MaxCount . Den tredje metoden använder -MaxCount och -ContinuationToken parametrar för att begränsa hämtningen av alla blobar i en container.

#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 två första metoderna visar lagringskontot och containernamnen och en lista över de blobar som hämtats. Den tredje metoden visar det totala antalet blobar i en namngiven container. Blobarna hämtas i batchar och ett statusfält visar förloppet under antalet.

   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.

Ladda ned en blob

Beroende på ditt användningsfall kan cmdleten Get-AzStorageBlobContent användas för att ladda ned antingen enstaka eller flera blobar. Precis som med de flesta åtgärder kräver båda metoderna ett kontextobjekt.

Om du vill ladda ned en enda namngiven blob kan du anropa cmdleten direkt och ange värden för parametrarna -Blob och -Container . Blobben laddas ned till den fungerande PowerShell-katalogen som standard, men en alternativ plats kan anges. Om du vill ändra målplatsen måste en giltig, befintlig sökväg skickas med parametern -Destination . Eftersom åtgärden inte kan skapa ett mål misslyckas den med ett fel om den angivna sökvägen inte finns.

Flera blobar kan laddas ned genom att kombinera cmdleten Get-AzStorageBlob och PowerShell-pipelineoperatorn. Skapa först en lista över blobar med cmdleten Get-AzStorageBlob . Använd sedan pipelineoperatorn och cmdleten Get-AzStorageBlobContent för att hämta blobarna från containern.

Följande exempelkod innehåller ett exempel på både enstaka och flera nedladdningsmetoder. Det erbjuder också en förenklad metod för att söka i alla containrar efter specifika filer med hjälp av ett jokertecken. Eftersom vissa miljöer kan ha hundratusentals resurser rekommenderar vi att du använder parametern -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

Resultatet visar lagringskontot och containernamnen och innehåller en lista över de filer som laddats ned.

   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

Hantera blobegenskaper och metadata

En container exponerar både systemegenskaper och användardefinierade metadata. Systemegenskaper finns på varje Blob Storage-resurs. Vissa egenskaper är skrivskyddade, medan andra kan läsas eller ställas in. Under täcket mappas vissa systemegenskaper till vissa standard-HTTP-huvuden.

Användardefinierade metadata består av ett eller flera namn/värde-par som du anger för en Blob Storage-resurs. Du kan använda metadata för att lagra dessa värden med resursen. Metadatavärden är endast för dina egna syften och påverkar inte hur resursen beter sig.

Läsa blobegenskaper

Om du vill läsa blobegenskaper eller metadata måste du först hämta bloben från tjänsten. Använd cmdleten Get-AzStorageBlob för att hämta en blobs egenskaper och metadata, men inte dess innehåll. BlobClient.GetProperties Använd sedan metoden för att hämta blobens egenskaper. Egenskaperna eller metadata kan sedan läsas eller ställas in efter behov.

I följande exempel hämtas en blob och dess egenskaper visas.

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

Resultatet visar en lista över blobens egenskaper enligt följande exempel.

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

Läsa och skriva blobmetadata

Blobmetadata är en valfri uppsättning namn/värde-par som är associerade med en blob. Som du ser i föregående exempel finns det inga metadata som är associerade med en blob initialt, även om det kan läggas till när det behövs. Använd metoden för BlobClient.UpdateMetadata att uppdatera blobmetadata. Den här metoden accepterar endast nyckel/värde-par som lagras i ett allmänt IDictionary objekt. Mer information finns i klassdefinitionen BlobClient .

Exemplet nedan uppdaterar först och checkar sedan in en blobs metadata och hämtar den sedan. Exempelbloben töms från minnet för att säkerställa att metadata inte läss från det minnesinterna objektet.

#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

Resultatet returnerar blobens nyligen uppdaterade metadata enligt följande exempel.

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

Kopieringsåtgärder för blobar

Det finns många scenarier där blobar av olika typer kan kopieras. Exempel i den här artikeln är begränsade till blockblobar.

Kopiera en källblob till en målblob

Använd cmdleten Copy-AzStorageBlob för en förenklad kopieringsåtgärd inom samma lagringskonto. Eftersom åtgärden kopierar en blob i samma lagringskonto är det en synkron åtgärd. Åtgärder mellan konton är asynkrona.

Du bör överväga att använda AzCopy för enkelhet och prestanda, särskilt när du kopierar blobar mellan lagringskonton. AzCopy är ett kommandoradsverktyg som du kan använda för att kopiera blobar eller filer till eller från ett lagringskonto. Läs mer om hur du kommer igång med AzCopy.

Exemplet nedan kopierar blobben bannerphoto.png från containern foton till mappen foton i arkivcontainern . Båda containrarna finns i samma lagringskonto. Resultatet verifierar att kopieringsåtgärden lyckades.

$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

Du kan använda parametern -Force för att skriva över en befintlig blob med samma namn på målet. Den här åtgärden ersätter effektivt målbloben. Den tar också bort eventuella icke-obligatoriska block och skriver över målblobens metadata.

Kopiera en ögonblicksbild till en målblob med ett annat namn

Den resulterande målbloben är en skrivbar blob och inte en ögonblicksbild.

Källbloben för en kopieringsåtgärd kan vara en blockblob, en tilläggsblob, en sidblob eller en ögonblicksbild. Om målbloben redan finns måste den vara av samma blobtyp som källbloben. En befintlig målblob skrivs över.

Målbloben kan inte ändras när en kopieringsåtgärd pågår. En målblob kan bara ha en utestående kopieringsåtgärd. Med andra ord kan en blob inte vara målet för flera väntande kopieringsåtgärder.

När du kopierar en blob i samma lagringskonto är det en synkron åtgärd. Kopieringsåtgärder mellan konton är asynkrona.

Hela källbloben eller -filen kopieras alltid. Kopiering av ett intervall med byte eller en uppsättning block stöds inte.

När en blob kopieras kopieras dess systemegenskaper till målbloben med samma värden.

Den visar också hur du avbryter en asynkron kopieringsåtgärd.

Ögonblicksbildblobar

En ögonblicksbild är en skrivskyddad version av en blob som tas vid en tidpunkt. En blobögonblicksbild är identisk med dess basblob, förutom att ett DateTime-värde läggs till i URI:n. Det här värdet anger den tid då ögonblicksbilden togs och erbjuder den enda skillnaden mellan basbloben och ögonblicksbilden.

Lån som är associerade med basbloben påverkar inte ögonblicksbilden. Du kan inte skaffa ett lån på en ögonblicksbild. Läs mer om blobögonblicksbilder.

Följande exempelkod hämtar en blob från en lagringscontainer och skapar en ögonblicksbild av den.

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

Ange blobnivå

När du ändrar en blob-nivå flyttar du bloben och alla dess data till målnivån. Om du vill göra ändringen hämtar du en blob med cmdleten Get-AzStorageBlobBlobClient.SetAccessTier och anropar metoden. Den här metoden kan användas för att ändra nivån mellan frekvent, lågfrekvent och arkiv.

Om du ändrar nivåer från lågfrekvent eller frekvent till arkivering sker det nästan omedelbart. När en blob har flyttats till arkivnivån anses den vara offline och kan inte läsas eller ändras. Innan du kan läsa eller ändra en arkiverad blobs data måste du extrahera dem till en onlinenivå. Läs mer om blobåterställning från arkivnivån.

Följande exempelkod anger nivån till frekvent för alla blobar i containern archive .

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

Åtgärder med hjälp av blobtaggar

Blobindextaggar gör datahantering och identifiering enklare. Blobindextaggar är användardefinierade nyckel/värde-indexattribut som du kan använda för dina blobar. När du har konfigurerat kan du kategorisera och hitta objekt i en enskild container eller i alla containrar. Blobresurser kan kategoriseras dynamiskt genom att uppdatera sina indextaggar utan att en ändring krävs i containerorganisationen. Indextaggar är ett flexibelt sätt att hantera ändrade datakrav. Du kan använda både metadata och indextaggar samtidigt. Mer information om indextaggar finns i Hantera och hitta Azure Blob-data med blobindextaggar.

I följande exempel visas hur du lägger till blobindextaggar i en serie blobar. Exemplet läser data från en XML-fil och använder dem för att skapa indextaggar på flera blobar. Om du vill använda exempelkoden skapar du en lokal blob-list.xml-fil i katalogen C:\temp . XML-data tillhandahålls i följande exempel.

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

Exempelkoden skapar en hash-tabell och tilldelar variabeln $tags till den. Därefter används Get-Content cmdletarna och Get-Data för att skapa ett objekt baserat på XML-strukturen. Sedan läggs nyckel/värde-par till i hash-tabellen som ska användas som taggvärden. Slutligen itererar den genom XML-objektet och skapar taggar för varje File nod.

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

Ta bort blobar

Du kan ta bort antingen en enskild blob eller en serie blobar med cmdleten Remove-AzStorageBlob . När du tar bort flera blobar kan du använda villkorsstyrda åtgärder, loopar eller PowerShell-pipelinen enligt följande exempel.

Varning

Om du kör följande exempel kan du ta bort blobar permanent. Microsoft rekommenderar att du aktiverar mjuk borttagning av containrar för att skydda containrar och blobar från oavsiktlig borttagning. Mer information finns i Mjuk borttagning för containrar.

#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

I vissa fall är det möjligt att hämta blobar som har tagits bort. Om lagringskontots alternativ för mjuk borttagning av dataskydd är aktiverat returnerar parametern -IncludeDeleted blobar som tagits bort inom den associerade kvarhållningsperioden. Mer information om mjuk borttagning finns i artikeln Mjuk borttagning för blobar .

Använd följande exempel för att hämta en lista över blobar som tagits bort inom containerns associerade kvarhållningsperiod. Resultatet visar en lista över nyligen borttagna blobar.

#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

Återställa en borttagen blob

Som du nämnde i avsnittet Listblobar kan du konfigurera alternativet för skydd mot mjuk borttagning av data på ditt lagringskonto. När det är aktiverat går det att återställa blobar som tagits bort inom den associerade kvarhållningsperioden. Du kan också använda versionshantering för att underhålla tidigare versioner av dina blobar för varje återställning och återställning.

Om blobversionshantering och mjuk borttagning av blobar är aktiverade skapar ändring, överskrivning, borttagning eller återställning av en blob automatiskt en ny version. Vilken metod du använder för att återställa en borttagen blob beror på om versionshantering är aktiverat på ditt lagringskonto.

Följande kodexempel återställer alla mjukt borttagna blobar eller återställer den senaste versionen av en blob om versionshantering är aktiverat. Den avgör först om versionshantering är aktiverat med cmdleten Get-AzStorageBlobServiceProperty .

Om versionshantering är aktiverat hämtar cmdleten Get-AzStorageBlob en lista över alla unikt namngivna blobversioner. Därefter hämtas och sorteras blobversionerna i listan efter datum. Om inga versioner hittas med LatestVersion attributvärdet används cmdleten Copy-AzBlob för att göra en aktiv kopia av den senaste versionen.

Om versionshantering är inaktiverat BlobBaseClient.Undelete används metoden för att återställa varje mjuk borttagen blob i containern.

Innan du kan följa det här exemplet måste du aktivera mjuk borttagning eller versionshantering på minst ett av dina lagringskonton.

Viktigt!

I följande exempel räknas en grupp blobar upp och lagras i minnet innan de bearbetas. Om versionshantering är aktiverat sorteras blobarna också. Användningen av parametern -ContinuationToken med $maxCount variabel begränsar antalet blobar i gruppen för att spara resurser. Om en container har miljontals blobar blir det extremt dyrt. Du kan justera värdet för variabeln $maxCount , men om en container har miljontals blobar bearbetar skriptet blobarna långsamt.

Mer information om dataskyddsalternativet mjuk borttagning finns i artikeln Mjuk borttagning för blobar .

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

Nästa steg