在Powershell中比较两个blob集合的问题

时间:2018-02-19 17:23:31

标签: powershell azure azure-storage

我有一个powershell脚本,可以将Azure blob存储中的文件下载到本地文件夹中。一旦它将文件拉下来,它就会创建一个具有相同名称的0字节文件,但带有.succeeded扩展名(例如foo.csv变为foo.csv.succeeded)。原始文件和.succeeded文件都保留在blob存储上。

我想修改我的脚本,以便在再次运行脚本时不会重新下载具有.succeeded对应文件的文件。我试图比较两组blob,但我不能让它工作。这是我的代码片段:

$ext = '.succeeded'

$ctx = New-AzureStorageContext -sasToken $sasToken -StorageAccountName $accountname        
$blobs = Get-AzureStorageBlob -Container $blob_source_container -Context $ctx  

# Get list of all blobs from specified folder with the '.succeeded' extension
$succeeded = Get-AzureStorageBlob -Container $blob_source_container -Context $ctx | 
    Where-Object { (($_.Name -like "$blob_source_folder*") -or ($blob_source_folder -eq '*')) -and ($_.Name -like "*$sidecar_extension") }

# Strip the extension from the blob names ending in '.succeeded'
foreach($blob in $succeeded) {
    $blob.Name = $blob.Name.Substring(0, $blob.Name.LastIndexOf('.'))
}

foreach($blob in $blobs) {
    if($blob.Name -notlike "*$ext"){
        if($blob.Name -notin $succeeded | Select Name) {
            # do stuff
        }
    }
}

如果我在do stuff语句中放置一个Write-Output $ blob.Name,它会打印所有可以下载的blob,无论它们是否在$ succeeded中。

我在这一天大部分时间都在这里,我即将放弃。我错过了什么基本的东西吗?

2 个答案:

答案 0 :(得分:0)

仅获得成功的查询似乎不正确。快速插入它是在下面,但写入输出$ blob和$的内容成功地看到你出错的地方。如果您的容器很大,请进行测试,只需要几个文件即可进行调试。

尝试替换

# Get list of all blobs from specified folder with the '.succeeded' extension
$succeeded = Get-AzureStorageBlob -Container $blob_source_container -Context $ctx | 
    Where-Object { (($_.Name -like "$blob_source_folder*") -or ($blob_source_folder -eq '*')) -and ($_.Name -like "*$sidecar_extension") }

# Get list of all blobs from specified folder with the '.succeeded' extension
$succeeded = Get-AzureStorageBlob -Container $blob_source_container -blob *.succeeded -Context $ctx | 
    Where-Object { (($_.Name -like "$blob_source_folder*") -or ($blob_source_folder -eq '*')) -and ($_.Name -like "*$sidecar_extension") }

即。将-blob *.succeeded添加到$ succeeded查询中。

答案 1 :(得分:0)

我今天早上设法解决了这个问题(在没看几个小时的代码之后!)

我只是替换了:

if($blob.Name -notin $succeeded | Select Name) {

使用:

if($blob.Name -notin $succeeded.Name) {

它起了作用。