【问题标题】:Problem with PSCustomObject data collectionPSCustomObject 数据收集问题
【发布时间】:2019-09-30 09:49:30
【问题描述】:

我正在准备一个表格,其中包含有关 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()
}
}

【问题讨论】:

    标签: azure powershell scripting virtual-machine storage


    【解决方案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

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

    解决方案:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 感谢您的帮助!但是这个解决方案只有在所有磁盘都被管理的情况下才有效(因为这些将是输出中唯一列出的)。
      【解决方案3】:

      错误提示:

      Cannot index into a null array. 
      

      所以我猜这里$_.disks.statuses.time[0].ToString()$null。因此你应该添加一些$nullchecks:

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

      希望对您有所帮助。

      【讨论】:

      • 不可能,每个包含 OS 磁盘的 VM 都包含该日期。当我运行你的脚本时,$vmOutput 为空,所以肯定有其他事情发生。
      猜你喜欢
      • 2019-06-18
      • 2022-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多