我正在尝试将Azure存储中Blob的访问层从Cool转换为Archive。 我为此使用了Powershell脚本,但是一旦我进入= 200k文件的某些容器,它就会消耗掉我所有的RAM。
我曾希望在Foreach-obejct{}
之后创建一个Get-AzStorageBlob
可以使它在之后立即遍历该对象,这样它就不会存储它。
#Account information
$StorageAcc = "StorageAccount-info"
$StorageAccKey = "StorageAccKey-info"
$containername = "container1"
#Create a storage context
$context = New-AzStorageContext -StorageAccountName $StorageAcc -StorageAccountKey $StorageAccKey
Get-AzStorageBlob -Container $containerName -Context $context | ForEach-Object {$_.ICloudBlob.SetStandardBlobTier("Archive")}
我希望它可以通过一个包含x个文件的容器运行,而不会由于内存问题而使PC崩溃,时间不是问题。
现在,我可以在90分钟内运行132k,这大约需要400Mb的内存/ RAM。 谢谢!
编辑: 对于任何人来说,可能都需要这样的东西。 它将遍历所有Blob,并检查其是否已被存档,从而节省了大量时间。它还会将ContinuationToken保存在一个文本文件中,这样,如果发生什么事情,您不必重新开始。 记住要编辑文件的路径
$StorageAcc = "StorageAccount-info"
$StorageAccKey = "StorageAccKey-info"
$containername = "container1"
$token = $null
$total = 0
$start = 0
#Create a storage context
$context = New-AzStorageContext -StorageAccountName $StorageAcc -StorageAccountKey $StorageAccKey
do{
$blobs = Get-AzStorageBlob -Container $containerName -Context $context -MaxCount 10000 -ContinuationToken $token
$Total += $Blobs.Count
foreach ($blob in $blobs)
{
If($blob.ICloudBlob.Properties.StandardBlobTier -eq "cool"){
$blob.ICloudBlob.SetStandardBlobTier("Archive")
}
}
if($Blobs.Length -le 0) { Break;}
$Token = $Blobs[$blobs.Count -1].ContinuationToken;
Echo "Total $Total blobs in container $ContainerName"
add-content C:\Users\Admin\Desktop\Token.txt $Token.NextMarker
if($start -eq 0)
{
$start += 1
$token.NextMarker = "Token"
}
}
While ($Token -ne $Null)
Echo "Total $Total blobs in container $ContainerName the end"
答案 0 :(得分:2)
它在文档中得到了提示。您可以在batches中进行处理。对其代码稍作修改,即可正常工作。将最大回报率设置为所需的水平。
$MaxReturn = 10000
$ContainerName = "abc"
$Total = 0
$Token = $Null
do
{
$Blobs = Get-AzStorageBlob -Container $ContainerName -MaxCount $MaxReturn -ContinuationToken $Token
$Total += $Blobs.Count
if($Blobs.Length -le 0) { Break;}
foreach($blob in $blobs) {
$blob.ICloudBlob.SetStandardBlobTier("Archive")
}
$Token = $Blobs[$blobs.Count -1].ContinuationToken;
}
While ($Token -ne $Null)
Echo "Total $Total blobs in container $ContainerName archived"