9

我有一个将文件上传到 Azure Blob 存储的 Windows PowerShell 脚本。我只希望文件在容器中不存在时才上传。

如何检查 blob 是否已存在?

我厌倦了使用Get-AzureStorageBlob,但如果 blob 不存在,它会返回错误。我应该解析错误消息以确定 blob 不存在吗?这好像不太对...

当 blob 存在时,Set-AzureStorageBlobContent会要求确认。有没有办法自动回答“否”?此 cmdlet 没有 -confirm 并且 -force 会覆盖文件(我不想要)。

4

5 回答 5

17

这是@Chris 答案的变体。Chris 使用了异常和 Try/Catch。在较大的系统中,try/catch 很棒。它允许代码深处的错误引发异常,并且系统将回溯调用历史以寻找匹配的 catch 语句。但是,当所有代码都在一个函数中时,为简单起见,我更喜欢检查返回值:

$blob = Get-AzureStorageBlob -Blob $azureBlobName -Container $azureStorageContainer -Context $azureContext -ErrorAction Ignore
if (-not $blob)
{
    Write-Host "Blob Not Found"
}
于 2017-04-27T23:14:32.413 回答
15

一种解决方案是将对Get-AzureStorageBlob的调用包装在 try/catch 中并捕获ResourceNotFoundException以确定 blob 不存在。

并且不要忘记-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;
}
于 2015-02-18T17:38:22.210 回答
0

没错,Set-AzureStorageBlobContent既没有-Confirmflag也没有-WhatIfflag。

您真的确定要忽略特定 blob 包含某些内容的事实,而只是默默地覆盖它的内容吗?

看起来这里唯一可能的(而且非常丑陋的)解决方案将是try/内部的catchGet-AzureStorageBlob

于 2015-02-17T22:12:01.753 回答
0

您可以获得所有 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
    }
}
于 2016-03-27T09:52:54.487 回答
0
  $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."
     }

您可以从如何使用 PowerShell 检查 Azure 存储中是否存在 blob下载详细脚本

于 2016-11-24T05:54:34.590 回答