Azure TimeTrigger PowerShell函数无法上传含数据的CSV至Blob存储
问题分析与修复方案
核心问题定位
你的Azure TimeTrigger函数生成空CSV文件,本质是**$strg结果数组未被正确填充**,结合代码细节,主要有以下几个关键错误:
1. 结果累加逻辑错误
代码中使用未初始化的$results变量累加数据,且每次将$results追加到$strg会导致重复数据;若存储账户下没有landing容器,$results根本不会被赋值,$strg始终为空。
修复方式:
移除中间变量$results,直接将生成的对象追加到$strg数组:
foreach ($container in $containers) { # ... 原有获取blobs、提取目录的逻辑 ... # 直接添加到$strg,无需中间变量 $strg += [PSCustomObject]@{ SubscriptionName = $subscription.Name ResourceGroup = $storageAccount.ResourceGroupName StorageAccount = $storageAccount.StorageAccountName ContainerName = $container.Name UsedCapacityInBytes = $averageCapacity TagName = $tagKey TagValue = $storageAccount.Tags[$tagKey] Directories = $directories -join ", " } }
2. 临时文件夹创建逻辑错误
原代码创建文件夹时会生成嵌套目录($(Get-Location)\strgacctmp\strgacctmp),导致后续CSV路径实际指向错误目录,即使有数据也无法正确写入预期位置。
修复方式:
简化文件夹创建逻辑,直接生成目标路径:
$localPath = "$(Get-Location)\strgacctmp" if (-not (Test-Path -Path $localPath)) { New-Item -Path $localPath -ItemType Directory -Force -ErrorAction Stop Write-Host "Created folder: $localPath" } else { Write-Host "Folder already exists: $localPath" }
3. 订阅上下文切换的潜在问题
循环中使用Set-AzContext切换订阅可能存在延迟或上下文残留,建议直接在Get-AzStorageAccount中指定订阅ID,避免切换上下文:
$storageAccounts = Get-AzStorageAccount -SubscriptionId $subscription.Id | Where-Object { $_.Tags.ContainsKey($tagKey) }
4. 增加日志排查(可选但推荐)
在关键步骤添加日志,确认数据流向,方便定位哪一步没有生成数据:
# 获取存储账户后 Write-Host "Found $($storageAccounts.Count) storage accounts with tag '$tagKey' in subscription $($subscription.Name)" # 获取容器后 Write-Host "Found $($containers.Count) 'landing' containers in storage account $($storageAccount.StorageAccountName)" # 追加数据后 Write-Host "Added 1 record to strg array, current total: $($strg.Count)"
完整修复后的核心代码片段
# Initialize an array to store the results $strg = @() foreach ($subscription in $subscriptions) { Write-Host "Processing subscription: $($subscription.Name) ($($subscription.Id))" # 获取当前订阅下符合标签的存储账户,无需切换上下文 $storageAccounts = Get-AzStorageAccount -SubscriptionId $subscription.Id | Where-Object { $_.Tags.ContainsKey($tagKey) } Write-Host "Found $($storageAccounts.Count) storage accounts with tag '$tagKey'" foreach ($storageAccount in $storageAccounts) { Write-Host "Processing storage account: $($storageAccount.StorageAccountName)" # 获取存储容量指标 $resourceId = "/subscriptions/$($subscription.Id)/resourceGroups/$($storageAccount.ResourceGroupName)/providers/Microsoft.Storage/storageAccounts/$($storageAccount.StorageAccountName)" $uri = "https://management.azure.com$resourceId/providers/Microsoft.Insights/metrics?api-version=2023-10-01&metricnames=UsedCapacity&aggregation=Average" try { $response = Invoke-AzRestMethod -Method Get -Uri $uri $metrics = $response.Content | ConvertFrom-Json $usedCapacityMetric = $metrics.value | Where-Object { $_.name.value -eq "UsedCapacity" } if ($usedCapacityMetric) { $dataPoints = $usedCapacityMetric.timeseries.data Write-Host "Found $($dataPoints.Count) data points for UsedCapacity" $averageCapacity = $dataPoints.average | Measure-Object -Sum | Select-Object -ExpandProperty Sum } else { $averageCapacity = 0 Write-Host "No UsedCapacity metric found" } } catch { Write-Warning "Failed to retrieve metrics for $($storageAccount.StorageAccountName): $_" $averageCapacity = 0 } $ctx = $storageAccount.Context $containers = Get-AzStorageContainer -Context $ctx | Where-Object { $_.Name -eq "landing" } Write-Host "Found $($containers.Count) 'landing' containers" foreach ($container in $containers) { $blobs = Get-AzStorageBlob -Container $container.Name -Context $ctx | Where-Object { $_.Name -like "internal/*" } Write-Host "Found $($blobs.Count) blobs under internal/*" # 提取internal目录下的唯一子目录 $directories = $blobs | ForEach-Object { $parts = $_.Name.Split('/') for ($i = 0; $i -lt $parts.Length - 1; $i++) { $parts[0..$i] -join '/' } } | Sort-Object -Unique Write-Host "Extracted $($directories.Count) unique directories" # 直接添加到结果数组 $strg += [PSCustomObject]@{ SubscriptionName = $subscription.Name ResourceGroup = $storageAccount.ResourceGroupName StorageAccount = $storageAccount.StorageAccountName ContainerName = $container.Name UsedCapacityInBytes = $averageCapacity TagName = $tagKey TagValue = $storageAccount.Tags[$tagKey] Directories = $directories -join ", " } Write-Host "Added record to strg, total records: $($strg.Count)" } } } # 创建临时存储目录 $localPath = "$(Get-Location)\strgacctmp" if (-not (Test-Path -Path $localPath)) { New-Item -Path $localPath -ItemType Directory -Force -ErrorAction Stop Write-Host "Created folder: $localPath" } else { Write-Host "Folder already exists: $localPath" }
内容的提问来源于stack exchange,提问作者sudhir karamchand
相关产品推荐
相关产品推荐

