Поделиться через


Управление блочными BLOB-объектами с помощью PowerShell

Хранилище BLOB поддерживает блочные, добавочные и страничные BLOB. Блочные BLOB-объекты оптимизированы для эффективной загрузки больших объемов данных. Блочные BLOB-объекты идеально подходят для хранения изображений, документов и других типов данных, для которых не используются операции произвольного чтения и записи. В этой статье объясняется, как работать с блочными BLOB-объектами.

Предпосылки

Настройка объекта контекста для инкапсулирования учетных данных

Каждый запрос к службе хранилища 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."
}

Дальнейшие действия