Приведенный ниже сценарий PowerShell предоставляет сведения о каталоге, отфильтрованные по имени каталога «внутренний» и имени тега «Бизнес», а также с именем контейнера «посадочный». Я заметил несколько учетных записей хранения с каталогами проектов внутри каталога «внутренний» и пытался перечислить их все в выходных данных. .
Я тестировал добавление внутреннего префикса к переменной $directory, но это не дало желаемого результата.
Мне нужно перечислить все каталоги внутри родительского каталога с именем Internal в разделе контейнера.
Connect-AzAccount -Tenant 'xxxxx' -UseDeviceAuthentication
# Get all subscriptions
$subscriptions = Get-AzSubscription
# Define the tag key to filter by
$tagKey = "Business"
# Initialize an array to store the results
$results = @()
foreach ($subscription in $subscriptions) {
# Set the current subscription context
Set-AzContext -SubscriptionId $subscription.Id
# Get all storage accounts in the current subscription
$storageAccounts = Get-AzStorageAccount | Where-Object { $_.Tags.ContainsKey($tagKey) }
foreach ($storageAccount in $storageAccounts) {
# Get the metrics for the storage account
$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) {
$averageCapacity = $usedCapacityMetric.timeseries.data.average | Measure-Object -Sum | Select-Object -ExpandProperty Sum
} else {
$averageCapacity = 0
}
} catch {
Write-Warning "Failed to retrieve metrics for storage account: $($storageAccount.StorageAccountName)"
$averageCapacity = 0
}
$ctx = $storageAccount.Context
$containers = Get-AzStorageContainer -Context $ctx | Where-Object { $_.Name -eq "landing" }
foreach ($container in $containers) {
$prefix = "internal"
$blobs = Get-AzStorageBlob -Prefix "internal" -Container $container.Name -Context $ctx
$directories = $blobs | ForEach-Object {
$parts = $_.Name.Split('/')
for ($i = 0; $i -lt $parts.Length - 1; $i++) {
$parts[0..$i] -join '/'
}
} | Sort-Object -Unique
$results += [PSCustomObject]@{
#SubscriptionId = $subscription.Id
SubscriptionName = $subscription.Name
ResourceGroup = $storageAccount.ResourceGroupName
StorageAccount = $storageAccount.StorageAccountName
ContainerName = $container.Name
UsedCapacityInBytes = $averageCapacity
TagName = $tagKey
TagValue = $storageAccount.Tags[$tagKey]
Directories = $directories -join ", "
}
}
}
# Output the results
$results | Format-Table -AutoSize
Я заметил несколько учетных записей хранения с каталогами проектов внутри каталога «внутренний» и попытался перечислить их все в выходных данных.
В моей среде в моей учетной записи хранения Azure есть каталог с подкаталогами, например zoom/recording/BBS/2024-8-7
.
Портал:
Вы можете использовать приведенный ниже скрипт, чтобы получить storage account details (filtered by tags)
, storage account size
, container(filtered by specific container)
, Particular directory and their subdirectory
из отфильтрованных контейнеров.
Скрипт:
Connect-AzAccount -Tenant 'xxxxx' -UseDeviceAuthentication
# Get all subscriptions
$subscriptions = Get-AzSubscription
# Define the tag key to filter by
$tagKey = "createdby"
# Initialize an array to store the results
$results = @()
foreach ($subscription in $subscriptions) {
# Set the current subscription context
Set-AzContext -SubscriptionId $subscription.Id
# Get all storage accounts in the current subscription
$storageAccounts = Get-AzStorageAccount | Where-Object { $_.Tags.ContainsKey($tagKey) }
foreach ($storageAccount in $storageAccounts) {
# Get the metrics for the storage account
$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) {
$averageCapacity = $usedCapacityMetric.timeseries.data.average | Measure-Object -Sum | Select-Object -ExpandProperty Sum
} else {
$averageCapacity = 0
}
} catch {
Write-Warning "Failed to retrieve metrics for storage account: $($storageAccount.StorageAccountName)"
$averageCapacity = 0
}
$ctx = $storageAccount.Context
$containers = Get-AzStorageContainer -Context $ctx | Where-Object { $_.Name -eq "test" }
foreach ($container in $containers) {
$blobs = Get-AzStorageBlob -Container $container.Name -Context $ctx | Where-Object { $_.Name -like "zoom/*" }
# Extract unique directories within the "zoom" directory
$directories = $blobs | ForEach-Object {
$parts = $_.Name.Split('/')
for ($i = 0; $i -lt $parts.Length - 1; $i++) {
$parts[0..$i] -join '/'
}
} | Sort-Object -Unique
$results += [PSCustomObject]@{
SubscriptionName = $subscription.Name
ResourceGroup = $storageAccount.ResourceGroupName
StorageAccount = $storageAccount.StorageAccountName
ContainerName = $container.Name
UsedCapacityInBytes = $averageCapacity
TagName = $tagKey
TagValue = $storageAccount.Tags[$tagKey]
Directories = $directories -join ", "
}
}
}
}
# Output the results
$results | Format-Table -AutoSize
Выход:
SubscriptionName ResourceGroup StorageAccount ContainerName UsedCapacityInBytes TagName TagValue Directories
---------------- ------------- -------------- ------------- ------------------- ------- -------- -----------
xxxxxx xxxxxx xxxxxxxxxx Subscription venkatesan-rg venkat891 test 45155865 createdby venkat zoom, zoom/recording, zoom/recording/BBS, zoom/recording/BBS/2024-8-7
В приведенном выше скрипте перечислены только папки внутри корневого каталога zoom
.
Вы пробовали использовать приведенный выше код?
for example in "test" container I have to list child directories only from "zoom" directory. In my case the content in folder "zoom" is project directories and that is the final output I'm looking for.
именно это и делает скрипт.
Да, я тестировал тот же код, но не знаю, как загрузить снимок экрана.
Можете ли вы поделиться ссылкой на изображение?
В папках project1
есть файлы?
В моей среде я создал ту же папку и использовал тот же код, который был успешно выполнен. i.imgur.com/Am8zjx1.png и вывод: i.imgur.com/deRzYBQ.png
В вашем выводе нет значения использованной мощности, также можете перепроверить скрипт и попробовать один раз? @sudhirkaramchand
Потребовалось некоторое время, чтобы вернуться к этому. Да, решение сработало и дало мне правильный результат, хотя я не уверен, какая была предыдущая ошибка. Спасибо за вашу помощь.
Я изменил ваш сценарий на основе приведенного выше сценария и создал ту же структуру папок, но в выходных каталогах указана только папка «увеличение». Также мне нужно избегать перечисления всех файлов и папок внутри, например, в «тестовом» контейнере мне нужно перечислять дочерние каталоги только из каталога «масштаб». В моем случае содержимое папки «zoom» — это каталоги проектов, и это конечный результат, который я ищу.