Powershell:无法索引到空数组错误
Powershell: Cannot index into a null array error
我正在编写一个脚本来导入包含字段 "Volume Name"、"LUN UID"、"Capacity (GiB)"、"Storage Pool Name"、"Storage System name"、[= 的 LUN 列表31=] 和 "Host Mappings" 变量 $luns.
然后我需要将 $luns 变量中的 "LUN UID" 与另一个为存储数据存储 naa 而创建的变量 $dsnaa 相匹配。
获取驻留在与导入的 excel 文件中的存储卷/LUN ID 匹配的数据存储上的所有虚拟机列表的想法。
错误:
Cannot index into a null array.
At C:\Users\troyh\Documents\WindowsPowerShell\ServerList_from_LUN_List.ps1:18 char:40
+ ... re | where {($_.ExtensionData.Info.Vmfs.Extent[0]).DiskName -like $ds ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : NullArray
脚本:
$luns = Import-Excel ~\Documents\WindowsPowerShell\Imports\LUN_Import.xlsx
$arr1 = @()
foreach($lun in $luns)
{
$dsnaa = $lun.'LUN UID'
$dsnaa = "*$dsnaa*"
$datastore = Get-Datastore | where {($_.ExtensionData.Info.Vmfs.Extent[0]).DiskName -like $dsnaa}
$vms = Get-Datastore $datastore.Name | Get-VM
foreach($vm in $vms)
{
$data = New-Object System.Object
$data | Add-Member -MemberType NoteProperty -Name "Name" -Value $vm.Name
$data | Add-Member -MemberType NoteProperty -Name "Datastore" -Value $datastore.'Name'
$data | Add-Member -MemberType NoteProperty -Name "naa" -Value $lun.'LUN UID'
$data | Add-Member -MemberType NoteProperty -Name "Storage Pool Name" -Value $lun.'Storage Pool Name'
$data | Add-Member -MemberType NoteProperty -Name "Storage System Name" -Value $luns.'Storage System name'
$arr1 += $data
}
}
$arr1 | Export-Excel ~\Documents\WindowsPowerShell\Exports\ServerList_$(Get-Date -Format 'yyyy-MM-dd_H"H"mm').xlsx –Show
这一行是问题所在:
$datastore = Get-Datastore | where {($_.ExtensionData.Info.Vmfs.Extent[0]).DiskName -like $dsnaa}
您需要删除索引:
$datastore = Get-Datastore | where {($_.ExtensionData.Info.Vmfs.Extent).DiskName -like $dsnaa}
上面的行将获取所有符合使用 -like
运算符的条件的数据存储。如果您只对获取列表中的第一个数据存储感兴趣,那么在下一行中像这样索引数据存储变量。
$datastore = Get-Datastore | where {($_.ExtensionData.Info.Vmfs.Extent).DiskName -like $dsnaa}
$vms = Get-Datastore $datastore[0].Name | Get-VM
如果您想一次获取所有内容,Get-VM
cmdlet 确实需要一个数据存储数组。
我进行了更多编辑以尝试完成您正在尝试的工作。除了索引之外,这里的问题是将数据存储名称放入数据对象中。这是使用您的大量代码进行的重写:
$luns = Import-Excel ~\Documents\WindowsPowerShell\Imports\LUN_Import.xlsx
$arr1 = @()
foreach($lun in $luns)
{
$dsnaa = $lun.'LUN UID'
$dsnaa = "*$dsnaa*"
$datastore = Get-Datastore | where {($_.ExtensionData.Info.Vmfs.Extent).DiskName -like $dsnaa}
$VMs = @()
$datastore | foreach-object {
$dstore = $_.name
$VMs += get-VM -datastore $dstore | select @{n="Name";e={$_.name}},@{n="Datastore_Name";e={$dstore}}
}
foreach($vm in $vms)
{
$data = New-Object System.Object
$data | Add-Member -MemberType NoteProperty -Name "Name" -Value $vm.Name
$data | Add-Member -MemberType NoteProperty -Name "Datastore" -Value $vm.'Datastore_Name'
$data | Add-Member -MemberType NoteProperty -Name "naa" -Value $lun.'LUN UID'
$data | Add-Member -MemberType NoteProperty -Name "Storage Pool Name" -Value $lun.'Storage Pool Name'
$data | Add-Member -MemberType NoteProperty -Name "Storage System Name" -Value $luns.'Storage System name'
$arr1 += $data
}
}
$arr1 | Export-Excel ~\Documents\WindowsPowerShell\Exports\ServerList_$(Get-Date -Format 'yyyy-MM-dd_H"H"mm').xlsx –Show
我正在编写一个脚本来导入包含字段 "Volume Name"、"LUN UID"、"Capacity (GiB)"、"Storage Pool Name"、"Storage System name"、[= 的 LUN 列表31=] 和 "Host Mappings" 变量 $luns.
然后我需要将 $luns 变量中的 "LUN UID" 与另一个为存储数据存储 naa 而创建的变量 $dsnaa 相匹配。
获取驻留在与导入的 excel 文件中的存储卷/LUN ID 匹配的数据存储上的所有虚拟机列表的想法。
错误:
Cannot index into a null array.
At C:\Users\troyh\Documents\WindowsPowerShell\ServerList_from_LUN_List.ps1:18 char:40
+ ... re | where {($_.ExtensionData.Info.Vmfs.Extent[0]).DiskName -like $ds ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : NullArray
脚本:
$luns = Import-Excel ~\Documents\WindowsPowerShell\Imports\LUN_Import.xlsx
$arr1 = @()
foreach($lun in $luns)
{
$dsnaa = $lun.'LUN UID'
$dsnaa = "*$dsnaa*"
$datastore = Get-Datastore | where {($_.ExtensionData.Info.Vmfs.Extent[0]).DiskName -like $dsnaa}
$vms = Get-Datastore $datastore.Name | Get-VM
foreach($vm in $vms)
{
$data = New-Object System.Object
$data | Add-Member -MemberType NoteProperty -Name "Name" -Value $vm.Name
$data | Add-Member -MemberType NoteProperty -Name "Datastore" -Value $datastore.'Name'
$data | Add-Member -MemberType NoteProperty -Name "naa" -Value $lun.'LUN UID'
$data | Add-Member -MemberType NoteProperty -Name "Storage Pool Name" -Value $lun.'Storage Pool Name'
$data | Add-Member -MemberType NoteProperty -Name "Storage System Name" -Value $luns.'Storage System name'
$arr1 += $data
}
}
$arr1 | Export-Excel ~\Documents\WindowsPowerShell\Exports\ServerList_$(Get-Date -Format 'yyyy-MM-dd_H"H"mm').xlsx –Show
这一行是问题所在:
$datastore = Get-Datastore | where {($_.ExtensionData.Info.Vmfs.Extent[0]).DiskName -like $dsnaa}
您需要删除索引:
$datastore = Get-Datastore | where {($_.ExtensionData.Info.Vmfs.Extent).DiskName -like $dsnaa}
上面的行将获取所有符合使用 -like
运算符的条件的数据存储。如果您只对获取列表中的第一个数据存储感兴趣,那么在下一行中像这样索引数据存储变量。
$datastore = Get-Datastore | where {($_.ExtensionData.Info.Vmfs.Extent).DiskName -like $dsnaa}
$vms = Get-Datastore $datastore[0].Name | Get-VM
如果您想一次获取所有内容,Get-VM
cmdlet 确实需要一个数据存储数组。
我进行了更多编辑以尝试完成您正在尝试的工作。除了索引之外,这里的问题是将数据存储名称放入数据对象中。这是使用您的大量代码进行的重写:
$luns = Import-Excel ~\Documents\WindowsPowerShell\Imports\LUN_Import.xlsx
$arr1 = @()
foreach($lun in $luns)
{
$dsnaa = $lun.'LUN UID'
$dsnaa = "*$dsnaa*"
$datastore = Get-Datastore | where {($_.ExtensionData.Info.Vmfs.Extent).DiskName -like $dsnaa}
$VMs = @()
$datastore | foreach-object {
$dstore = $_.name
$VMs += get-VM -datastore $dstore | select @{n="Name";e={$_.name}},@{n="Datastore_Name";e={$dstore}}
}
foreach($vm in $vms)
{
$data = New-Object System.Object
$data | Add-Member -MemberType NoteProperty -Name "Name" -Value $vm.Name
$data | Add-Member -MemberType NoteProperty -Name "Datastore" -Value $vm.'Datastore_Name'
$data | Add-Member -MemberType NoteProperty -Name "naa" -Value $lun.'LUN UID'
$data | Add-Member -MemberType NoteProperty -Name "Storage Pool Name" -Value $lun.'Storage Pool Name'
$data | Add-Member -MemberType NoteProperty -Name "Storage System Name" -Value $luns.'Storage System name'
$arr1 += $data
}
}
$arr1 | Export-Excel ~\Documents\WindowsPowerShell\Exports\ServerList_$(Get-Date -Format 'yyyy-MM-dd_H"H"mm').xlsx –Show