PSCustomObject 数据收集问题
Problem with PSCustomObject data collection
我正在准备 table,其中包含有关 OS 磁盘的 VM 名称和配置日期的信息。如果将单个 VM 分配给 $VM,我可以从 $VM.disks.statuses.time[0] 命令轻松检索该信息,但是当我尝试将数据收集到 table 时,出现错误:
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.
所以我猜 $_.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()
}
}
}
希望对您有所帮助。
您可以使用 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 <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()
}
}
我正在准备 table,其中包含有关 OS 磁盘的 VM 名称和配置日期的信息。如果将单个 VM 分配给 $VM,我可以从 $VM.disks.statuses.time[0] 命令轻松检索该信息,但是当我尝试将数据收集到 table 时,出现错误:
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.
所以我猜 $_.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()
}
}
}
希望对您有所帮助。
您可以使用 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 <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()
}
}