PSCustomObject数据收集问题

时间:2019-05-13 12:21:56

标签: azure powershell scripting virtual-machine storage

我正在准备一张表,其中包含有关VM名称和OS磁盘供应日期的信息。如果将单个VM分配给$ VM,我可以轻松地从$ VM.disks.statuses.time [0]命令检索该信息,但是当我尝试将数据收集到表中时,出现错误:

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 个答案:

答案 0 :(得分:1)

您可以使用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 :(得分:1)

我可以重现您的问题,该问题是由Get-AzVM -statusGet-AzVM -ResourceGroupName <ResourceGroupName> -Name <Name> -Status的输出引起的。

Get-AzVM -status的输出将不具有disks属性,但是当您通过Get-AzVM -ResourceGroupName <ResourceGroupName> -Name <Name> -Status获得单个VM状态时,它将具有该属性,因此会出现错误。

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

答案 2 :(得分:0)

错误提示:

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()
       }
    }
}

希望有帮助。