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
Ein Azure-Abonnement. Siehe Kostenlose Azure-Testversion.
Das Azure PowerShell-Modul
Az
wird für die Interaktion mit Azure empfohlen. Informationen zu den ersten Schritten mit dem Az PowerShell-Modul finden Sie unter Installieren von Azure PowerShell.
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."
}