Udostępnij za pomocą


Zarządzanie blokowymi blobami w programie PowerShell

Usługa Blob Storage obsługuje bloby blokowe, dopisywalne i stronicowe. Blokowe obiekty blob są zoptymalizowane pod kątem wydajnego przekazywania dużych ilości danych. Bloby blokowe są idealne do przechowywania obrazów, dokumentów i innych typów danych, które nie są poddawane losowym operacjom odczytu i zapisu. W tym artykule wyjaśniono, jak pracować z blokowymi blobami.

Wymagania wstępne

Konfigurowanie obiektu kontekstu w celu hermetyzacji poświadczeń

Każde żądanie do usługi Azure Storage musi być autoryzowane. Możesz autoryzować żądanie wykonane z programu PowerShell przy użyciu konta Microsoft Entra lub przy użyciu kluczy dostępu do konta. W przykładowych zastosowaniach w tym artykule użyto autoryzacji Microsoft Entra razem z obiektami kontekstu. Obiekty kontekstowe hermetyzują poświadczenia Microsoft Entra i przekazują je podczas kolejnych operacji na danych.

Aby zalogować się do konta platformy Azure przy użyciu konta Microsoft Entra, otwórz program PowerShell i wywołaj polecenie cmdlet Connect-AzAccount .

#Connect to your Azure subscription
Connect-AzAccount

Po nawiązaniu połączenia utwórz kontekst platformy Azure. Uwierzytelnianie przy użyciu identyfikatora Entra firmy Microsoft automatycznie tworzy kontekst platformy Azure dla subskrypcji domyślnej. W niektórych przypadkach może być konieczne uzyskanie dostępu do zasobów w innej subskrypcji po uwierzytelnieniu. Subskrypcję skojarzona z bieżącą sesją platformy Azure można zmienić, modyfikując aktywny kontekst sesji.

Aby użyć domyślnej subskrypcji, utwórz kontekst, wywołując New-AzStorageContext polecenie cmdlet . Uwzględnij parametr , -UseConnectedAccount aby operacje na danych były wykonywane przy użyciu poświadczeń firmy Microsoft Entra.

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

Aby zmienić subskrypcje, pobierz obiekt kontekstu za pomocą polecenia cmdlet Get-AzSubscription , a następnie zmień bieżący kontekst na Set-AzContext. Aby uzyskać więcej informacji, zobacz Zmienianie aktywnej subskrypcji.

Tworzenie kontenera

Wszystkie dane obiektów blob są przechowywane w kontenerach, więc przed przesłaniem danych potrzebny jest co najmniej jeden zasób kontenerowy. W razie potrzeby użyj poniższego przykładu, aby utworzyć pojemnik do przechowywania. Aby uzyskać więcej informacji, zobacz Zarządzanie kontenerami obiektów blob przy użyciu programu PowerShell.

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

W przypadku użycia poniższych przykładów należy zastąpić wartości symboli zastępczych w nawiasach własnymi wartościami. Aby uzyskać więcej informacji na temat logowania się do platformy Azure przy użyciu programu PowerShell, zobacz Logowanie się przy użyciu programu Azure PowerShell.

Prześlij blob

Aby załadować plik do bloba blokowego, przekaż wymagane wartości parametrów Set-AzStorageBlobContent do polecenia cmdlet. Podaj ścieżkę i nazwę pliku z parametrem -File oraz nazwę kontenera z parametrem -Container . Należy również podać odwołanie do obiektu kontekstu za pomocą parametru -Context .

Polecenie to tworzy obiekt blob, jeśli jeszcze nie istnieje, lub prosi o potwierdzenie nadpisania, jeśli już istnieje. Możesz zastąpić plik bez potwierdzenia, jeśli przekażesz -Force parametr do cmdletu.

W poniższym przykładzie określono wartość parametru -File w celu przekazania pojedynczego, nazwanego pliku. Demonstruje również użycie operatora potoku PowerShell i polecenia cmdlet Get-ChildItem do przesyłania wielu plików. Polecenie Get-ChildItem cmdlet używa parametru -Path , aby określić C:\Temp\*.png. Dołączenie gwiazdki (*) jako symbolu wieloznacznego określa wszystkie pliki z rozszerzeniem nazwy pliku .png. Parametr -Recurse przeszukuje katalog Tymczasowy i jego podkatalogi.

#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

Wynik wyświetli nazwę konta magazynu, nazwę kontenera magazynu oraz listę przesłanych plików.

   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

Wyświetl listę blobów

Polecenie Get-AzStorageBlob cmdlet służy do wyświetlania listy blobów przechowywanych w kontenerze. Możesz użyć różnych podejść do zdefiniowania zakresu wyszukiwania. Użyj parametrów -Container i -Name, aby wskazać konkretny obiekt blob w znanym kontenerze. Aby wygenerować niefiltrowaną listę wszystkich obiektów blob w określonym kontenerze, użyj samego parametru -Container, bez wartości dla -Name.

Nie ma żadnych ograniczeń dotyczących liczby kontenerów lub blobów, które może mieć konto magazynowe. Aby uniknąć potencjalnego pobierania tysięcy blobów, warto ograniczyć ilość zwracanych danych. Podczas pobierania wielu obiektów blob można użyć parametru -Prefix , aby określić obiekty blob, których nazwy zaczynają się od określonego ciągu. Można również użyć parametru -Name z symbolem wieloznacznym, aby określić nazwy plików lub ich typy.

Parametr -MaxCount może być użyty do ograniczenia liczby niefiltrowanych blobów zwracanych z kontenera. Limit usługi 5000 jest nakładany na wszystkie zasoby platformy Azure. Ten limit gwarantuje, że możliwe do zarządzania ilości danych są pobierane, a wydajność nie ma wpływu. Jeśli liczba zwracanych obiektów blob przekracza wartość -MaxCount lub limit usługi, zwracany jest token kontynuacji. Ten token umożliwia korzystanie z wielu żądań do pobierania dowolnej liczby obiektów typu blob. Więcej informacji można znaleźć w temacie Wyliczanie zasobów obiektów blob.

W poniższym przykładzie przedstawiono kilka podejść używanych do przygotowania listy blobów. Pierwsze podejście zawiera listę pojedynczego obiektu blob w ramach określonego zasobu kontenera. Drugie podejście używa symbolu wieloznakowego, aby wyświetlić listę wszystkich .jpg plików z prefiksem Louis. Wyszukiwanie jest ograniczone do pięciu kontenerów przy użyciu parametru -MaxCount . Trzecie podejście używa parametrów -MaxCount i -ContinuationToken w celu ograniczenia pobierania wszystkich obiektów blob w kontenerze.

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

Pierwsze dwa podejścia wyświetlają nazwy konta magazynu i kontenera oraz listę pobranych obiektów blob. Trzecie podejście wyświetla łączną liczbę obiektów typu blob w kontenerze o określonej nazwie. Obiekty blob są pobierane w partiach, a pasek stanu pokazuje postęp podczas liczenia.

   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.

Pobierz blob

W zależności od przypadku użycia Get-AzStorageBlobContent, polecenie cmdlet może służyć do pobierania pojedynczego lub wielu obiektów blob. Podobnie jak w przypadku większości operacji, obie metody wymagają obiektu kontekstu.

Aby pobrać pojedynczy nazwany Blob, możesz bezpośrednio użyć polecenia cmdlet i podać wartości parametrów -Blob i -Container. Obiekt blob jest domyślnie pobierany do roboczego katalogu programu PowerShell, ale można określić alternatywną lokalizację. Aby zmienić lokalizację docelową, należy przekazać prawidłową istniejącą ścieżkę z parametrem -Destination . Ponieważ operacja nie może utworzyć miejsca docelowego, kończy się niepowodzeniem z powodu błędu, jeśli określona ścieżka nie istnieje.

Wiele obiektów blob można pobrać, łącząc cmdlet Get-AzStorageBlob i operator potokowy programu PowerShell. Najpierw utwórz listę obiektów blob przy użyciu polecenia Get-AzStorageBlob cmdlet. Następnie użyj operatora rurociągu i polecenia cmdlet Get-AzStorageBlobContent, aby pobrać obiekty blob z kontenera.

Poniższy przykładowy kod zawiera przykład podejścia zarówno do pojedynczego, jak i wielokrotnego pobierania. Oferuje również uproszczone podejście do wyszukiwania wszystkich kontenerów dla określonych plików przy użyciu symbolu wieloznakowego. Ponieważ niektóre środowiska mogą mieć setki tysięcy zasobów, zaleca się użycie parametru -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

W wyniku zostaną wyświetlone nazwy konta magazynu i kontenera oraz lista pobranych plików.

   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

Zarządzanie właściwościami i metadanymi obiektów blob

Kontener uwidacznia zarówno właściwości systemu, jak i metadane zdefiniowane przez użytkownika. Właściwości systemu istnieją w każdym zasobie usługi Blob Storage. Niektóre właściwości są tylko do odczytu, podczas gdy inne mogą być odczytywane lub ustawiane. Pod spodem niektóre właściwości systemu są mapowane na standardowe nagłówki HTTP.

Metadane zdefiniowane przez użytkownika składają się z co najmniej jednej pary nazwa-wartość określonej dla zasobu usługi Blob Storage. Za pomocą metadanych można przechowywać te wartości za pomocą zasobu. Wartości metadanych są przeznaczone tylko do własnych celów i nie wpływają na sposób, w jaki zasób się zachowuje.

Odczytywanie właściwości obiektu blob

Aby odczytać właściwości obiektu blob lub metadane, musisz najpierw pobrać obiekt blob z usługi. Użyj polecenia Get-AzStorageBlob cmdlet, aby pobrać właściwości i metadane danych obiektu blob, ale nie pobierać jego zawartości. Następnie użyj metody BlobClient.GetProperties, aby pobrać właściwości obiektu blob. Właściwości lub metadane można następnie odczytywać lub ustawiać zgodnie z potrzebami.

Poniższy przykład pobiera obiekt blob i wyświetla jego właściwości.

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

W wyniku zostanie wyświetlona lista właściwości obiektu blob, jak pokazano w poniższym przykładzie.

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

Odczytywanie i zapisywanie metadanych obiektu blob

Metadane obiektu blob to opcjonalny zestaw par nazw/wartości skojarzonych z obiektem blob. Jak pokazano w poprzednim przykładzie, początkowo nie ma żadnych metadanych skojarzonych z obiektem blob, ale można go dodać w razie potrzeby. Aby zaktualizować metadane obiektu blob, użyj BlobClient.UpdateMetadata metody . Ta metoda akceptuje tylko pary klucz-wartość przechowywane w obiekcie ogólnym IDictionary . Aby uzyskać więcej informacji, zobacz definicję klasy BlobClient .

Poniższy przykład najpierw aktualizuje, a następnie zatwierdza metadane obiektu blob, a następnie pobiera je. Przykładowy obiekt blob jest opróżniany z pamięci, aby upewnić się, że metadane nie są odczytywane z obiektu w pamięci.

#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

Wynik zwraca nowo zaktualizowane metadane obiektu blob, jak pokazano w poniższym przykładzie.

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

Operacje kopiowania obiektów typu blob

Istnieje wiele scenariuszy, w których można skopiować bloby różnych typów. Przykłady w tym artykule są ograniczone do blobów blokowych.

Kopiowanie źródłowego blobu do docelowego blobu

Aby uprościć operację kopiowania w ramach tego samego konta magazynu, użyj polecenia Copy-AzStorageBlob cmdlet. Ponieważ operacja kopiuje blob w ramach tego samego konta magazynu, jest to operacja synchroniczna. Operacje między kontami są asynchroniczne.

Należy rozważyć użycie narzędzia AzCopy z myślą o łatwiejszym i efektywniejszym działaniu, zwłaszcza przy kopiowaniu blobów między kontami magazynowymi. AzCopy to narzędzie wiersza polecenia, którego można używać do kopiowania obiektów blob lub plików do lub z konta magazynowego. Dowiedz się więcej na temat rozpoczynania pracy z narzędziem AzCopy.

Poniższy przykład kopiuje obiekt blob bannerphoto.png z kontenera photos do folderu photos w kontenerze archiwum . Oba kontenery istnieją w tym samym koncie magazynowym. Wynik weryfikuje powodzenie operacji kopiowania.

$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

Możesz użyć parametru -Force , aby zastąpić istniejący obiekt blob o tej samej nazwie w miejscu docelowym. Ta operacja skutecznie zastępuje docelowy blob. Również usuwa wszelkie niezatwierdzone bloki i nadpisuje metadane docelowego blobu.

Kopiowanie migawki do docelowego obiektu blob o innej nazwie

Wynikowy docelowy obiekt blob jest zapisywalnym obiektem blob, a nie migawką.

Źródłowy blob do operacji kopiowania może być blobem blokowym, blobem dołączanym, blobem stronicowym lub migawką. Jeśli docelowy obiekt blob już istnieje, musi mieć ten sam typ blob co źródłowy blob. Istniejący docelowy obiekt blob zostaje zastąpiony.

Nie można zmodyfikować docelowego obiektu blob, gdy trwa operacja kopiowania. Docelowy obiekt blob może mieć tylko jedną trwającą operację kopiowania. Innymi słowy, blob nie może być używany jako miejsce docelowe dla wielu oczekujących operacji kopiowania.

Podczas kopii obiektu blob na tym samym koncie przechowywania jest to operacja synchroniczna. Operacje kopiowania między kontami są asynchroniczne.

Cały źródłowy obiekt blob lub plik jest zawsze kopiowany. Kopiowanie zakresu bajtów lub zestawu bloków nie jest obsługiwane.

Po skopiowaniu obiektu blob jego właściwości systemowe są kopiowane do docelowego obiektu blob z tymi samymi wartościami.

Pokazano również, jak przerwać operację kopiowania asynchronicznego.

Migawki blobów

Migawka to wersja tylko do odczytu obiektu blob, która jest wykonywana w danym momencie. Migawka obiektu blob jest identyczna z podstawowym obiektem blob, z tą różnicą, że wartość DateTime jest dołączana do identyfikatora URI. Ta wartość wskazuje czas, w którym migawka została wykonana, i oferuje jedyne rozróżnienie między podstawowym obiektem blob a migawką.

Wszystkie dzierżawy skojarzone z podstawowym obiektem blob nie mają wpływu na migawkę. Nie można uzyskać dzierżawy migawki. Przeczytaj więcej na temat migawek Blob.

Poniższy przykładowy kod pobiera obiekt blob z kontenera pamięci masowej i tworzy jego migawkę.

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

Ustaw warstwę obiektu blob

Podczas zmiany poziomu obiektu blob, przenosisz ten obiekt i wszystkie jego dane do docelowego poziomu. Aby wprowadzić zmianę, pobierz obiekt blob za pomocą Get-AzStorageBlob polecenia cmdlet i wywołaj metodę BlobClient.SetAccessTier . Tego podejścia można użyć do zmiany warstwy między gorącą, chłodną i archiwum.

Zmiana warstw z chłodnej lub gorącej na archiwum odbywa się niemal natychmiast. Po przeniesieniu obiektu blob do warstwy Archiwum jest uważany za offline i nie można go odczytać ani zmodyfikować. Zanim będzie można odczytać lub zmodyfikować zarchiwizowane dane obiektu blob, należy przywrócić je do warstwy online. Przeczytaj więcej na temat rehydratacji obiektów blob z warstwy archiwum.

Poniższy przykładowy kod ustawia warstwę na gorącą dla wszystkich obiektów blob w kontenerze archive .

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

Operacje z użyciem tagów blob

Tagi indeksu obiektów blob ułatwiają zarządzanie danymi i wyszukiwanie. Tagi indeksu blobów to atrybuty klucz-wartość zdefiniowane przez użytkownika, które można zastosować do tych obiektów. Po skonfigurowaniu można kategoryzować i znajdować obiekty w pojedynczym kontenerze lub we wszystkich kontenerach. Zasoby obiektów blob można dynamicznie kategoryzować, aktualizując tagi indeksów bez konieczności zmiany organizacji kontenerów. Tagi indeksów oferują elastyczny sposób radzenia sobie ze zmieniającymi się wymaganiami dotyczącymi danych. Jednocześnie można używać tagów metadanych i indeksów. Aby uzyskać więcej informacji na temat tagów indeksu, zobacz Zarządzanie danymi obiektów blob platformy Azure i znajdowanie ich za pomocą tagów indeksu.

Poniższy przykład pokazuje, jak dodać tagi indeksu do serii obiektów blob. Przykład odczytuje dane z pliku XML i używa ich do tworzenia tagów indeksu w kilku blobach. Aby użyć przykładowego kodu, utwórz lokalny plik blob-list.xml w katalogu C:\temp . Dane XML są udostępniane w poniższym przykładzie.

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

Przykładowy kod tworzy tabelę skrótów i przypisuje do niej zmienną $tags . Następnie użyje poleceń Get-Content cmdlet i Get-Data do utworzenia obiektu na podstawie struktury XML. Następnie dodaje pary klucz-wartość do tabeli skrótów, które mają być używane jako wartości tagów. Na koniec iteruje za pośrednictwem obiektu XML i tworzy tagi dla każdego File węzła.

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

Usuń bloby

Poleceniem cmdlet Remove-AzStorageBlob można usunąć pojedynczy obiekt blob lub serię obiektów blob. Podczas usuwania wielu obiektów blob można użyć operacji warunkowych, pętli lub potoku programu PowerShell, jak pokazano w poniższych przykładach.

Ostrzeżenie

Uruchomienie poniższych przykładów może trwale usunąć bloby. Microsoft zaleca włączenie miękkiego usuwania kontenerów, aby chronić kontenery i bloby przed przypadkowym usunięciem. Aby uzyskać więcej informacji, zobacz Miękkie usuwanie dla kontenerów.

#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

W niektórych przypadkach można pobrać obiekty blob, które zostały usunięte. Jeśli opcja ochrony danych przy miękkim usuwaniu konta magazynu jest włączona, parametr -IncludeDeleted zwraca obiekty blob usunięte w skojarzonym okresie przechowywania. Aby dowiedzieć się więcej na temat miękkiego usuwania, zapoznaj się z artykułem Miękkie usuwanie dla obiektów blob.

Skorzystaj z poniższego przykładu, aby pobrać listę obiektów blob usuniętych w skojarzonym okresie przechowywania kontenera. Wynik wyświetla listę ostatnio usuniętych blobów.

#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

Przywróć usunięty obiekt blob

Jak wspomniano w sekcji Lista obiektów blob, możesz skonfigurować opcję ochrony danych miękkiego usuwania na koncie magazynu. Po włączeniu możliwe jest przywrócenie obiektów blob usuniętych w skojarzonym okresie retencji danych. Możesz również użyć wersjonowania w celu utrzymania poprzednich wersji obiektów blob dla każdego odzyskiwania i przywracania.

Jeśli wersjonowanie obiektów blob i miękkie usuwanie obiektów blob są włączone, modyfikowanie, zastępowanie, usuwanie lub przywracanie obiektu blob automatycznie tworzy nową wersję. Metoda używana do przywracania usuniętego obiektu blob zależy od tego, czy wersjonowanie jest włączone na koncie magazynowym.

Poniższy przykład kodu przywraca wszystkie miękko usunięte obiekty blob lub, jeśli włączono przechowywanie wersji, przywraca najnowszą wersję tego obiektu blob. Najpierw określa, czy obsługa wersji jest włączona za pomocą polecenia cmdlet Get-AzStorageBlobServiceProperty.

Jeśli obsługa wersji jest włączona, polecenie Get-AzStorageBlob cmdlet pobiera listę wszystkich unikatowo nazwanych wersji obiektów blob. Następnie wersje obiektów blob na liście są pobierane i uporządkowane według daty. Jeśli nie znaleziono wersji z wartością atrybutu LatestVersion , Copy-AzBlob polecenie cmdlet służy do tworzenia aktywnej kopii najnowszej wersji.

Jeśli wersjonowanie jest wyłączone, metoda BlobBaseClient.Undelete jest używana do przywracania każdego tymczasowo usuniętego obiektu blob w kontenerze.

Zanim będzie można skorzystać z tego przykładu, musisz włączyć opcję miękkiego usuwania lub wersjonowania na co najmniej jednym z kont storage.

Ważne

Poniższy przykład wylicza grupę obiektów blob i przechowuje je w pamięci przed ich przetworzeniem. Jeśli obsługa wersji jest włączona, obiekty blob są również sortowane. Użycie parametru -ContinuationToken ze zmienną $maxCount ogranicza liczbę blobów w grupie w celu oszczędzania zasobów. Jeśli kontener ma miliony blobów, będzie to bardzo kosztowne. Można dostosować wartość zmiennej $maxCount , jednak jeśli kontener ma miliony obiektów blob, skrypt będzie przetwarzać obiekty blob powoli.

Aby dowiedzieć się więcej na temat opcji ochrony danych poprzez miękkie usuwanie, zapoznaj się z artykułem Miękkie usuwanie obiektów blob.

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


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

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

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

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

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

Następne kroki