Как проверить, существует ли большой двоичный объект в контейнере больших двоичных объектов Azure с помощью PowerShell

У меня есть сценарий Windows PowerShell, который загружает файл в мое хранилище BLOB-объектов Azure. Я хочу, чтобы файл загружался только в том случае, если он еще не существует в контейнере.

Как проверить, существует ли уже большой двоичный объект?

Я устал использовать Get-AzureStorageBlob, но если большой двоичный объект не существует , он возвращает ошибку. Следует ли мне проанализировать сообщение об ошибке, чтобы определить, что большой двоичный объект не существует? Это не кажется правильным ...

И Set-AzureStorageBlobContent запрашивает подтверждение существования большого двоичного объекта. Есть ли способ автоматически ответить «Нет»? В этом командлете нет -confirm, а -force перезапишет файл (что мне не нужно).


person Chris    schedule 17.02.2015    source источник


Ответы (5)


Это вариант ответа @Cris. Крис использовал исключения и Try / Catch. В более крупных системах отлично работает команда try / catch. Это позволяет ошибке в глубине кода вызвать исключение, и система будет выполнять обратный поиск в истории вызовов в поисках подходящего оператора catch. Однако, когда весь код находится в одной функции, для простоты я предпочитаю проверять возвращаемые значения:

$blob = Get-AzureStorageBlob -Blob $azureBlobName -Container $azureStorageContainer -Context $azureContext -ErrorAction Ignore
if (-not $blob)
{
    Write-Host "Blob Not Found"
}
person jimhark    schedule 27.04.2017

Решение состоит в том, чтобы обернуть вызов Get-AzureStorageBlob в команду try / catch и перехватить ResourceNotFoundException, чтобы определить, что большой двоичный объект не существует.

И не забывайте -ErrorAction Stop в конце.

try
{   
    $blob = Get-AzureStorageBlob -Blob $azureBlobName -Container $azureStorageContainer -Context $azureContext -ErrorAction Stop
}
catch [Microsoft.WindowsAzure.Commands.Storage.Common.ResourceNotFoundException]
{
    # Add logic here to remember that the blob doesn't exist...
    Write-Host "Blob Not Found"
}
catch
{
    # Report any other error
    Write-Error $Error[0].Exception;
}
person Chris    schedule 18.02.2015
comment
Загружает ли этот подход BLOB-объект, если он существует? Можем ли мы просто проверить какое-то свойство блоба, чтобы узнать, существует ли оно? - person derek; 23.09.2016
comment
@derek Нет, этот cmd перечисляет только капли. Загружаемый cmd: Get-AzureStorageBlobContent. - person Chris; 03.10.2016

Правильно, Set-AzureStorageBlobContent не имеет ни -Confirm флага, ни -WhatIf флага.

Вы действительно уверены, что хотите игнорировать тот факт, что конкретный большой двоичный объект что-то содержит, и просто тихо перезаписать его содержимое?

Похоже, что единственным возможным (и довольно уродливым) решением здесь будет блок _4 _ / _ 5_ с Get-AzureStorageBlob внутри.

person ДМИТРИЙ МАЛИКОВ    schedule 17.02.2015
comment
Спасибо, Дмитрий, я добавил более подробный ответ с примером кода, основанным на вашем вводе. - person Chris; 18.02.2015

Вы можете получить список всех BLOB-объектов и найти свой файл.

$blobs = Get-AzureStorageBlob -Container $config.ImportContainerName -Context $storageContext

ForEach($file in Get-ChildItem -Path $config.LocalImportPath) {
    $blobName = $config.ImportBlobPrefix + "/" + $file.Name
    $blob = $blobs | Where-Object {$_.Name -eq $blobName}
    if (-not $file.Length -eq $blob.Length) {
        echo "todo upload" $file.Name
    }
}
person abbgrade    schedule 27.03.2016
comment
Возможно, для небольших контейнеров, но перечисление всех файлов вообще не масштабируется. - person Chris; 27.03.2016
comment
В этом случае переместите присвоение $blobs в цикл и добавьте параметр -Blob. Но я думаю, что производительность в большинстве случаев пострадает. - person abbgrade; 27.03.2016

  $storageAccount = Get-AzureRmStorageAccount -ErrorAction Stop | where-object {$_.StorageAccountName -eq $StorageAccountName}
     If($storageAccount)
     {
        $key = (Get-AzureRmStorageAccountKey -ResourceGroupName $storageAccount.ResourceGroupName -name $storageAccount.StorageAccountName -ErrorAction Stop)[0].value
        $storageContext = New-AzureStorageContext -StorageAccountName $storageAccount.StorageAccountName -StorageAccountKey $key -ErrorAction Stop
        $storageContainer = Get-AzureStorageContainer -Context $storageContext -ErrorAction Stop | where-object {$_.Name -eq $ContainerName}
        If($storageContainer)
        {
            $blob = Get-AzureStorageBlob -Context $storageContext -Container $ContainerName -ErrorAction Stop | where-object {$_.Name -eq $BlobName}
            If($blob)
            {
                Write-Host "'$BlobName' blob found."
            }
            Else 
            {
                Write-Warning "'$BlobName' blob not found."
            }
        }
        Else 
        {
            Write-Warning "'$ContainerName' storage container not found."
        }
     }
     Else 
     {
         Write-Warning "'$StorageAccountName' storage account not found."
     }

Вы можете загрузить подробный скрипт со страницы как проверить наличие большого двоичного объекта существует в службе хранилища Azure с помощью PowerShell

person frank tan    schedule 24.11.2016