Я выполняю простой запрос PowerShell в Azure. Я хочу фильтровать только веб-приложения с определенным тегом, назначенным ему:
$apps = Get-AzWebApp | Where-Object {$_.Tags["Application"] -match "any-tag-value"}
if ($apps) {
foreach ($app in $apps) {
Write-Host $app.Name
}
}
Независимо от того, найдет он что-нибудь или нет, первые два результата всегда будут InvalidOperation: Cannot index into a null array.. После этого он перечисляет то, что находит.
Если я удалю предложение Where-Object, все будет работать нормально.
Я не уверен, почему возникает эта ошибка и что это за два пустых массива, которые входят в набор результатов.
Кто-нибудь может пролить свет на это?


Скорее всего, первые два ресурса, перечисленные вашим командлетом, не имеют набора тегов, и ссылка на свойство, которое не установлено, будет null, а затем индексирование значения null вызывает исключение, которое вы видите:
([pscustomobject]@{ }).PropertyDoesNotExist['foo']
# Throws: InvalidOperation: Cannot index into a null array.
Самый простой обходной путь — использовать точечную нотацию и позволить перечислению членского доступа выполнять индексацию за вас, таким образом:
$apps = Get-AzWebApp | Where-Object { $_.Tags.Application -match "any-tag-value" }
Или вы можете сначала проверить, существует ли такое свойство, а затем попытаться его проиндексировать:
$apps = Get-AzWebApp | Where-Object { $_.Tags -and $_.Tags['Application'] -match "any-tag-value" }
если у ресурса, к которому вы запрашиваете, не установлен какой-либо тег, имело бы смысл выдать эту ошибку. Измените фильтрацию на:
Where-Object { $_.Tags -and $_.Tags["Application"] -match "any-tag-value"}