我有一个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中。
我在这一天大部分时间都在这里,我即将放弃。我错过了什么基本的东西吗?
答案 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) {
它起了作用。