Get-AzureStorageBlob返回null

时间:2018-11-15 11:34:20

标签: powershell azure-storage

我正试图从天蓝色中获取一点信息:

$name = "myfolder/20180223_064819[1].jpg"
$blob = Get-AzureStorageBlob -Container $container.Name -Context $context -Blob $name -ErrorAction Stop 
$blob -eq $null # is True

并且文件存在于存储中,在上面指定的位置,我可以使用azure存储浏览器看到它。但是$ blob是$ null而不是抛出错误,这是在找不到文件时通常发生的错误。我一直在访问其他文件。

如果我创建另一个文件myfile / 201802230648191.jpg。在这段代码中,$ blob2返回一个对象(这是您期望的)

$name = "myfolder/201802230648191.jpg"
$blob2 = Get-AzureStorageBlob -Container $container.Name -Context $context -Blob $name -ErrorAction Stop 
$blob2 -eq $null # is False

我尝试用网址转义名称,但随后引发未找到的异常。我在这里查看了命名规则:https://docs.microsoft.com/en-us/rest/api/storageservices/Naming-and-Referencing-Containers--Blobs--and-Metadata,但似乎没有违反任何命名规则。

所以,我的问题是,为什么$ blob返回null而不是对象?

而且,如何获得名称包含[或]的Blob?

2 个答案:

答案 0 :(得分:0)

我测试了您的代码,并获得了与您相同的result。然后我检查了Get-AzureStorageBlob doc,发现它支持通配符搜索,即使对Accept wildcard characters的支持为 false

然后,我进一步测试了代码。我将图片名称更改为Snipaste_2018-11-02_13-56-321.png,但没有 [] ,但仍使用该代码,它可以正常工作。 Here是结果。因此,问题在于,$name中的 [] 被识别为通配符。

因此,如果您仍然坚持自己的名字,则可以使用-Prefix代替-BlobHere是我的结果。

如果您仍有疑问,请告诉我。

答案 1 :(得分:0)

我在https://github.com/Azure/azure-powershell/issues/7848#issuecomment-439307333

中回答了这个问题

通常与George一样,使用-prefix应该可行,因为-prefix不支持通配符搜索。无论如何,这还会使其他blob以blob名称开头,例如test/new11_22[1].jpgab,要仅获取匹配的blob,可以使用以下管道过滤blob:

PS C:\WINDOWS\system32>> Get-AzureStorageBlob -Container $containerName -Context $ctx -prefix test/new11_22[1].jpg | ? {$_.Name -eq "test/new11_22[1].jpg"}


   Container Uri: https://***.blob.core.windows.net/***

Name                 BlobType  Length          ContentType                    LastModified         AccessTier SnapshotTime         IsDeleted 
----                 --------  ------          -----------                    ------------         ---------- ------------         --------- 
test/new11_22[1].jpg BlockBlob 2097152         application/octet-stream       2018-11-16 07:29:19Z                                 False 

实际上,Get-AzureStorageBlob的行为与其他Powershell cmdlet(如Get-Item)保持一致: 就像文件c:\temp\new11_22[1].jpg一样,结果如下。

PS C:\WINDOWS\system32> get-item c:\temp\new11_22[1].jpg

PS C:\WINDOWS\system32> get-item c:\temp\new11_22?1?.jpg


    Directory: C:\temp


Mode                LastWriteTime         Length Name                                                                                                                                                                                                                                                       
----                -------------         ------ ----                                                                                                                                                                                                                                                       
-a----       10/19/2018   7:27 PM        2097152 new11_22[1].jpg