Проблема со сбором данных PSCustomObject - PullRequest
0 голосов
/ 13 мая 2019

Я готовлю таблицу с информацией об имени виртуальной машины и дате предоставления диска ОС.Я могу легко получить эту информацию из команды $ VM.disks.statuses.time [0], если отдельная виртуальная машина назначена на $ VM, но когда я пытаюсь собрать данные в таблицу, я получил ошибку:

Cannot index into a null array.
At line:4 char:1
+ [PSCustomObject]@{
+ ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray

Это мой код:

$VMs = Get-AzVM -status

$vmOutput = $VMs | ForEach-Object {
[PSCustomObject]@{
"VM Name" = $_.Name
"Provision Date" = $_.disks.statuses.time[0].ToString()
}
}

Ответы [ 3 ]

1 голос
/ 13 мая 2019

Вы можете использовать команду Get-AzDisk для получения информации о создании диска.

$disks = Get-AzDisk | Where-Object { $_.Managedby }
$vmOutput = foreach ($disk in $disks) {
    [pscustomobject]@{"VM Name" = ($disk.ManagedBy -split "/")[-1]
        "Provisioned Date" = $disk.TimeCreated
    }
}
1 голос
/ 14 мая 2019

Я могу воспроизвести вашу проблему, проблема была вызвана тем, что выходные данные Get-AzVM -status и Get-AzVM -ResourceGroupName <ResourceGroupName> -Name <Name> -Status отличаются.

Вывод Get-AzVM -status не будет иметь свойства disks, но когда вы получите индивидуальный статус виртуальной машины через Get-AzVM -ResourceGroupName <ResourceGroupName> -Name <Name> -Status, у него будет свойство, поэтому вы получили ошибку.

Get-AzVM -status:

enter image description here

Get-AzVM -ResourceGroupName <ResourceGroupName> -Name <Name> -Status:

enter image description here

Решение:

Чтобы устранить проблему, просто используйте Get-AzVM -ResourceGroupName <ResourceGroupName> -Name <Name> -Status в своем скрипте.

$VMs = Get-AzVM -status

$vmOutput = $VMs | ForEach-Object {

$VMstatus = Get-AzVM -ResourceGroupName $_.ResourceGroupName -Name $_.Name -Status

[PSCustomObject]@{
"VM Name" = $VMstatus.Name
"Provision Date" = $VMstatus.disks.statuses.time[0].ToString()
}
}

enter image description here

0 голосов
/ 13 мая 2019

Ошибка говорит:

Cannot index into a null array. 

Так что я предполагаю, что что-то здесь $_.disks.statuses.time[0].ToString() равно $null. Поэтому вы должны добавить несколько $null проверок:

$VMs = Get-AzVM -status

$vmOutput = $VMs | ForEach-Object {
    if ($_.disks -and $_.disks.statuses -and $_.disks.statuses.time -and ($_.disks.statuses.time.Count -gt 0)){
       [PSCustomObject]@{
          "VM Name" = $_.Name
           "Provision Date" = $_.disks.statuses.time[0].ToString()
       }
    }
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...