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


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

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

Необходимые компоненты

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

Каждый запрос к службе хранилища Azure должен быть авторизован. Вы можете авторизовать запрос из PowerShell с учетной записью Microsoft Entra или с помощью ключей доступа к учетной записи. В примерах этой статьи используется авторизация Microsoft Entra с объектами контекста. Объекты контекста инкапсулируют учетные данные Microsoft Entra и передают их во время последующих операций с данными.

Чтобы войти в учетную запись Azure с помощью учетной записи Microsoft Entra, откройте PowerShell и вызовите командлет Подключение-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-объекта

Чтобы отправить файл в блочный BLOB-объект, передайте необходимые значения параметров в командлет Set-AzStorageBlobContent. Укажите путь и имя файла с помощью параметра -File и имя контейнера с помощью параметра -Container. Также необходимо указать ссылку на объект контекста с параметром -Context .

Эта команда создает BLOB-объект, если он не существует, или запрос на подтверждение перезаписи, если он существует. Вы можете перезаписать файл без подтверждения, если передадите параметр -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 для вывода определенного BLOB-объекта в известном контейнере. Чтобы создать неотфильтрованный список всех BLOB-объектов в определенном контейнере, используйте только параметр -Container без значения -Name.

Ограничений на количество контейнеров и BLOB-объектов, которые может содержать учетная запись хранения, нет. Чтобы избежать извлечения тысяч BLOB-объектов, лучше ограничить объем возвращаемых данных. При извлечении нескольких BLOB-объектов с помощью параметра -Prefix можно указать BLOB-объекты, имена которых начинаются с определенной строки. Вы также можете использовать -Name параметр с диким карта для указания имен файлов или типов.

Параметр -MaxCount можно использовать для ограничения числа неотфильтрованных BLOB-объектов, возвращаемых из контейнера. Предел обслуживания в 5000 BLOB-объектов накладывается на все ресурсы Azure. Это ограничение гарантирует, что извлекаются управляемые объемы данных, а производительность не влияет. Если количество возвращенных BLOB-объектов превышает значение -MaxCount или предел обслуживания, возвращается маркер продолжения. Этот маркер позволяет использовать несколько запросов для извлечения любого количества BLOB-объектов. Дополнительные сведения можно найти в статье Перечисление ресурсов BLOB-объектов.

В следующем примере показано несколько подходов, которые используются для вывода списка BLOB-объектов. При первом подходе выводятся отдельные BLOB-ресурсы в определенном ресурсе контейнера. Второй подход использует дикую карта для перечисления всех .jpg файлов с префиксом Луи. За счет параметра -MaxCount поиск ограничивается пятью контейнерами. Третий способ использует параметры -MaxCount и -ContinuationToken для ограничения извлечения всех BLOB-объектов в контейнере.

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

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

   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-объектов. Как и в большинстве операций, для обоих подходов требуется объект контекста.

Чтобы скачать один именованный BLOB-объект, можно вызвать командлет напрямую и предоставить значения для параметров -Blob и -Container. Большой двоичный объект загружается в рабочий каталог PowerShell по умолчанию, но можно указать альтернативное расположение. Чтобы изменить целевое расположение, с параметром -Destination должен быть передан допустимый существующий путь. Так как операция не может создать назначение, она завершается ошибкой, если указанный путь не существует.

Чтобы скачать несколько BLOB-объектов, можно объединить командлет Get-AzStorageBlob и оператор конвейера PowerShell. Сначала создайте список BLOB-объектов с помощью командлета Get-AzStorageBlob. Затем воспользуйтесь оператором конвейера и командлетом Get-AzStorageBlobContent для извлечения BLOB-объектов из контейнера.

В примере кода ниже приводится пример подхода для скачивания как одного, так и нескольких BLOB-объектов. Кроме того, предлагается упрощенный подход к поиску определенных файлов во всех контейнерах с помощью подстановочного знака. Так как некоторые среды могут содержать сотни тысяч ресурсов, рекомендуется использовать параметр -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-объектов

Контейнер содержит как системные свойства, так и пользовательские метаданные. Системные свойства есть у каждого ресурса Хранилища BLOB-объектов. Некоторые свойства доступны только для чтения, а другие можно прочитать и записать. На самом деле, некоторые системные свойства соответствуют определенным стандартным заголовкам HTTP.

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

Чтение свойств BLOB-объектов

Чтобы прочитать свойства или метаданные BLOB-объекта, необходимо сначала извлечь его из службы. Используйте командлет Get-AzStorageBlob для извлечения свойств и метаданных BLOB-объекта, но не его содержимого. Затем используйте метод BlobClient.GetProperties для получения свойств BLOB-объекта. Затем свойства или метаданные можно прочитать или установить.

В следующем примере извлекается BLOB-объект и перечисляются его свойства.

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

В результате отображается список свойств большого двоичного объекта, как показано в следующем примере.

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-объекта, после чего они извлекаются. Пример 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-объекты разных типов. В этой статье рассматриваются только блочные BLOB-объекты.

Копирование исходного BLOB-объекта в целевой BLOB-объект

Для упрощенной операции копирования в пределах одной учетной записи хранения используйте командлет Copy-AzStorageBlob. Так как операция копирует BLOB-объект в пределах одной учетной записи хранения, это синхронная операция. Операции копирования между учетными записями асинхронны.

Для повышения удобства и производительности рассмотрите возможность использования AzCopy, особенно при копировании BLOB-объектов между учетными записями хранения. AzCopy — это служебная программа командной строки, которую можно использовать для копирования больших двоичных объектов или файлов в учетную запись хранения или из нее. Узнайте больше о том, как начать работу с AzCopy.

В примере ниже BLOB-объект bannerphoto.png копируется из контейнера photos в папку photos в контейнере archive. Оба контейнера существуют в одной учетной записи хранения. Результат проверяет успешность копирования.

$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-объекту, за исключением того, что значение DateTime добавляется к URI. Это значение указывает время создания моментального снимка и предлагает единственное различие между базовым 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-объектов из архивного уровня.

Следующий пример кода задает уровень горячим для всех больших двоичных объектов в контейнере 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
 }

удаление больших двоичных объектов.

С помощью комадлета Remove-AzStorageBlob можно удалить один или нескольких BLOB-объектов. При удалении нескольких больших двоичных объектов можно использовать условные операции, циклы или конвейер PowerShell, как показано в следующих примерах.

Предупреждение

Выполнение приведенных ниже примеров может привести к необратимому удалению BLOB-объектов. Мы рекомендуем включить обратимое удаление для контейнеров, чтобы защитить их и 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 удаленные в течение связанного периода хранения. Дополнительные сведения об обратимом удалении см. в статье Обратимое удаление для больших двоичных объектов.

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

#Retrieve a list of blobs including those recently deleted
Get-AzStorageBlob -Prefix $prefixName -IncludeDeleted -Context $ctx

AccountName: demostorageaccount, ContainerName: demo-container

Name       BlobType   Length  ContentType                LastModified          AccessTier    IsDeleted
----       --------   ------  -----------                ------------          ----------    ---------
file.txt   BlockBlob  22      application/octet-stream   2021-12-16 20:59:41Z  Cool          True
file2.txt  BlockBlob  22      application/octet-stream   2021-12-17 00:14:24Z  Cool          True
file3.txt  BlockBlob  22      application/octet-stream   2021-12-17 00:14:24Z  Cool          True
file4.txt  BlockBlob  22      application/octet-stream   2021-12-17 00:14:25Z  Cool          True

Восстановление удаленного BLOB-объекта

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

Если для обратимо удаленных больших двоичных объектов включены управление версиями и обратимое удаление, то при изменении, перезаписи, удалении и восстановлении большого двоичного объекта новая версия создается автоматически. Метод, используемый для восстановления удаленного большого двоичного объекта, зависит от того, включена ли управление версиями в учетной записи хранения.

В следующем примере кода восстанавливаются все обратимо удаленные большие двоичные объекты или, если включена поддержка управления версиями, восстанавливается последняя версия большого двоичного объекта. Сначала в нем с помощью командлета Get-AzStorageBlobServiceProperty определяется, включено ли управление версиями.

Если управление версиями включено, Get-AzStorageBlob командлет извлекает список всех уникальных именованных версий BLOB-объектов. Затем версии большого двоичного объекта в списке извлекаются и упорядочиваются по датам. Если с значением атрибута LatestVersion не найдено ни одной версии, командлет Copy-AzBlob используется для создания активной копии последней версии.

Если управление версиями отключено, метод BlobBaseClient.Undelete используется для восстановления каждого обратимо удаленного большого двоичного объекта в контейнере.

Прежде чем следовать этому примеру, необходимо включить обратимое удаление или управление версиями по крайней мере одной из учетных записей хранения.

Важно!

В следующем примере перечисляется группа больших двоичных объектов и хранит их в памяти перед обработкой. Если управление версиями включено, большие двоичные объекты также отсортированы. Использование -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."
}

Следующие шаги