Verwalten von Blockblobs mit PowerShell

Blobspeicher unterstützt Block-, Anfüge- und Seitenblobs. Blockblobs sind für das effiziente Hochladen großer Datenmengen optimiert. Sie eignen sich ideal zum Speichern von Bildern, Dokumenten und anderen Datentypen, die keinen zufälligen Lese- und Schreibvorgängen unterliegen. In diesem Artikel wird die Arbeitsweise mit Blockblobs erläutert.

Voraussetzungen

Konfigurieren eines Kontextobjekts, um Anmeldeinformationen zu kapseln

Jede Anforderung an Azure Storage muss autorisiert sein. Sie können eine von PowerShell gestellte Anforderung mit Ihrem Microsoft Entra-Konto oder mithilfe der Kontozugriffsschlüssel autorisieren. In den Beispielen in diesem Artikel wird die Microsoft Entra-Autorisierung mit Kontextobjekten verwendet. Kontextobjekte kapseln Ihre Microsoft Entra-Anmeldeinformationen und übergeben sie im Rahmen der nachfolgenden Datenvorgänge.

Um sich mit einem Microsoft Entra-Konto bei Ihrem Azure-Konto anzumelden, öffnen Sie PowerShell, und verwenden Sie das Cmdlet Connect-AzAccount.

#Connect to your Azure subscription
Connect-AzAccount

Nachdem die Verbindung hergestellt wurde, können Sie den Azure-Kontext erstellen. Durch die Authentifizierung mit Microsoft Entra ID wird automatisch ein Azure-Kontext für Ihr Standardabonnement erstellt. In einigen Fällen müssen Sie nach der Authentifizierung möglicherweise auf Ressourcen in einem anderen Abonnement zugreifen. Sie können das Abonnement ändern, das Ihrer aktuellen Azure-Sitzung zugeordnet ist, indem Sie den aktiven Sitzungskontext ändern.

Um Ihr Standardabonnement zu verwenden, müssen Sie den erforderlichen Kontext erstellen, indem Sie das Cmdlet New-AzStorageContext aufrufen. Schließen Sie den Parameter -UseConnectedAccount ein, damit Datenvorgänge mithilfe Ihrer Microsoft Entra-Anmeldeinformationen durchgeführt werden.

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

Um Abonnements zu ändern, rufen Sie zunächst das Kontextobjekt mit dem Cmdlet Get-AzSubscription ab, und ändern Sie dann den aktuellen Kontext mit Set-AzContext. Weitere Informationen finden Sie unter Ändern des aktiven Abonnements.

Erstellen eines Containers

Alle Blob-Daten werden in Containern gespeichert, daher benötigen Sie mindestens eine Containerressource, bevor Sie Daten hochladen können. Verwenden Sie bei Bedarf das folgende Beispiel, um einen Speichercontainer zu erstellen. Weitere Informationen finden Sie unter Verwalten von Blobcontainern mit PowerShell.

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

Wenn Sie die folgenden Beispiele verwenden, müssen Sie die Platzhalterwerte in Klammern durch Ihre eigenen Werte ersetzen. Weitere Informationen zum Anmelden mit Azure PowerShell finden Sie unter Anmelden mit Azure PowerShell.

Hochladen eines Blobs

Um eine Datei in ein Blockblob hochzuladen, übergeben Sie die erforderlichen Parameterwerte an das Cmdlet Set-AzStorageBlobContent. Geben Sie den Pfad und den Dateinamen mit dem Parameter -File und den Namen des Containers mit dem Parameter -Container an. Außerdem müssen Sie mit dem Parameter -Context einen Verweis auf das Kontextobjekt bereitstellen.

Mit diesem Befehl wird entweder das Blob erstellt, falls es noch nicht vorhanden ist, oder eine Aufforderung zur Bestätigung der Überschreibung geöffnet, falls es bereits vorhanden ist. Sie können die Datei ohne Bestätigung überschreiben, wenn Sie den Parameter -Force an das Cmdlet übergeben.

Im folgenden Beispiel wird ein -File-Parameterwert zum Hochladen einer einzelnen benannten Datei angegeben. Darüber hinaus wird die Verwendung des PowerShell-Pipelineoperators und des Cmdlets Get-ChildItem zum Hochladen mehrerer Dateien dargestellt. Das Cmdlet Get-ChildItem verwendet den -Path-Parameter, um C:\Temp\*.png anzugeben. Durch die Aufnahme des Sternchens (*) als Platzhalter werden alle Dateien mit der Dateinamenerweiterung .png angegeben. Der -Recurse-Parameter durchsucht das Temp-Verzeichnis und die dazugehörigen Unterverzeichnisse.

#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

Das Ergebnis zeigt den Namen des Speicherkontos, den Namen des Speichercontainers und eine Liste der hochgeladenen Dateien an.

   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

Auflisten von Blobs

Das Cmdlet Get-AzStorageBlob wird zum Auflisten von Blobs verwendet, die in einem Container gespeichert sind. Sie können verschiedene Ansätze verwenden, um den Umfang ihrer Suche zu definieren. Verwenden Sie die Parameter -Container und -Name, um ein bestimmtes Blob innerhalb eines bekannten Containers aufzulisten. Wenn Sie eine ungefilterte Liste aller Blobs innerhalb eines bestimmten Containers generieren möchten, verwenden Sie nur den Parameter -Container ohne den Wert -Name.

Es gibt keine Einschränkung in Bezug auf die Anzahl von Containern oder Blobs, die ein Speicherkonto enthalten kann. Um das Abrufen tausender Blobs zu vermeiden, sollten Sie die Menge der zurückgegebenen Daten beschränken. Beim Abrufen mehrerer Blobs können Sie den Parameter -Prefix verwenden, um Blob-Elemente anzugeben, deren Namen mit einer bestimmten Zeichenfolge beginnen. Sie können den Parameter -Name auch mit einem Platzhalter verwenden, um Dateinamen oder -typen anzugeben.

Der Parameter -MaxCount kann verwendet werden, um die Anzahl der ungefilterten Blobs zu beschränken, die von einem Container zurückgegeben werden. Für alle Azure-Ressourcen gilt ein Dienstgrenzwert von 5.000. Durch diesen Grenzwert wird sichergestellt, dass verwaltbare Datenmengen abgerufen werden und dass die Leistung nicht beeinträchtigt wird. Wenn die Anzahl der zurückgegebenen Blobs entweder den Wert -MaxCount oder den Dienstgrenzwert überschreitet, wird ein Fortsetzungstoken zurückgegeben. Mit diesem Token können Sie mehrere Anforderungen verwenden, um eine beliebige Anzahl von Blobs abzurufen. Weitere Informationen finden Sie unter Aufzählen von Blobressourcen.

Im folgenden Beispiel werden mehrere Ansätze veranschaulicht, die für die Bereitstellung einer Liste mit Blobs verwendet werden können. Bei dem ersten Ansatz wird ein einzelnes Blob innerhalb einer bestimmten Containerressource aufgelistet. Beim zweiten Ansatz wird ein Platzhalter verwendet, um alle .jpg-Dateien mit dem Präfix Louis aufzulisten. Die Suche wird durch den -MaxCount-Parameter auf fünf Container beschränkt. Beim dritten Ansatz werden die Parameter -MaxCount und -ContinuationToken verwendet, um das Abrufen von allen Blobs innerhalb eines Containers zu beschränken.

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

Die ersten beiden Ansätze zeigen die Speicherkonto- und Containernamen sowie eine Liste der abgerufenen Blobs an. Der dritte Ansatz zeigt die Gesamtanzahl der Blobs innerhalb eines benannten Containers an. Die Blobs werden in Batches abgerufen und eine Statusleiste zeigt den Fortschritt während der Zählung an.

   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.

Herunterladen eines Blobs

Je nach Ihrem Anwendungsfall kann das Cmdlet Get-AzStorageBlobContent zum Herunterladen einzelner oder mehrerer Blobs verwendet werden. Wie bei den meisten Vorgängen ist für beide Ansätze ein Kontextobjekt erforderlich.

Um ein einzelnes benanntes Blob herunterzuladen, können Sie das Cmdlet direkt aufrufen und die Werte für die Parameter -Blob und -Container angeben. Das Blob wird standardmäßig in das Arbeitsverzeichnis von PowerShell heruntergeladen, Sie können aber auch einen alternativen Speicherort angeben. Um den Zielspeicherort zu ändern, muss ein gültiger, vorhandener Pfad mit dem -Destination-Parameter übergeben werden. Da der Vorgang selbst kein Ziel erstellen kann, tritt ein Fehler auf, wenn der angegebene Pfad nicht vorhanden ist.

Durch eine Kombination des Cmdlets Get-AzStorageBlob und des PowerShell-Pipelineoperators können mehrere Blobs heruntergeladen werden. Erstellen Sie zunächst eine Blob-Liste mit dem Cmdlet Get-AzStorageBlob. Verwenden Sie als Nächstes den Pipelineoperator und das Cmdlet Get-AzStorageBlobContent, um die Blobs aus dem Container abzurufen.

Der folgende Beispielcode enthält Ansatzbeispiele für einzelne und mehrere Downloads. Darüber hinaus veranschaulicht er einen vereinfachten Ansatz zum Durchsuchen aller Container nach bestimmten Dateien mithilfe eines Platzhalters. Da einige Umgebungen über hunderttausende Ressourcen verfügen können, wird die Verwendung des Parameters -MaxCount empfohlen.

#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

Das Ergebnis zeigt den Namen des Speicherkontos und des Containers an und enthält eine Liste der heruntergeladenen Dateien.

   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

Verwalten von Blobeigenschaften und Metadaten

Ein Container macht sowohl Systemeigenschaften als auch benutzerdefinierte Metadaten verfügbar. Systemeigenschaften sind in jeder Blob Storage-Ressource vorhanden. Einige davon sind schreibgeschützt, während andere gelesen oder festgelegt werden können. Darüber hinaus lassen sich einige Systemeigenschaften bestimmten HTTP-Standardheadern zuordnen.

Benutzerdefinierte Metadaten bestehen aus mindestens einem Name-Wert-Paar, das Sie für eine Blob Storage-Ressource angeben. Metadaten können verwendet werden, um diese Werte mit der Ressource zu speichern. Metadatenwerte sind nur für Ihre eigenen Zwecke bestimmt und wirken sich nicht auf das Verhalten der Ressource aus.

Lesen von Blobeigenschaften

Zum Lesen von Blobeigenschaften oder Metadaten müssen Sie zuerst das Blob aus dem Dienst abrufen. Verwenden Sie das Cmdlet Get-AzStorageBlob, um die Eigenschaften und Metadaten eines Blob, aber nicht dessen Inhalt, abzurufen. Rufen Sie als Nächstes die Blobeigenschaften mit der BlobClient.GetProperties-Methode ab. Die Eigenschaften oder Metadaten können dann nach Bedarf gelesen oder festgelegt werden.

Im folgenden Beispiel wird ein Blob abgerufen und seine Eigenschaften aufgelistet.

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

Das Ergebnis zeigt eine Liste mit den Blobeigenschaften an, wie nachfolgend dargestellt.

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

Lesen und Schreiben von Blob-Metadaten

Blob-Metadaten sind ein optionaler Satz von Name/Wert-Paaren, die einem Blob zugeordnet sind. Wie im vorherigen Beispiel dargestellt, sind am Anfang noch keine Metadaten mit einem Blob verknüpft, sie können jedoch bei Bedarf hinzugefügt werden. Verwenden Sie die BlobClient.UpdateMetadata-Methode zum Aktualisieren von Blob-Metadaten. Diese Methode akzeptiert nur Schlüssel-Wert-Paare, die in einem generischen IDictionary-Objekt gespeichert sind. Weitere Informationen finden Sie in der Klassendefinition von BlobClient.

Im folgenden Beispiel werden die Metadaten eines Blobs zuerst aktualisiert, dann festgelegt und anschließend abgerufen. Das Beispiel-Blob wird aus dem Arbeitsspeicher entfernt, um sicherzustellen, dass die Metadaten nicht aus dem Speicherobjekt gelesen werden.

#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

Das Ergebnis gibt die aktualisierten Metadaten des Blobs zurück, wie im folgenden Beispiel dargestellt.

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

Kopiervorgänge für Blobs

Es gibt viele Szenarien, in denen das Kopieren von verschiedenen Blobs notwendig ist. Die Beispiele in diesem Artikel sind auf Blockblobs beschränkt.

Kopieren eines Quellblobs in ein Zielblob

Für einen vereinfachten Kopiervorgang innerhalb desselben Speicherkontos können Sie das Cmdlet Copy-AzStorageBlob verwenden. Da bei diesem Vorgang ein Blob innerhalb desselben Speicherkontos kopiert wird, handelt es sich um einen synchronen Vorgang. Kontoübergreifende Vorgänge sind asynchron.

Sie sollten darüber nachdenken, AzCopy für eine Erleichterung der Vorgänge und eine bessere Leistung zu verwenden, insbesondere beim Kopieren von Blob-Dateien zwischen verschiedenen Speicherkonten. AzCopy ist ein Befehlszeilenhilfsprogramm, das Sie verwenden können, um Blobs oder Dateien in oder aus einem Speicherkonto zu kopieren. Erfahren Sie mehr über die ersten Schritte mit AzCopy.

Im folgenden Beispiel wird das bannerphoto.png-Blob aus dem Container Fotos in den Ordner Fotos im Archivcontainer kopiert. Beide Container befinden sich innerhalb desselben Speicherkontos. Durch das Ergebnis wird der Erfolg des Kopiervorgangs verifiziert.

$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

Sie können den Parameter -Force verwenden, um ein vorhandenes Blob mit demselben Namen am Ziel zu überschreiben. Durch diesen Vorgang wird das Zielblob effektiv ersetzt. Darüber hinaus werden alle Blöcke ohne Commit entfernt und die Metadaten des Zielblobs überschrieben.

Kopieren einer Momentaufnahme in ein Zielblob mit einem anderen Namen

Das resultierende Zielblob ist ein beschreibbares Blob und keine Momentaufnahme.

Das Quellblob für einen Kopiervorgang kann ein Blockblob, ein Anfügeblob, ein Seitenblob oder eine Momentaufnahme sein. Wenn das Zielblob bereits vorhanden ist, muss es von demselben Blobtyp wie das Quellblob sein. Ein eventuell vorhandenes Zielblob wird überschrieben.

Das Zielblob kann während der Ausführung eines Kopiervorgangs nicht geändert werden. Bei einem Zielblob kann es nur einen ausstehenden Kopiervorgang geben. Anders ausgedrückt: Ein Blob kann nicht das Ziel für mehrere ausstehende Kopiervorgänge sein.

Wenn Sie ein Blob innerhalb desselben Speicherkontos kopieren, ist dies ein synchroner Vorgang. Kontoübergreifende Kopiervorgänge sind asynchron.

Es wird immer das gesamte Quellblob oder die gesamte Quelldatei kopiert. Das Kopieren eines Bytebereichs oder einer Gruppe von Blöcken wird nicht unterstützt.

Wenn ein Blob kopiert wird, werden dessen Systemeigenschaften mit denselben Werten in das Zielblob kopiert.

Außerdem wird gezeigt, wie ein asynchroner Kopiervorgang abgebrochen wird.

Momentaufnahme von Blobs

Eine Momentaufnahme ist eine schreibgeschützte Version eines Blobs, die zu einem bestimmten Zeitpunkt erstellt wird. Eine Momentaufnahme eines Blobs ist mit dem dazugehörigen Basisblob bis auf die Ausnahme identisch, dass an den Blob-URI ein DateTime-Wert angefügt ist. Mit diesem Wert wird der Zeitpunkt angegeben, zu dem die Momentaufnahme erstellt wurde, und dieser Wert ist der einzige Unterschied zwischen dem Basisblob und der Momentaufnahme.

Dem Basisblob zugeordnete Leases wirken sich nicht auf die Momentaufnahme aus. Sie können für eine Momentaufnahme keine Lease abrufen. Hier finden Sie weitere Informationen zu Blobmomentaufnahmen.

Mit dem folgenden Beispielcode wird ein Blob aus einem Speichercontainer abgerufen und eine Momentaufnahme davon erstellt.

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

Festlegen des Blobtarifs

Wenn Sie die Ebene eines Blobs ändern, wird das Blob mit allen zugehörigen Daten in die Zielebene verschoben. Rufen Sie zum Vornehmen der Änderung zunächst ein Blob mit dem Cmdlet Get-AzStorageBlob ab, und rufen Sie anschließend die BlobClient.SetAccessTier-Methode auf. Dieser Ansatz kann verwendet werden, um für die Ebene zwischen Heiß, Kalt und Archiv zu wechseln.

Die Änderung der Ebene von Kalt oder Heiß zu Archiv erfolgt fast sofort. Wenn sich ein Blob auf der Ebene Archiv befindet, gilt es als offline und kann nicht gelesen oder geändert werden. Bevor Sie die Daten eines archivierten Blobs lesen oder ändern können, müssen Sie es durch die Änderung seiner Ebene zu einer Online-Ebene wieder aktivieren. Weitere Informationen finden Sie unter Reaktivierung von Blobs aus der Archivebene.

Im folgenden Beispielcode wird die Ebene für alle Blobs im Container archive auf Heiß festgelegt.

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

Vorgänge mit Blob-Tags

Blobindextags vereinfachen die Verwaltung und Ermittlung von Daten. Bei Blob-Indextags handelt es sich um benutzerdefinierte Schlüssel-Wert-Indexattribute, die Sie auf die Blobs anwenden können. Nach der Konfiguration können Sie Objekte innerhalb eines einzelnen Containers oder über alle Container hinweg kategorisieren und suchen. Durch die Aktualisierung ihrer Indextags können Blobressourcen dynamisch kategorisiert werden, ohne dass eine Änderung der Containerorganisation erforderlich ist. Indextags ermöglichen Ihnen einen flexiblen Umgang mit sich ändernden Datenanforderungen. Sie können sowohl Metadaten- als auch Indextags gleichzeitig verwenden. Weitere Informationen zu Indextags finden Sie unter Verwalten und Finden von Azure-Blobdaten mit Blobindextags.

Das folgende Beispiel veranschaulicht das Hinzufügen von Blob-Indextags zu einer Reihe von Blobs. Im Beispiel werden die Daten aus einer XML-Datei gelesen und zum Erstellen von Indextags für mehrere Blobs verwendet. Um den Beispielcode verwenden zu können, müssen Sie eine lokale blob-list.xml-Datei im Verzeichnis C:\temp erstellen. Die XML-Daten werden im folgenden Beispiel bereitgestellt.

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

Der Beispielcode erstellt eine Hashtabelle und weist ihr die $tags-Variable zu. Als Nächstes werden die Cmdlets Get-Content und Get-Data verwendet, um ein auf der XML-Struktur basierendes Objekt zu erstellen. Anschließend werden der Hashtabelle Schlüssel-Wert-Paare hinzufügt, die als Tagwerte verwendet werden sollen. Zu guter Letzt durchläuft der Beispielcode das XML-Objekt und erstellt Tags für jeden File-Knoten.

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

Löschen von Blobs

Mit dem Cmdlet Remove-AzStorageBlob können Sie entweder ein einzelnes Blob oder eine Reihe von Blobs löschen. Wenn Sie mehrere Blobs löschen, können Sie bedingte Operationen, Schleifen oder die PowerShell-Pipeline verwenden, wie in den folgenden Beispielen dargestellt.

Warnung

Die Ausführung der folgenden Beispiele kann dazu führen, dass Blobs dauerhaft gelöscht werden. Microsoft empfiehlt die Aktivierung des vorläufigen Löschens für Container, um Container und Blobs vor versehentlichem Löschen zu schützen. Weitere Informationen finden Sie unter Vorläufiges Löschen für Container.

#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 einigen Fällen können gelöschte Blobs wieder abgerufen werden. Wenn die Datenschutzoption für das vorläufige Löschen in Ihrem Speicherkonto aktiviert ist, gibt der -IncludeDeleted-Parameter Blobs zurück, die innerhalb des zugewiesenen Aufbewahrungszeitraums gelöscht wurden. Weitere Informationen zum vorläufigen Löschen finden Sie in dem Artikel Vorläufiges Löschen für Blobs.

Verwenden Sie das folgende Beispiel, um eine Liste von Blobs abzurufen, die innerhalb des zugewiesenen Aufbewahrungszeitraums des Containers gelöscht wurden. Das Ergebnis zeigt eine Liste der zuletzt gelöschten Blobs an.

#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

Wiederherstellen eines gelöschten Blobs

Wie im Abschnitt Auflisten von Blobs erwähnt, können Sie die Datenschutzoption für das vorläufige Löschen in Ihrem Speicherkonto konfigurieren. Wenn diese Option aktiviert ist, können Blobs, die innerhalb des zugewiesenen Aufbewahrungszeitraums gelöscht wurden, wiederhergestellt werden. Sie können außerdem die Versionsverwaltung verwenden, um für jede Wiederherstellung frühere Versionen Ihrer Blobs aufzubewahren.

Wenn sowohl die Blobversionsverwaltung als auch das vorläufige Löschen von Blobs aktiviert sind, wird beim Ändern, Überschreiben, Löschen oder Wiederherstellen eines Blobs automatisch eine neue Version erstellt. Welche Methode Sie zum Wiederherstellen eines gelöschten Blobs verwenden, hängt davon ab, ob für Ihr Speicherkonto die Versionsverwaltung aktiviert ist.

Im folgenden Codebeispiel werden alle vorläufig gelöschten Blobs wiederhergestellt, oder bei aktivierter Versionierung die neueste Version eines Blobs wiederhergestellt. Zunächst wird mit dem Cmdlet Get-AzStorageBlobServiceProperty bestimmt, ob die Versionsverwaltung aktiviert ist.

Wenn die Versionsverwaltung aktiviert ist, ruft das Cmdlet Get-AzStorageBlob eine Liste aller eindeutig benannten Blobversionen ab. Als Nächstes werden die Blobversionen in der Liste abgerufen und nach Datum sortiert. Wenn keine Versionen mit dem Attributwert LatestVersion gefunden werden, wird das Cmdlet Copy-AzBlob verwendet, um eine aktive Kopie der neuesten Version zu erstellen.

Wenn die Versionsverwaltung deaktiviert ist, wird die BlobBaseClient.Undelete-Methode verwendet, um jedes vorläufig gelöschte Blob im Container wiederherzustellen.

Damit Sie dieses Beispiel nachvollziehen können, müssen Sie das vorläufige Löschen oder die Versionsverwaltung für mindestens eines Ihrer Speicherkonten aktivieren.

Wichtig

Im folgenden Beispiel wird eine Gruppe von Blobs aufgelistet und vor der Verarbeitung im Arbeitsspeicher gespeichert. Wenn die Versionsverwaltung aktiviert ist, werden auch die Blobs sortiert. Die Verwendung des -ContinuationToken-Parameters mit der Variable $maxCount begrenzt die Anzahl von Blobs innerhalb der Gruppe, um Ressourcen zu sparen. Wenn ein Container Millionen von Blobs enthält, ist dies extrem teuer. Sie können den Wert der Variable $maxCount anpassen, aber wenn ein Container Millionen von Blobs enthält, wird das Skript die Blobs langsam verarbeiten.

Weitere Informationen über die Datenschutzoption für das vorläufigen Löschen finden Sie in dem Artikel Vorläufiges Löschen für Blobs.

$accountName   ="myStorageAccount"
$groupName     ="myResourceGroup"
$containerName ="mycontainer"
$maxCount      = 1000
$token         = $null


$blobSvc = Get-AzStorageBlobServiceProperty `
    -StorageAccountName $accountName `
    -ResourceGroupName $groupName

# If soft delete is enabled
if($blobSvc.DeleteRetentionPolicy.Enabled)
{
    # If versioning is enabled
    if($blobSvc.IsVersioningEnabled -eq $true)
    {
        # Set context
        $ctx = New-AzStorageContext `
            -StorageAccountName $accountName `
            -UseConnectedAccount
        do
        {
            # Get all blobs and versions using -Unique 
            # to avoid processing duplicates/versions
            $blobs = Get-AzStorageBlob `
                -Container $containerName `
                -Context $ctx -IncludeVersion | `
                    Where-Object {$_.VersionId -ne $null} | `
                    Sort-Object -Property Name -Unique

            # Iterate the collection
            foreach ($blob in $blobs)
            {
                # Process versions
                if($blob.VersionId -ne $null)
                {
            
                    # Get all versions of the blob, newest to oldest
                    $delBlob = Get-AzStorageBlob `
                        -Container $containerName `
                        -Context $ctx `
                        -Prefix $blob.Name `
                        -IncludeDeleted -IncludeVersion  | `
                            Sort-Object -Property VersionId -Descending

                    # Verify that the newest version is NOT the latest (that the version is "deleted")
                    if (-Not $delBlob[0].IsLatestVersion)
                    {
                        $delBlob[0] | Copy-AzStorageBlob `
                            -DestContainer $containerName `
                            -DestBlob $delBlob[0].Name
                    }
                
                    #Dispose the temporary object
                    $delBlob = $null
                }
            }
            $token = $blobs[$blobs.Count -1].ContinuationToken;
        }
        while ($null -ne $token)
    }

    # Otherwise (if versioning is disabled)
    else
    {
        $blobs = Get-AzStorageBlob `
            -Container $containerName `
            -Context $ctx -IncludeDeleted | `
                Where-Object {$_.IsDeleted}
        foreach($blob in $blobs)
        {
            if($blob.IsDeleted) { $blob.BlobBaseClient.Undelete() }
        }
    }
}
else
{
    echo "Sorry, the delete retention policy is not enabled."
}

Nächste Schritte