代码之家  ›  专栏  ›  技术社区  ›  johnstaveley

Get-AzureStorageBlob返回null

  •  0
  • johnstaveley  · 技术社区  · 6 年前

    我正在尝试从azure获取一个blob:

    $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
    

    我尝试了url转义名称,但它抛出了一个未找到的异常。我在这里查看了命名规则: https://docs.microsoft.com/en-us/rest/api/storageservices/Naming-and-Referencing-Containers--Blobs--and-Metadata 但不要表现得违反任何规定。

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

    还有,我怎样才能得到一个名称包含[或]的blob?

    2 回复  |  直到 6 年前
        1
  •  0
  •   George Chen    6 年前

    我测试了你的代码,得到了同样的结果 result 和你一样。然后我查了一下 Get-AzureStorageBlob doc 我发现它支持 通配符搜索 甚至连支持 Accept wildcard characters 错误的 .

    然后我进一步测试了代码。我把照片的名字改成了 Snipaste_2018-11-02_13-56-321.png 没有 [] 而且仍然使用代码,这是有效的。 Here 这就是结果。所以问题是因为 [] $name 被识别为通配符。

    所以如果你仍然坚持你的名字,你可以使用 -Prefix 而不是 -Blob . Here 这是我的结果。

    如果你还有问题,请告诉我。

        2
  •  0
  •   Wei Wei -Microsoft    6 年前

    我已经回答了这个问题: https://github.com/Azure/azure-powershell/issues/7848#issuecomment-439307333

    大体上同意乔治的观点,使用 -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的benavior与其他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