Mengelola blob blok dengan PowerShell

Penyimpanan blob mendukung blob blok, blob penambahan, dan blob halaman. Blob blok dioptimalkan untuk mengunggah data dalam jumlah besar secara efisien. Blok blob sangat cocok untuk menyimpan gambar, dokumen, dan jenis data lain yang tidak ditentukan pada operasi baca dan tulis yang acak. Artikel ini menjelaskan cara bekerja menggunakan blokir blob.

Prasyarat

Mengonfigurasi objek konteks untuk merangkum info masuk

Setiap permintaan ke Azure Storage harus diotorisasi. Anda dapat mengotorisasi permintaan yang dibuat dari PowerShell dengan akun Microsoft Entra Anda atau dengan menggunakan kunci akses akun. Contoh dalam artikel ini menggunakan otorisasi Microsoft Entra dengan objek konteks. Objek konteks merangkum kredensial Microsoft Entra Anda dan meneruskannya selama operasi data berikutnya.

Untuk masuk ke akun Azure Anda dengan akun Microsoft Entra, buka PowerShell dan panggil cmdlet Koneksi-AzAccount.

#Connect to your Azure subscription
Connect-AzAccount

Setelah koneksi tersambung, buat konteks Azure. Mengautentikasi dengan MICROSOFT Entra ID secara otomatis membuat konteks Azure untuk langganan default Anda. Dalam beberapa kasus, Anda mungkin perlu mengakses sumber daya dalam langganan yang berbeda setelah mengautentikasi. Anda dapat mengubah langganan yang terkait dengan sesi Azure Anda saat ini dengan memodifikasi konteks sesi aktif.

Untuk menggunakan langganan default Anda, buat konteks dengan memanggil cmdlet New-AzStorageContext. Sertakan -UseConnectedAccount parameter sehingga operasi data dilakukan menggunakan kredensial Microsoft Entra Anda.

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

Untuk mengubah langganan, ambil objek konteks dengan cmdlet Get-AzSubscription, lalu ubah konteks saat ini dengan Set-AzContext. Untuk informasi selengkapnya, lihat Mengubah langganan aktif.

Membuat kontainer

Semua data blob disimpan dalam kontainer, jadi Anda memerlukan setidaknya satu sumber daya kontainer sebelum Dapat mengunggah data. Jika diperlukan, gunakan contoh berikut ini untuk membuat kontainer penyimpanan. Untuk informasi selengkapnya, lihat Mengelola kontainer blob menggunakan PowerShell.

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

Saat Anda menggunakan contoh berikut, Anda perlu mengganti nilai tempat penampung dalam tanda kurung dengan nilai Anda sendiri. Untuk informasi selengkapnya tentang proses masuk ke Azure dengan PowerShell, lihat Masuk dengan Azure PowerShell.

Mengunggah blob

Untuk mengunggah file ke blob blok, berikan nilai parameter yang diperlukan ke cmdlet Set-AzStorageBlobContent. Berikan jalur dan nama file dengan parameter -File, dan nama kontainer dengan parameter -Container. Anda juga perlu memberikan referensi ke objek konteks dengan -Context parameter .

Perintah ini akan membuat blob jika tidak ada, atau meminta konfirmasi menimpa blob jika sudah ada. Anda bisa menimpa file tanpa konfirmasi jika Anda meneruskan parameter -Force ke cmdlet.

Contoh berikut ini menentukan nilai parameter -File untuk mengunggah satu file bernama. Cara ini juga menunjukkan penggunaan operator dan alur PowerShell cmdlet Get-ChildItem untuk mengunggah beberapa file. Cmdlet Get-ChildItem menggunakan parameter -Path untuk menentukan C:\Temp\*.png. Penyertaan kartubebas tanda bintang (*) menentukan semua file dengan ekstensi nama file .png. Parameter -Recurse mencari direktori Temp dan subdirektorinya.

#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

Hasilnya menampilkan nama akun penyimpanan, nama kontainer penyimpanan, dan menyediakan daftar file yang diunggah.

   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

Daftar blob

Cmdlet Get-AzStorageBlob digunakan untuk mendaftarkan blob yang disimpan dalam kontainer. Anda bisa menggunakan berbagai pendekatan untuk menentukan cakupan pencarian Anda. Gunakan parameter -Container dan -Name untuk mendaftarkan blob tertentu dalam kontainer yang diketahui. Untuk membuat daftar semua blob yang tidak difilter dalam kontainer tertentu, gunakan parameter -Container saja, tanpa nilai -Name.

Tidak ada batasan jumlah kontainer atau blob yang dapat dimiliki akun penyimpanan. Untuk berpotensi menghindari pengambilan ribuan blob, sebaiknya batasi jumlah data yang dikembalikan. Ketika mengambil beberapa blob, Anda dapat menggunakan parameter -Prefix untuk menentukan blob yang namanya dimulai dengan untai (karakter) tertentu. Anda juga dapat menggunakan -Name parameter dengan kartubebas untuk menentukan nama atau jenis file.

Parameter -MaxCount ini bisa digunakan untuk membatasi jumlah blob yang tidak difilter yang dikembalikan dari kontainer. Batas layanan sebesar 5.000 diberlakukan pada semua sumber daya Azure. Batas ini memastikan bahwa jumlah data yang dapat dikelola diambil dan performa tidak terpengaruh. Jika jumlah blob yang dikembalikan melebihi nilai -MaxCount atau batas layanan, token kelanjutan akan dikembalikan. Token ini memungkinkan Anda menggunakan beberapa permintaan untuk mengambil nomor blob apa pun. Informasi selengkapnya tersedia di Menghitung sumber daya blob.

Contoh berikut ini memperlihatkan beberapa pendekatan yang digunakan untuk menyediakan daftar blob. Pendekatan pertama mendaftarkan blob tunggal dalam sumber daya kontainer tertentu. Pendekatan kedua menggunakan kartubebas untuk mencantumkan semua .jpg file dengan awalan Louis. Pencarian terbatas pada lima kontainer menggunakan parameter -MaxCount. Pendekatan ketiga menggunakan parameter -MaxCount dan -ContinuationToken untuk membatasi pengambilan semua blob dalam kontainer.

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

Dua pendekatan pertama menampilkan akun penyimpanan dan nama kontainer, dan daftar blob yang diambil. Pendekatan ketiga menampilkan jumlah total blob dalam kontainer bernama. Blob diambil dalam batch, dan bilah status memperlihatkan kemajuan selama penghitungan.

   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.

Mengunduh blob

Tergantung pada kasus penggunaan Anda, cmdlet Get-AzStorageBlobContent dapat digunakan untuk mengunduh satu atau beberapa blob. Seperti kebanyakan operasi, kedua pendekatan membutuhkan objek konteks.

Untuk mengunduh blob tunggal bernama, Anda dapat memanggil cmdlet secara langsung dan menyediakan nilai untuk parameter -Blob dan -Container. Blob diunduh ke direktori PowerShell yang berfungsi secara default, tetapi lokasi alternatif dapat ditentukan. Untuk mengubah lokasi target, jalur yang valid dan sudah ada harus diteruskan dengan parameter -Destination. Karena operasi tidak dapat membuat tujuan, operasi gagal dengan kesalahan jika jalur yang Anda tentukan tidak ada.

Beberapa blob dapat diunduh dengan menggabungkan cmdlet Get-AzStorageBlob dan operator alur PowerShell. Pertama, buat daftar blob dengan cmdlet Get-AzStorageBlob. Berikutnya, gunakan operator alur dan cmdlet Get-AzStorageBlobContent untuk mengambil blob dari kontainer.

Contoh kode berikut ini memberikan contoh pendekatan pengunduhan tunggal dan pengunduhan beberapa kali. Alat ini juga menawarkan pendekatan yang lebih sederhana untuk mencari semua kontainer untuk file tertentu menggunakan kartubebas. Karena beberapa lingkungan mungkin memiliki ratusan ribu sumber daya, disarankan menggunakan parameter -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

Hasilnya menampilkan nama akun penyimpanan dan kontainer serta menyediakan daftar file yang diunduh.

   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

Mengelola properti blob dan metadata

Kontainer memperlihatkan baik properti sistem dan metadata yang ditentukan pengguna. Properti sistem ada pada setiap sumber daya Blob Storage. Beberapa properti bersifat baca-saja, sementara yang lain bisa dibaca atau diatur. Dibalik itu, beberapa properti sistem memetakan ke header HTTP standar tertentu.

Metadata yang ditentukan pengguna terdiri dari satu atau beberapa pasangan nama-nilai yang Anda tentukan untuk sumber daya Blob Storage. Anda dapat menggunakan metadata untuk menyimpan nilai-nilai ini dengan sumber daya. Nilai metadata hanya untuk tujuan Anda sendiri, dan tidak memengaruhi perilaku sumber daya.

Membaca properti blob

Untuk membaca properti blob atau metadata, Anda harus mengambil blob dari layanan terlebih dahulu. Gunakan cmdlet Get-AzStorageBlob untuk mendapatkan metadata dan properti blob, tetapi tidak dengan kontennya. Berikutnya, gunakan metode BlobClient.GetProperties untuk mengambil properti blob. Properti atau metadata selanjutnya bisa dibaca atau diatur sebagaimana diperlukan.

Contoh berikut mengambil blob dan mendaftarkan propertinya.

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

Hasilnya menampilkan daftar properti blob seperti yang ditunjukkan dalam contoh berikut.

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

Membaca dan menulis metadata blob

Metadata blob adalah kumpulan pasangan nama/nilai opsional yang terkait dengan blob. Seperti yang diperlihatkan dalam contoh sebelumnya, pada awalnya tidak ada metadata yang terkait dengan blob, meskipun dapat ditambahkan ketika diperlukan. Untuk memperbarui metadata blob, gunakan BlobClient.UpdateMetadata metode . Metode ini hanya menerima pasangan kunci-nilai yang disimpan dalam objek IDictionary umum. Untuk informasi selengkapnya, lihat definisi kelas BlobClient.

Contoh di bawah pertama-tama mempembarui lalu menerapkan metadata blob, lalu mengambilnya. Sampel blob dibersihkan dari memori untuk memastikan metadata tidak dibaca dari objek dalam memori.

#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

Hasilnya mengembalikan metadata blob yang baru diperbarui seperti yang ditunjukkan dalam contoh berikut.

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

Operasi penyalinan untuk blob

Terdapat banyak skenario di mana blob dengan jenis yang berbeda dapat disalin. Contoh dalam artikel ini terbatas untuk blob blok.

Menyalin blob sumber ke blob tujuan

Untuk operasi penyalinan sederhana di dalam akun penyimpanan yang sama, gunakan cmdlet Copy-AzStorageBlob. Karena operasi tersebut menyalin blob dalam akun penyimpanan yang sama, ini adalah operasi sinkron. Operasi lintas akun adalah operasi asinkron.

Anda harus mempertimbangkan penggunaan AzCopy untuk kemudahan dan performa, khususnya saat menyalin blob antar akun penyimpanan. AzCopy adalah utilitas baris perintah yang dapat Anda gunakan untuk menyalin gumpalan atau file ke atau dari akun penyimpanan. Cari tahu selengkapnya tentang cara Mulai menggunakan AzCopy.

Contoh di bawah menyalin blob bannerphoto.png dari kontainer foto ke folder foto dalam kontainer arsip. Kedua kontainer berada dalam akun penyimpanan yang sama. Hasil tersebut memverifikasi keberhasilan operasi penyalinan.

$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

Anda dapat menggunakan parameter -Force untuk menimpa blob yang sudah ada dengan nama yang sama di tujuan. Operasi ini akan menggantikan blob tujuan secara efektif. Operasi ini juga menghapus blok yang tidak diterapkan dan menimpa metadata blob tujuan.

Salin salinan bayangan ke blob tujuan dengan nama yang berbeda

Blob tujuan yang dihasilkan adalah blob yang dapat ditulis dan bukan snapshot.

Blob sumber untuk operasi salinan mungkin adalah blob blok, blob pelengkap, blob halaman, atau snapshot. Jika blob tujuan sudah ada, itu harus berasal dari jenis blob yang sama dengan blob sumber. Blob tujuan yang ada ditimpa.

Blob tujuan tidak dapat dimodifikasi saat operasi salin sedang berlangsung. Blob tujuan hanya dapat memiliki satu operasi salinan yang luar biasa. Dengan kata lain, blob tidak dapat menjadi tujuan untuk beberapa operasi salinan yang tertunda.

Saat Anda menyalin blob dalam akun penyimpanan yang sama, itu adalah operasi sinkron. Operasi penyalinan lintas akun bersifat asinkron.

Keseluruhan blob sumber atau file selalu disalin. Menyalin rentang byte atau set blok tidak didukung.

Saat blob disalin, properti sistemnya disalin ke gumpalan tujuan dengan nilai yang sama.

Ini juga menunjukkan cara membatalkan operasi salinan asinkron.

Mengambil salinan bayangan blob

Salinan bayangan adalah versi baca-saja dari blob yang diambil pada suatu waktu. Rekam jepret blob identik dengan blob dasarnya, kecuali bahwa nilai DateTime ditambahkan ke URI. Nilai ini menunjukkan waktu pengambilan rekam jepret, dan menawarkan satu-satunya perbedaan antara blob dasar dan rekam jepret.

Setiap sewa yang terkait dengan blob dasar tidak memengaruhi snapshot. Anda tidak dapat memperoleh sewa pada rekam jepret. Baca selengkapnya tentang Salinan bayangan blob.

Sampel kode berikut mengambil blob dari kontainer penyimpanan dan membuat salinan bayangannya.

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

Set tingkat blob

Saat mengubah tingkat blob, Anda memindahkan blob tersebut dan semua datanya ke tingkat target. Untuk membuat perubahan, ambil blob dengan Get-AzStorageBlob cmdlet, dan panggil BlobClient.SetAccessTier metode . Pendekatan ini dapat digunakan untuk mengubah tingkat antara panas, dingin, dan arsip.

Mengubah tingkatan dari dingin atau panas ke arsip terjadi hampir segera. Setelah blob dipindahkan ke tingkat arsip , blob dianggap offline, dan tidak dapat dibaca atau dimodifikasi. Sebelum Anda dapat membaca atau memodifikasi data blob yang diarsipkan, Anda perlu merehidrasinya ke tingkat online. Baca selengkapnya tentang rehidrasi Blob dari tingkat arsip.

Kode sampel berikut mengatur tingkat ke panas untuk semua blob dalam archive kontainer.

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

Operasi menggunakan tag blob

Tag indeks blob memudahkan penemuan dan pengelolaan data. Tag indeks blob adalah atribut indeks nilai kunci yang ditentukan pengguna yang dapat Anda terapkan ke blob. Setelah dikonfigurasi, Anda dapat mengkategorikan dan menemukan objek dalam kontainer individual atau seluruh kontainer. Sumber daya blob dapat dikategorikan secara dinamis dengan memperbarui tag indeksnya tanpa memerlukan perubahan dalam organisasi kontainer. Tag indeks menawarkan cara yang fleksibel untuk mengatasi perubahan persyaratan data. Anda bisa menggunakan metadata dan tag indeks secara bersamaan. Untuk informasi selengkapnya tentang tag index, lihat Mengelola dan menemukan data Azure Blob dengan tag indeks blob.

Contoh berikut ini menggambarkan cara menambahkan tag indeks blob ke serangkaian blob. Contoh tersebut membaca data dari file XML dan menggunakannya untuk membuat tag indeks di beberapa blob. Untuk menggunakan kode sampel, buat file lokal blob-list.xml di direktori C:\temp. Data XML disediakan dalam contoh berikut.

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

Kode sampel akan membuat tabel hash dan menetapkan variabel $tags pada tabel hash tersebut. Selanjutnya, kode sampel ini menggunakan cmdlet Get-Content dan Get-Data untuk membuat objek berdasarkan struktur XML. Kemudian, tambahkan pasangan nilai-kunci ke tabel hash untuk digunakan sebagai nilai tag. Terakhir, mengiterasi melalui objek XML dan membuat tag untuk setiap node File.

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

Hapus blob

Anda dapat menghapus satu blob atau serangkaian blob dengan cmdlet Remove-AzStorageBlob. Saat menghapus beberapa blob, Anda dapat menggunakan operasi bersyarat, perulangan, atau alur PowerShell seperti yang ditunjukkan dalam contoh berikut.

Peringatan

Menjalankan contoh berikut dapat menghapus blob secara permanen. Microsoft merekomendasikan Anda mengaktifkan penghapusan sementara kontainer untuk melindungi kontainer dan blob dari penghapusan yang tidak disengaja. Untuk informasi selengkapnya, lihat Penghapusan sementara untuk kontainer.

#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

Dalam beberapa kasus, pengambilan blob yang sudah dihapus dapat dilakukan. Jika opsi perlindungan data penghapusan sementara akun penyimpanan Anda diaktifkan, -IncludeDeleted parameter mengembalikan blob yang dihapus dalam periode retensi terkait. Untuk mempelajari lebih lanjut tentang penghapusan sementara, lihat artikel Penghapusan sementara untuk blob.

Gunakan contoh berikut untuk mengambil daftar blob yang dihapus dalam periode retensi terkait penampung. Hasilnya menampilkan daftar blob yang baru dihapus.

#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

Memulihkan blob yang dihapus

Seperti yang telah disebutkan di Mendaftarkan blob, Anda dapat mengonfigurasi opsi proteksi data penghapusan sementara pada akun penyimpanan Anda. Ketika diaktifkan, blob yang telah dihapus dalam periode retensi terkait dapat dipulihkan. Anda juga dapat menggunakan penerapan versi untuk mempertahankan versi blob sebelumnya untuk setiap pemulihan dan restorasi.

Jika penerapan versi blob dan penghapusan sementara blob diaktifkan, maka memodifikasi, menimpa, menghapus, atau memulihkan blob akan secara otomatis membuat versi yang baru. Metode yang Anda gunakan untuk memulihkan blob yang dihapus tergantung pada apakah penerapan versi diaktifkan di akun penyimpanan Anda.

Sampel kode berikut memulihkan semua blob yang dihapus sementara atau memulihkan versi terbaru blob jika penerapan versi diaktifkan. Ini pertama-tama menentukan apakah penerapan versi diaktifkan dengan cmdlet Get-AzStorageBlobServiceProperty.

Jika penerapan versi diaktifkan, Get-AzStorageBlob cmdlet mengambil daftar semua versi blob bernama unik. Selanjutnya, versi blob pada daftar diambil dan diurutkan menurut tanggal. Jika tidak ada versi yang ditemukan dengan nilai atribut LatestVersion, cmdlet Copy-AzBlob akan digunakan untuk membuat salinan aktif dari versi terbaru.

Jika penerapan versi dinonaktifkan, metode BlobBaseClient.Undelete digunakan untuk memulihkan setiap blob yang dihapus sementara dalam kontainer.

Sebelum dapat mengikuti contoh ini, Anda perlu mengaktifkan penghapusan sementara atau penerapan versi pada setidaknya salah satu akun penyimpanan Anda.

Penting

Contoh berikut menghitung sekelompok blob dan menyimpannya dalam memori sebelum memprosesnya. Jika penerapan versi diaktifkan, blob juga diurutkan. Penggunaan -ContinuationToken parameter dengan $maxCount variabel membatasi jumlah blob dalam grup untuk menghemat sumber daya. Jika kontainer memiliki jutaan blob, ini akan sangat mahal. Anda dapat menyesuaikan nilai $maxCount variabel, meskipun jika kontainer memiliki jutaan blob, skrip akan memproses blob secara perlahan.

Untuk mempelajari lebih lanjut tentang opsi proteksi data penghapusan sementara, lihat artikel Penghapusan sementara untuk 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."
}

Langkah berikutnya