Azure PSCustomObject数据收集存在问题

Azure PSCustomObject数据收集存在问题,azure,powershell,scripting,virtual-machine,storage,Azure,Powershell,Scripting,Virtual Machine,Storage,我正在准备一个表,其中包含有关VM名称和OS磁盘的供应日期的信息。我可以从$VM.disks.statuses.time[0]命令轻松检索该信息,如果单个VM被分配给$VM,但当我尝试将数据收集到表中时,我发现一个错误: Cannot index into a null array. At line:4 char:1 + [PSCustomObject]@{ + ~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation:

我正在准备一个表,其中包含有关VM名称和OS磁盘的供应日期的信息。我可以从$VM.disks.statuses.time[0]命令轻松检索该信息,如果单个VM被分配给$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()
}
}
错误显示:

Cannot index into a null array. 
所以我猜这里的
$\uu.disks.status.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()
       }
    }
}
希望能有所帮助。

错误提示:

Cannot index into a null array. 
所以我猜这里的
$\uu.disks.status.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()
       }
    }
}

希望对您有所帮助。

您可以使用
Get-AzDisk
命令检索磁盘创建信息

$disks = Get-AzDisk | Where-Object { $_.Managedby }
$vmOutput = foreach ($disk in $disks) {
    [pscustomobject]@{"VM Name" = ($disk.ManagedBy -split "/")[-1]
        "Provisioned Date" = $disk.TimeCreated
    }
}

您可以使用
Get-AzDisk
命令检索磁盘创建信息

$disks = Get-AzDisk | Where-Object { $_.Managedby }
$vmOutput = foreach ($disk in $disks) {
    [pscustomobject]@{"VM Name" = ($disk.ManagedBy -split "/")[-1]
        "Provisioned Date" = $disk.TimeCreated
    }
}

我可以重现您的问题,该问题是由
Get-AzVM-status
Get-AzVM-ResourceGroupName-Name-status
的输出不同引起的

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

获取AzVM-状态

获取AzVM-ResourceGroupName-Name-Status

解决方案:

要解决此问题,只需在脚本中使用
getazvm-ResourceGroupName-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()
}
}

我可以重现您的问题,问题是由
Get AzVM-status
Get AzVM-ResourceGroupName-Name-status
的输出不同引起的

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

获取AzVM-状态

获取AzVM-ResourceGroupName-Name-Status

解决方案:

要解决此问题,只需在脚本中使用
getazvm-ResourceGroupName-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()
}
}

不可能,每个包含操作系统磁盘的虚拟机都包含该日期。当我运行你的脚本时,$vmOutput为空,所以肯定有其他事情发生。不可能,每个包含OS磁盘的虚拟机都包含该日期。当我运行您的脚本时,$vmOutput为空,因此肯定发生了其他事情。感谢您的帮助!但此解决方案仅在管理所有磁盘时有效(因为这些磁盘将是输出中列出的唯一磁盘)。感谢您的帮助!但此解决方案仅在管理所有磁盘时有效(因为这些磁盘将是输出中列出的唯一磁盘)。