如何使用Powershell根据大小将文件从一个容器复制到另一个容器,同样适用于所有dest容器

时间:2019-06-07 18:10:50

标签: azure powershell

我在azure的存储帐户的blob中有一个容器,其中包含具有不同大小文件的不同文件夹。 另一方面,在同一个存储帐户中,我有10个不同的容器。 我必须将这些文件从源容器复制到目标10个容器,但条件是文件应平均分配给所有容器。

到目前为止,我已经在下面尝试过

$key = "abcdxyz" 

# declaring the azure context

$context = New-AzStorageContext -StorageAccountName abcd  -StorageAccountKey $key 

#Getting the data from the blob

$bacdata = Get-AzStorageContainer -Name sourcecontainer*  -Context $context | Get-AzStorageBlob 

$15=$bacdata | where{$_.Name -like "sourcecontainer1*"} | where{$_.LastModified -gt (get-date).adddays(-1)}

1 个答案:

答案 0 :(得分:0)

这是执行此操作的powershell脚本:

#Server side storage copy
$SourceStorageAccount = "sourceAccountName"
$SourceStorageKey = "sourceAccountAPIKey"
$DestStorageAccount = "destinationAccountName"
$DestStorageKey = "destinationAccountAPIKey"
$SourceStorageContext = New-AzureStorageContext -StorageAccountName $SourceStorageAccount -StorageAccountKey $SourceStorageKey
$DestStorageContext = New-AzureStorageContext -StorageAccountName $DestStorageAccount -StorageAccountKey $DestStorageKey

$Containers = Get-AzureStorageContainer -Context $SourceStorageContext

foreach($Container in $Containers)
{
    $ContainerName = $Container.Name
    if (!((Get-AzureStorageContainer -Context $DestStorageContext) | Where-Object { $_.Name -eq $ContainerName }))
    {   
        Write-Output "Creating new container $ContainerName"
        New-AzureStorageContainer -Name $ContainerName -Permission Off -Context $DestStorageContext -ErrorAction Stop
    }

    $Blobs = Get-AzureStorageBlob -Context $SourceStorageContext -Container $ContainerName
    $BlobCpyAry = @() #Create array of objects

    #Do the copy of everything
    foreach ($Blob in $Blobs)
    {
       $BlobName = $Blob.Name
       Write-Output "Copying $BlobName from $ContainerName"
       $BlobCopy = Start-CopyAzureStorageBlob -Context $SourceStorageContext -SrcContainer $ContainerName -SrcBlob $BlobName -DestContext $DestStorageContext -DestContainer $ContainerName -DestBlob $BlobName
       $BlobCpyAry += $BlobCopy
    }

    #Check Status
    foreach ($BlobCopy in $BlobCpyAry)
    {
       #Could ignore all rest and just run $BlobCopy | Get-AzureStorageBlobCopyState but I prefer output with % copied
       $CopyState = $BlobCopy | Get-AzureStorageBlobCopyState
       $Message = $CopyState.Source.AbsolutePath + " " + $CopyState.Status + " {0:N2}%" -f (($CopyState.BytesCopied/$CopyState.TotalBytes)*100) 
       Write-Output $Message
    }
}

总体概念类似,只需根据Az CLI更改功能即可。 这是Az CLI中的复制命令

az storage blob copy start

您可以在此处找到更多详细信息。

https://docs.microsoft.com/en-us/cli/azure/storage/blob/copy?view=azure-cli-latest#az-storage-blob-copy-start

希望有帮助。