You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 13:12:03