Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Хранилище BLOB поддерживает блочные, добавочные и страничные BLOB. Блочные BLOB-объекты оптимизированы для эффективной загрузки больших объемов данных. Блочные BLOB-объекты идеально подходят для хранения изображений, документов и других типов данных, для которых не используются операции произвольного чтения и записи. В этой статье объясняется, как работать с блочными BLOB-объектами.
Предпосылки
Подписка Azure. См. получите бесплатную пробную версию Azure.
Модуль PowerShell Azure
Az
, который является рекомендуемым модулем PowerShell для взаимодействия с Azure. Чтобы начать работу с модулем Az PowerShell, ознакомьтесь со статьей Установка Azure PowerShell.
Настройка объекта контекста для инкапсулирования учетных данных
Каждый запрос к службе хранилища Azure должен быть авторизован. Вы можете авторизовать запрос из PowerShell с учетной записью Microsoft Entra или с помощью ключей доступа к учетной записи. В примерах этой статьи используется авторизация Microsoft Entra с объектами контекста. Объекты контекста инкапсулируют учетные данные Microsoft Entra и передают их во время последующих операций с данными.
Чтобы войти в учетную запись Azure с помощью учетной записи Microsoft Entra, откройте PowerShell и вызовите командлет Connect-AzAccount .
#Connect to your Azure subscription
Connect-AzAccount
После установки подключения создайте контекст Azure. Проверка подлинности с помощью идентификатора Microsoft Entra ID автоматически создает контекст Azure для вашей подписки по умолчанию. В некоторых случаях после проверки подлинности может потребоваться доступ к ресурсам в другой подписке. Вы можете изменить подписку, связанную с текущим сеансом Azure, изменив контекст активного сеанса.
Чтобы использовать подписку по умолчанию, создайте контекст, вызвав New-AzStorageContext
командлет.
-UseConnectedAccount
Включите параметр, чтобы операции с данными выполнялись с помощью учетных данных Microsoft Entra.
#Create a context object using Azure AD credentials
$ctx = New-AzStorageContext -StorageAccountName <storage account name> -UseConnectedAccount
Чтобы изменить подписки, получите объект контекста с помощью командлета Get-AzSubscription , а затем измените текущий контекст с помощью Set-AzContext. Дополнительные сведения см. в разделе "Изменение активной подписки".
Создание контейнера
Все данные BLOB-объектов хранятся в контейнерах, поэтому перед отправкой данных требуется по крайней мере один ресурс контейнера. При необходимости используйте следующий пример для создания контейнера хранилища. Дополнительные сведения см. в статье "Управление контейнерами BLOB-объектов с помощью PowerShell".
#Create a container object
$container = New-AzStorageContainer -Name "mycontainer" -Context $ctx
При использовании следующих примеров необходимо заменить значения заполнителей в квадратных скобках собственными значениями. Дополнительные сведения о входе в Azure с помощью PowerShell см. в статье "Вход с помощью Azure PowerShell".
Загрузить блоб
Чтобы загрузить файл в блочный BLOB, передайте необходимые значения параметров командлету Set-AzStorageBlobContent
. Укажите путь и имя файла с -File
параметром и имя контейнера с параметром -Container
. Также необходимо указать ссылку на объект контекста с параметром -Context
.
Эта команда создаёт блоб, если он не существует, или запрашивает подтверждение для перезаписи, если он уже есть. Файл можно перезаписать без подтверждения, если передать параметр -Force
командлету.
В следующем примере указывается -File
значение параметра для отправки одного именованного файла. Он также демонстрирует использование оператора передачи данных PowerShell и Get-ChildItem
командлета для загрузки нескольких файлов. Командлет Get-ChildItem
использует параметр -Path
для указания C:\Temp\*.png. Включение подстановочного знака звездочки (*
) указывает все файлы с расширением .png имени файла. Параметр -Recurse
выполняет поиск в каталоге Temp и его подкаталогах.
#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
В результате отображается имя учетной записи хранения, имя контейнера хранилища и список отправленных файлов.
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
Список блобов
Командлет Get-AzStorageBlob
используется для перечисления BLOB-объектов, хранящихся в контейнере. Для определения области поиска можно использовать различные подходы. Используйте параметры -Container
и -Name
для поиска конкретного блоба в известном контейнере. Чтобы получить полный список объектов блоб в конкретном контейнере, используйте только параметр -Container
без значения -Name
.
Нет ограничений на количество контейнеров или объектов BLOB в учетной записи хранения. Чтобы, возможно, избежать извлечения тысяч BLOB-объектов, лучше ограничить объем возвращаемых данных. При получении нескольких больших двоичных объектов можно использовать -Prefix
параметр для указания больших двоичных объектов, имена которых начинаются с определенной строки. Можно также использовать -Name
параметр с подстановочным знаком, чтобы указать имена файлов или типы.
Этот -MaxCount
параметр можно использовать для ограничения количества нефильтрованных больших двоичных объектов, возвращаемых из контейнера. Лимит на обслуживание в 5000 единиц накладывается на все ресурсы Azure. Это ограничение гарантирует, что извлекаются управляемые объемы данных и производительность не страдает. Если количество возвращенных BLOB-объектов превышает значение -MaxCount
или лимит сервиса, возвращается токен продолжения. Этот маркер позволяет использовать несколько запросов для извлечения любого количества BLOB-объектов. Дополнительные сведения можно найти в статье Перечисление ресурсов BLOB-объектов.
В следующем примере показано несколько подходов, используемых для предоставления списка объектов Blob. Первый подход перечисляет один блоб в определенном ресурсе контейнера. Второй подход использует подстановочный знак для перечисления всех .jpg
файлов с префиксом Луи. Поиск ограничен пятью контейнерами с помощью -MaxCount
параметра. Третий подход использует параметры -MaxCount
и -ContinuationToken
для ограничения извлечения всех блобов в контейнере.
#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."
В первых двух подходах отображаются имена учетной записи хранения и контейнеров, а также список извлеченных блобов. Третий подход отображает общее количество блобов в именованном контейнере. Блобы извлекаются партиями, а строка состояния показывает прогресс во время подсчета.
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.
Скачать объект
В зависимости от вашего сценария использования командлет Get-AzStorageBlobContent
можно использовать для скачивания одного или нескольких блобов. Как и в большинстве операций, оба подхода требуют объекта контекста.
Чтобы скачать именованный двоичный объект, можно вызвать командлет напрямую и указать значения для параметров -Blob
и -Container
. Блоб загружается в рабочий каталог PowerShell по умолчанию, но можно указать альтернативное расположение. Чтобы изменить целевое расположение, допустимый, существующий путь необходимо передать с параметром -Destination
. Так как операция не может создать назначение, она завершается ошибкой, если указанный путь не существует.
Несколько блобов можно скачать, объединив командлет и оператор конвейера PowerShell. Сначала создайте список blob'ов с помощью командлета Get-AzStorageBlob
. Затем используйте оператор конвейера и командлет Get-AzStorageBlobContent
, чтобы получить блобы из контейнера.
Пример кода ниже демонстрирует подходы как для скачивания одного файла, так и для скачивания нескольких. Кроме того, предлагается упрощенный подход к поиску определенных файлов во всех контейнерах с помощью подстановочного знака. Так как некоторые среды могут содержать сотни тысяч ресурсов, рекомендуется использовать -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
Результат отображает имена учетной записи хранения и контейнеров и содержит список загруженных файлов.
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
Управление свойствами и метаданными BLOB-объектов
Контейнер предоставляет как системные свойства, так и пользовательские метаданные. Системные свойства присутствуют у каждого ресурса Хранилища блобов. Некоторые свойства доступны только для чтения, а другие можно прочитать и записать. На самом деле, некоторые системные свойства соответствуют определенным стандартным заголовкам HTTP.
Определяемые пользователем метаданные состоят из одной или нескольких пар "имя-значение", которые необходимо указать для ресурса Хранилища Blob. Метаданные можно использовать для хранения этих значений вместе с ресурсом. Значения метаданных предназначены только для ваших собственных целей и не влияют на поведение ресурса.
Чтение свойств BLOB-объектов
Чтобы прочитать свойства или метаданные BLOB-объекта, необходимо сначала извлечь его из службы.
Get-AzStorageBlob
Используйте командлет, чтобы получить свойства и метаданные блоба, но не его содержимое. Затем используйте метод BlobClient.GetProperties
, чтобы получить свойства объекта. Затем свойства или метаданные могут быть прочитаны или заданы по мере необходимости.
В следующем примере извлекается BLOB-объект и перечисляются его свойства.
$blob = Get-AzStorageBlob -Blob "blue-moon.mp3" -Container "mycontainer" -Context $ctx
$properties = $blob.BlobClient.GetProperties()
Echo $properties.Value
В результате выводится список свойств BLOB, как показано в следующем примере.
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
Чтение и запись метаданных BLOB-объекта
Метаданные BLOB-объекта — это необязательный набор пар имен и значений, связанных с BLOB-объектом. Как показано в предыдущем примере, метаданные изначально не связаны с BLOB-объектом, но их можно добавить при необходимости. Чтобы обновить метаданные большого двоичного объекта, используйте метод BlobClient.UpdateMetadata
. Этот метод принимает пары "ключ-значение", хранящиеся в универсальном IDictionary
объекте. Дополнительные сведения см. в определении класса BlobClient .
В приведенном ниже примере сначала обновляются, а затем фиксируются метаданные BLOB-объекта, после чего они извлекаются. Образец большого двоичного объекта выгружается из памяти, чтобы гарантировать, что метаданные не считываются из объекта оперативной памяти.
#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
Результат возвращает обновленные метаданные большого двоичного объекта, как показано в следующем примере.
Key Value
--- -----
YearWritten 1934
YearRecorded 1958
Composer Richard Rogers
Lyricist Lorenz Hart
Artist Tony Bennett
Операции копирования BLOB-объектов
Существует множество сценариев, когда можно копировать объекты разных типов. Примеры в этой статье ограничены блочными Blob-объектами.
Копирование исходного блоба в целевой блоб
Для упрощенной операции копирования в рамках одной учетной записи хранения используйте командлет Copy-AzStorageBlob
. Поскольку операция копирует BLOB в пределах одной и той же учетной записи хранения, это синхронная операция. Операции между учетными записями асинхронны.
Для упрощения и повышения производительности рекомендуется использовать AzCopy, особенно при копировании блобов между учетными записями хранения. AzCopy — это утилита командной строки, которую можно использовать для копирования блобов или файлов в учетную запись хранения или из неё. Узнайте больше о том, как начать работу с AzCopy.
Пример ниже показывает копирование двоичного большого объекта bannerphoto.png из контейнера фотографий в папку фотографий, которая находится в контейнере архива. Оба контейнера существуют в одной учетной записи хранения. Результат проверяет успешность копирования.
$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
Вы можете использовать параметр -Force
для перезаписи существующего блоба с тем же именем в месте назначения. Эта операция эффективно заменяет объект BLOB назначения. Он также удаляет все незафиксированные блоки и перезаписывает метаданные блоба целевого назначения.
Скопировать снимок в Blob с другим именем назначения
Целевой двоичный объект является записываемым, а не моментальным снимком.
Исходный BLOB для операции копирования может быть блочным BLOB, добавляемым BLOB, страничным BLOB или моментальным снимком. Если целевой BLOB-объект уже существует, он должен иметь тот же тип BLOB-объекта, что и исходный BLOB-объект. Существующий целевой BLOB перезаписывается.
Нельзя изменить целевой блоб, пока выполняется операция копирования. Целевой объект BLOB может иметь только одну незавершённую операцию копирования. Другими словами, бинарный объект не может быть местом назначения для нескольких ожидающих операций копирования.
При копировании объекта blob в рамках той же учетной записи хранения это синхронная операция. Операции копирования между учетными записями являются асинхронными.
Весь исходный блоб или файл всегда полностью копируется. Копирование диапазона байтов или набора блоков не поддерживается.
При копировании большого двоичного объекта его системные свойства копируются в целевой большой двоичный объект с теми же значениями.
В нем также показано, как прервать асинхронную операцию копирования.
Создание моментального снимка BLOB-объекта
Моментальный снимок — это объект BLOB в версии только для чтения, сделанный в определенный момент времени. Снимок состояния BLOB-объекта идентичен своему базовому BLOB-объекту, за исключением того, что к URI добавляется значение типа DateTime. Это значение указывает время создания моментального снимка и предлагает единственное различие между базовым BLOB-объектом и моментальным снимком.
Любая аренда, связанная с базовым объектом BLOB, не оказывает влияния на моментальный снимок. Вы не можете получить аренду на моментальном снимке. Узнайте больше о снимках Blob-объектов.
Следующий пример кода извлекает объект BLOB из контейнера хранилища и создает его снимок состояния.
$blob = Get-AzStorageBlob -Container "manuscripts" -Blob "novels/fast-cars.docx" -Context $ctx
$blob.BlobClient.CreateSnapshot()
Установка уровня BLOB
При изменении уровня BLOB-объекта он и все его данные перемещаются на целевой уровень. Чтобы внести изменения, получите большой двоичный объект с помощью командлета Get-AzStorageBlob
и вызовите метод BlobClient.SetAccessTier
. Этот подход можно использовать для изменения уровня между горячим, холодным и архивным.
Изменение уровней с холодного или горячего на архив происходит почти сразу. После перемещения объекта на архивный уровень он считается недоступным и не может быть прочитан или изменен. Прежде чем вы сможете читать или изменять данные архивного BLOB, необходимо перевести его на онлайн-уровень. Узнайте больше о повторном извлечении BLOB из архивного уровня.
Следующий пример кода устанавливает уровень на горячий для всех блобов в контейнере archive
.
$blobs = Get-AzStorageBlob -Container archive -Context $ctx
Foreach($blob in $blobs) {
$blob.BlobClient.SetAccessTier("Hot")
}
Операции, использующие теги BLOB
Теги индекса BLOB-объектов упрощают управление данными и их обнаружение. Теги индекса BLOB-объектов — это определяемые пользователем атрибуты индекса "ключ — значение", которые можно применять к BLOB-объектам. После настройки вы сможете классифицировать и находить объекты в отдельном контейнере или во всех контейнерах. Ресурсы BLOB-объектов можно динамически классифицировать, обновляя их теги индекса без изменений в организации контейнеров. Теги индексов предлагают гибкий способ справиться с изменением требований к данным. Метаданные и тег индекса можно использовать одновременно. Дополнительные сведения об тегах индекса см. в статье Управление данными BLOB-объектов Azure и их поиск с помощью тегов индекса BLOB-объектов.
В следующем примере показано, как добавить индексные теги к ряду BLOB-объектов. В этом примере считываются данные из XML-файла и используются для создания тегов индекса для нескольких BLOB-объектов. Чтобы использовать образец кода, создайте локальный файл blob-list.xml в каталоге C:\temp. XML-данные приведены в следующем примере.
<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>
Пример кода создает хэш-таблицу и назначает ей переменную $tags . Затем он использует командлеты Get-Content
и Get-Data
для создания объекта на основе структуры XML. Затем он добавляет пары "ключ-значение" в хэш-таблицу, которая будет использоваться в качестве значений тегов. Наконец, он выполняет итерацию через XML-объект и создает теги для каждого 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
}
Удалить блобы
Вы можете удалить один объект BLOB или ряд объектов BLOB с помощью командлета Remove-AzStorageBlob
. При удалении нескольких больших двоичных объектов можно использовать условные операции, циклы или конвейер PowerShell, как показано в следующих примерах.
Предупреждение
Выполнение приведенных ниже примеров может привести к необратимому удалению BLOB-объектов. Компания Microsoft рекомендует включить мягкое удаление для контейнера, чтобы защитить его и BLOB-объекты от случайного удаления. Для получения дополнительной информации см. Мягкое удаление для контейнеров.
#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
В некоторых случаях удаленные BLOB-объекты можно восстановить. Если включена функция защиты данных мягкого удаления для учетной записи хранения, этот параметр возвращает блобы, -IncludeDeleted
удаленные в течение связанного периода удержания. Дополнительные сведения о мягком удалении см. в статье "Мягкое удаление для блобов".
Используйте следующий пример, чтобы получить список объектов, удаленных в контейнере в течение назначенного периода хранения. В результате отображается список недавно удаленных объектов.
#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
Восстановление удаленного BLOB-объекта
Как упоминается в разделе Список двоичных объектов, вы можете настроить опцию защиты данных с помощью мягкого удаления в вашей учетной записи хранения. При включении можно восстановить объекты, удаленные в течение периода хранения данных. Вы также можете использовать управление версиями, чтобы сохранять предыдущие версии BLOB-объектов для каждого восстановления.
Если для больших двоичных объектов включены версионирование и обратимое удаление, то при изменении, перезаписи, удалении или восстановлении объекта автоматически создается новая версия. Метод, который вы используете для восстановления удаленного большого двоичного объекта, зависит от того, включено ли версионирование в вашей учетной записи хранения.
В следующем примере кода восстанавливаются все мягко удаленные Блобы или, если включено управление версиями, восстанавливается последняя версия Блоба. Сначала определяет, включено ли управление версиями с помощью командлета Get-AzStorageBlobServiceProperty
.
Если управление версиями включено, командлет Get-AzStorageBlob
извлекает список всех уникально именованных версий blob. Затем версии блобов в списке извлекаются и упорядочиваются по дате. Если версии не найдены с значением атрибута LatestVersion
, используется командлет Copy-AzBlob
для создания активной копии последней версии.
Если управление версиями отключено, используется метод BlobBaseClient.Undelete
для восстановления каждого мягко удаленного блоба в контейнере.
Прежде чем следовать этому примеру, необходимо включить мягкое удаление или управление версиями как минимум в одной из ваших учетных записей хранения данных.
Это важно
В следующем примере перечисляется группа Blob'ов и сохраняет их в памяти перед обработкой. Если управление версиями включено, блобы также сортируются. Использование -ContinuationToken
параметра с $maxCount
переменной устанавливает ограничение на количество блобов в группе для экономии ресурсов. Если в контейнере миллионы блобов, это будет чрезвычайно дорого. Вы можете настроить значение переменной $maxCount
, хотя если контейнер имеет миллионы больших двоичных объектов, скрипт будет обрабатывать большие двоичные объекты медленно.
Дополнительные сведения о параметре защиты данных с помощью обратимого удаления см. в статье Обратимое удаление для блобов.
$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."
}