Powershell:无法索引为空数组错误

时间:2019-02-15 13:34:20

标签: powershell storage powercli

我正在编写脚本来导入LUN列表,其中包含字段“卷名”,“ LUN UID”,“容量(GiB)”,“存储池名称”,“存储系统名称”,“存储层”和$ 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

1 个答案:

答案 0 :(得分:0)

这是问题所在:

$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