PowerShell数组获取新条目

时间:2017-12-29 02:31:55

标签: arrays powershell

在这个片段中,我有一个函数(FDiskScan),它将计算机名称作为输入,并应返回一个对象数组。

function FDiskScan ([String] $name)
{
    $outarray = [System.Collections.ArrayList]@()
    $diskscan = Get-WmiObject Win32_logicaldisk -ComputerName $name

    foreach ($diskobj in $diskscan)
    {
        if($diskobj.VolumeName -ne $null ) 
        {
            $max = $diskobj.Size/1024/1024/1024
            $free = $diskobj.FreeSpace/1024/1024/1024
            $full = $max - $free

            $obj = @{ 
                'ID' = $diskobj.deviceid
                'Name' = $diskobj.VolumeName
                'TotalSpace' = $max
                'FreeSpace' = $free
                'OccupiedSpace' = $full }
            $TMP = New-Object psobject -Property $obj
            $outarray.Add($TMP) 
        }
    }
    return $outarray
}

$pc = "INSERT PC NAME HERE"
$diskdata = [System.Collections.ArrayList]@()
$diskdata = FDiskScan($pc)

foreach ($disk in $diskdata) 
{
   Write-Host "Disco: " $disk.ID
   Write-Host "Espaço Total: " ([math]::Round($disk.TotalSpace, 2)) "GB"
   Write-Host "Espaço Ocupado: " ([math]::Round($disk.OccupiedSpace, 2)) "GB"
   Write-Host "Espaço Livre"  ([math]::Round($disk.FreeSpace, 2)) "GB" "`n"
}

在调试函数中并进入变量我可以看到一切正常,当数组离开函数并进入脚本范围时,它会再增加2个条目。

在调试模式下,它告诉我$outarry中的FDiskScan有我在系统上组织的两个磁盘应该是这样。

但是:

$diskdata = FDiskScan($pc)

它表示它在索引0上的值为0,在索引1上的值为1,然后磁盘跟随,第一个磁盘C:在索引3中,磁盘D在索引4中。

预期的行为是索引0和1,磁盘C和D分别不是幻像0和1条目。

2 个答案:

答案 0 :(得分:2)

由于这一行,你看到0, 1 - $outarray.Add($TMP)。将其更改为$outarray.Add($TMP) | Out-Null。我认为PowerShell在添加到数组时会打印索引。

答案 1 :(得分:1)

将对象添加到PowerShell中的数组列表(即$outarray.Add($TMP))索引时,添加了对象,返回。由于您没有将返回值赋给变量,因此函数返回System.Array,其中包含return $outarray返回的索引和数组列表的条目。这就是你的函数返回值包含4个元素的原因。此外,在这种情况下,函数返回值不是System.Collections.ArrayList类型,而是类型System.Array。 要避免这种行为,请执行以下操作。

$null = $outarray.Add($TMP);