Udostępnij za pośrednictwem


Zarządzanie blokowymi obiektami blob za pomocą programu PowerShell

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

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ładach w tym artykule użyto autoryzacji entra firmy Microsoft z obiektami kontekstu. Obiekty kontekstowe hermetyzują poświadczenia firmy Microsoft Entra i przekazują je podczas kolejnych operacji danych.

Aby zalogować się do konta platformy Azure przy użyciu konta Microsoft Entra, otwórz program PowerShell i wywołaj polecenie cmdlet Połączenie-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 przekazaniem danych potrzebne są co najmniej jeden zasób kontenera. W razie potrzeby użyj poniższego przykładu, aby utworzyć kontener magazynu. 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.

Przekazywanie obiektu blob

Aby przekazać plik do blokowego obiektu blob, 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 .

To polecenie tworzy obiekt blob, jeśli nie istnieje, lub monituje o potwierdzenie zastąpienia, jeśli istnieje. Możesz zastąpić plik bez potwierdzenia, jeśli przekażesz -Force parametr do polecenia cmdlet.

W poniższym przykładzie określono wartość parametru -File w celu przekazania pojedynczego, nazwanego pliku. Demonstruje również użycie operatora potoku programu PowerShell i Get-ChildItem polecenia cmdlet do przekazania wielu plików. Polecenie Get-ChildItem cmdlet używa parametru -Path do określenia C:\Temp\*.png. Dołączenie gwiazdki (*) wieloznacznych określa wszystkie pliki z rozszerzeniem 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

W wyniku zostanie wyświetlona nazwa konta magazynu, nazwa kontenera magazynu i zostanie wyświetlona lista przekazanych 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świetlanie listy obiektów blob

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

Nie ma żadnych ograniczeń dotyczących liczby kontenerów lub obiektów blob, które może mieć konto magazynu. Aby potencjalnie uniknąć pobierania tysięcy obiektów blob, 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 wieloznacznymi, aby określić nazwy plików lub typy.

Parametr -MaxCount może służyć do ograniczania liczby niefiltrowanych obiektów blob 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 -MaxCount wartość lub limit usługi, zwracany jest token kontynuacji. Ten token umożliwia pobranie dowolnej liczby obiektów blob przy użyciu wielu żądań. 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 udostępniania listy obiektów blob. 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 -MaxCount parametrów 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 zawierają nazwy konta magazynu i kontenera oraz listę pobranych obiektów blob. Trzecie podejście wyświetla łączną liczbę obiektów blob w nazwanym kontenerze. Obiekty blob są pobierane w partiach, a pasek stanu pokazuje postęp podczas liczby.

   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.

Pobieranie obiektu blob

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

Aby pobrać pojedynczy nazwany obiekt blob, możesz wywołać polecenie cmdlet bezpośrednio 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 Get-AzStorageBlob polecenie cmdlet i operator potoku programu PowerShell. Najpierw utwórz listę obiektów blob za Get-AzStorageBlob pomocą polecenia cmdlet . Następnie użyj operatora potoku i Get-AzStorageBlobContent polecenia cmdlet, 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 osłonami niektóre właściwości systemu są mapowanie na niektóre 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 mają wpływu na zachowanie zasobu.

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. Get-AzStorageBlob Użyj polecenia cmdlet , aby pobrać właściwości i metadane obiektu blob, ale nie jego zawartość. Następnie użyj BlobClient.GetProperties metody , 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 dla obiektów blob

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

Kopiowanie źródłowego obiektu blob do docelowego obiektu blob

Aby uzyskać uproszczoną operację kopiowania na tym samym koncie magazynu, użyj Copy-AzStorageBlob polecenia cmdlet . Ponieważ operacja kopiuje obiekt blob na tym samym koncie magazynu, jest to operacja synchroniczna. Operacje między kontami są asynchroniczne.

Należy rozważyć użycie narzędzia AzCopy w celu ułatwienia i wydajności, zwłaszcza podczas kopiowania obiektów blob między kontami magazynu. AzCopy to narzędzie wiersza polecenia, przy użyciu którego można kopiować obiekty blob lub pliki do lub z konta magazynu. 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ą na tym samym koncie magazynu. 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 obiekt blob. Usuwa również wszystkie niezatwierdzone bloki i zastępuje metadane docelowego obiektu blob.

Kopiowanie migawki do docelowego obiektu blob o innej nazwie

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

Źródłowy obiekt blob operacji kopiowania może być blokowym obiektem blob, uzupełnianym obiektem blob, stronicowym obiektem blob lub migawką. Jeśli docelowy obiekt blob już istnieje, musi mieć ten sam typ obiektu blob co źródłowy obiekt blob. Istniejący docelowy obiekt blob jest zastępowany.

Nie można zmodyfikować docelowego obiektu blob, gdy trwa operacja kopiowania. Docelowy obiekt blob może mieć tylko jedną zaległą operację kopiowania. Innymi słowy, obiekt blob nie może być miejscem docelowym dla wielu oczekujących operacji kopiowania.

Podczas kopiowania obiektu blob na tym samym koncie magazynu 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 obiektów blob

Migawka to wersja obiektu blob tylko do odczytu 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 obiektów blob.

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

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

Ustawianie warstwy obiektu blob

Podczas zmiany warstwy obiektu blob przenosisz obiekt blob i wszystkie jego dane do warstwy docelowej. 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 ponownego wypełniania 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 przy użyciu tagów obiektów blob

Tagi indeksu obiektów blob ułatwiają zarządzanie danymi i odnajdywanie. Tagi indeksu obiektów blob to atrybuty indeksu klucz-wartość zdefiniowane przez użytkownika, które można zastosować do obiektów blob. 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 obiektów blob.

Poniższy przykład ilustruje sposób dodawania tagów indeksu obiektów blob do serii obiektów blob. Przykład odczytuje dane z pliku XML i używa go do tworzenia tagów indeksu w kilku obiektach blob. 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
 }

Usuwać obiekty blob

Za pomocą polecenia cmdlet można usunąć pojedynczy obiekt blob lub serię Remove-AzStorageBlob 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ąć obiekty blob. Firma Microsoft zaleca włączenie usuwania nietrwałego kontenera w celu ochrony kontenerów i obiektów blob przed przypadkowym usunięciem. Aby uzyskać więcej informacji, zobacz Usuwanie nietrwałe 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 usuwania nietrwałego konta magazynu jest włączona, -IncludeDeleted parametr zwraca obiekty blob usunięte w skojarzonym okresie przechowywania. Aby dowiedzieć się więcej na temat usuwania nietrwałego, zapoznaj się z artykułem Usuwanie nietrwałe dla obiektów blob.

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

#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

Przywracanie usuniętego obiektu blob

Jak wspomniano w sekcji Lista obiektów blob , możesz skonfigurować opcję ochrony danych usuwania nietrwałego na koncie magazynu. Po włączeniu można przywrócić obiekty blob usunięte w skojarzonym okresie przechowywania. Możesz również użyć przechowywania wersji do obsługi poprzednich wersji obiektów blob dla każdego odzyskiwania i przywracania.

Jeśli obsługa wersji obiektów blob i usuwanie nietrwałe 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 obsługa wersji jest włączona na koncie magazynu.

Poniższy przykładowy kod przywraca wszystkie nietrwałe obiekty blob lub, jeśli włączono przechowywanie wersji, przywraca najnowszą wersję obiektu blob. Najpierw określa, czy obsługa wersji jest włączona za pomocą Get-AzStorageBlobServiceProperty polecenia cmdlet .

Jeśli obsługa wersji jest włączona, Get-AzStorageBlob polecenie 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 przechowywanie wersji jest wyłączone, BlobBaseClient.Undelete metoda służy do przywracania każdego obiektu blob usuniętego nietrwale w kontenerze.

Zanim będzie można skorzystać z tego przykładu, musisz włączyć usuwanie nietrwałe lub przechowywanie wersji na co najmniej jednym z kont magazynu.

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ę obiektów blob w grupie w celu zaoszczędzenia zasobów. Jeśli kontener ma miliony obiektów blob, 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 usuwania nietrwałego, zapoznaj się z artykułem Usuwanie nietrwałe dla 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