2015-02-17 130 views
3

我有一個Windows PowerShell腳本,可以將文件上傳到我的Azure Blob存儲。 如果文件不在容器中,我只想上傳文件。如何使用PowerShell檢查Azure Blob容器中是否已經存在blob

如何檢查blob是否已經存在?

我累得用Get-AzureStorageBlob但是如果blob不存在,它會返回一個錯誤。我應該解析錯誤消息以確定blob不存在嗎?這似乎不正確...

Set-AzureStorageBlobContent要求在blob存在時進行確認。有沒有辦法自動回答「否」?此cmdlet沒有-confirm和-force會覆蓋文件(我不想)。

回答

7

一種解決方法是調用換到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; 
} 
+0

這種方法下載blob是否存在?我們可以只檢查blob的一些屬性,看看它是否存在? – derek 2016-09-23 01:05:46

+0

@derek不,此cmd只列出blob。下載的cmd是:'Get-AzureStorageBlobContent'。 – Chris 2016-10-03 14:19:15

0

沒錯,Set-AzureStorageBlobContent既沒有-Confirm標誌也沒有-WhatIf標誌。

你真的確定你想忽略這個事實:特定的blob包含的東西,只是默默地覆蓋它的內容?

它看起來像是唯一一個可能的(和相當醜陋的一個)解決方案在這裏將是一個try/catch塊與Get-AzureStorageBlob裏面。

+0

謝謝德米特里,我添加了一個更詳盡的答案根據您輸入的代碼示例。 – Chris 2015-02-18 17:46:31

0

您可以獲取所有斑點的列表並查找您的文件。

$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 
    } 
} 
+0

也許對於小容器,但列出所有文件根本不可縮放。 – Chris 2016-03-27 11:24:27

+0

在這種情況下,將'$ blobs'賦值移入循環並添加一個'-Blob'參數。但我想在大多數情況下,表演會受到影響。 – abbgrade 2016-03-27 17:49:02

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

您可以從how to check if a blob exists in Azure Storage using PowerShell

3

下載詳細的腳本這是@克里斯的回答的變體。 Chris使用了Exceptions和Try/Catch。在較大的系統中,try/catch很棒。它允許代碼中的錯誤引發異常,並且系統將回溯通話歷史記錄,尋找匹配的catch語句。然而,當所有的代碼是在一個函數,爲了簡單起見,我寧願檢查返回值:

$blob = Get-AzureStorageBlob -Blob $azureBlobName -Container $azureStorageContainer -Context $azureContext -ErrorAction Ignore 
if (-not $blob) 
{ 
    Write-Host "Blob Not Found" 
} 
相關問題