1. ホーム
  2. azure

[解決済み] Set-AzStorageBlobContentを使用して、プロンプトなしで新しいコンテンツのみをアップロードする。

2022-02-11 01:08:59

質問

ローカルフォルダーを列挙して、Azureストレージにアップロードしています。 アップロードしたいのは 新しい のコンテンツをAzureストレージに保存します。 Set-AzStorageBlobContentを-Force付きで使用すると、すべて上書きされます。 Forceを付けずに使用すると、既に存在するアイテムに対してプロンプトが表示されます。 Get-AzStorageBlob を使ってアイテムがすでに存在するかどうかを確認できますが、アイテムが存在する場合は赤いエラーが表示されます。 ない が存在します。 エラーやプロンプトを表示せずに新しいコンテンツだけを優雅にアップロードするこれらの項目の組み合わせを見つけることができません。 私は間違った方法を使用しているのでしょうか?

最終的な編集:Ivan Yangの提案に基づき、動作する解決策を追加しました。 現在、エラーメッセージなしで新しいファイルだけがアップロードされています。 キーは、エラーメッセージを例外に変換するために -ErrorAction Stop を使用し、その後例外をキャッチすることでした。

# In my code this is part of a Test-Blob function that returns $blobFound
$blobFound = $false
try
{
    $blobInfo = Get-AzStorageBlob `
        -Container $containerName `
        -Context $storageContext `
        -Blob $blobPath `
        -ErrorAction Stop

    $blobFound = ($null -ne $blobInfo)
}
catch [Microsoft.WindowsAzure.Commands.Storage.Common.ResourceNotFoundException]
{
    # Eat the error that'd otherwise be printed
}

# Note in my code this is actually a call to my Test-Blob function
if ($false -eq $blobFound)
{
    Set-AzStorageBlobContent `
        -Container $containerName `
        -Context $storageContext `
        -File $sourcePath `
        -Blob $blobPath `
        -Force  # -Force is unnecessary but just being paranoid to avoid prompts
}

どのように解決するのですか?

を試すと書いてありましたね。 Get-AzStorageBlob ということで、継続的に使ってみてはいかがでしょうか。

ここでの仕掛けは try-catch-finally これは、blobがazureに存在しない場合のエラーを適切に処理することができます。

このサンプルコードは、私側で1つのファイルをアップロードするために動作するもので、複数のファイルをアップロードするために修正することができます。

$account_name ="xxx"
$account_key ="xxx"      
$context = New-AzStorageContext -StorageAccountName $account_name -StorageAccountKey $account_key    

#use this flag to determine if a blob exists or not in azure. And assume it exists at first.
$is_exist = $true
try
{
 Get-AzStorageBlob -Container test3 -Blob a.txt -Context $context -ErrorAction Stop
}
catch [Microsoft.WindowsAzure.Commands.Storage.Common.ResourceNotFoundException]
{
 #if the blob does not exist in azure, do the following
 $is_exist = $false
 Write-Output "the blob DOES NOT exists."
}
finally
{
 #only execute the code when the blob does not exist in azure blob storage.
 if(!$is_exist)
 {
 Set-AzStorageBlobContent -Container test3 -File "d:\myfolder\a.txt" -Blob a.txt -Context $context
 Write-Output "uploaded!"
 }

}