在这个片段中,我有一个函数(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条目。
答案 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);