Arrays PowerShell阵列正在获取新条目

Arrays PowerShell阵列正在获取新条目,arrays,powershell,Arrays,Powershell,在这个代码段中,我有一个函数(FDiskScan),它获取一个计算机名作为输入,并应返回一个对象数组 函数FDiskScan([String]$name) { $outarray=[System.Collections.ArrayList]@() $diskscan=获取WmiObject Win32_logicaldisk-ComputerName$name foreach($diskobj in$diskscan) { 如果($diskobj.VolumeName-ne$null) { $m

在这个代码段中,我有一个函数(
FDiskScan
),它获取一个计算机名作为输入,并应返回一个对象数组

函数FDiskScan([String]$name) { $outarray=[System.Collections.ArrayList]@() $diskscan=获取WmiObject Win32_logicaldisk-ComputerName$name foreach($diskobj in$diskscan) { 如果($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 “占用空间”=$full} $TMP=新对象psobject-属性$obj $outarray.Add($TMP) } } 返回$outarray } $pc=“在此处插入pc名称” $diskdata=[System.Collections.ArrayList]@() $diskdata=FDiskScan($pc) foreach($diskdata中的磁盘) { 写入主机“Disco:$disk.ID” 写主机“Espaço Total:([math]::Round($disk.TotalSpace,2))“GB” 写主机“Espaço Ocupado:([math]::Round($disk.OccupiedSpace,2))“GB” 写主机“Espaço Livre”([math]::Round($disk.FreeSpace,2))“GB”“`n” } 在函数中,通过调试和进入变量,我可以看到一切正常,当数组离开函数并进入脚本范围时,它又添加了2个条目

在调试模式下,它告诉我
FDiskScan
中的
$outarry
将系统中的两个磁盘按应有的方式组织起来

然而,关于:

$diskdata=FDiskScan($pc)
它说它在索引0上有一个值为0的条目,在索引1上有一个值为1的条目,然后磁盘也会这样做,首先是索引3中的磁盘C:和索引4中的磁盘D


预期的行为是索引0和1的磁盘C和D分别不是幻影0和1项。

您看到的是
0,1
,因为这一行-
$outarray.Add($TMP)
。将其更改为
$outarray.Add($TMP)| Out Null
。我认为PowerShell在添加到阵列时正在打印索引。

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

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

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

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

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

@PhaniAnne需要注意的一点是:
$diskdata=FDiskScan($pc)
不是使用PowerShell调用函数的正确方法。正确的方法是
$diskdata=FDiskScan$pc
。不正确的方法适用于单参数函数,但一旦使用了两个参数,如
$diskdata=FDiskScan2($pc,$DriveType)
,它将不会像您预期的那样工作。您认为您调用的是参数1=
$pc
和参数2=
$DriveType
的函数,但是您真正要做的是使用参数1=一个
($pc,$DriveType)
数组调用函数,参数2为null。调用该函数的正确方法是
$diskdata=FDiskScan2$pc$DriveType
@BaconBits函数必须只有一个参数,至少目前是这样。但我感谢你给我推荐了更好的写作方法。我对类似C的语法有更好的理解,所以有时我会混淆一些语言的细节,比如powershell。@Phaniane需要注意的一点是:
$diskdata=FDiskScan($pc)
不是使用powershell调用函数的正确方法。正确的方法是
$diskdata=FDiskScan$pc
。不正确的方法适用于单参数函数,但一旦使用了两个参数,如
$diskdata=FDiskScan2($pc,$DriveType)
,它将不会像您预期的那样工作。您认为您调用的是参数1=
$pc
和参数2=
$DriveType
的函数,但是您真正要做的是使用参数1=一个
($pc,$DriveType)
数组调用函数,参数2为null。调用该函数的正确方法是
$diskdata=FDiskScan2$pc$DriveType
@BaconBits函数必须只有一个参数,至少目前是这样。但我感谢你给我推荐了更好的写作方法。我对类似C的语法有更好的理解,所以有时我会混淆一些语言的细节,比如powershell。搜索之后,ArrayList对象的Add方法除了adding外,似乎还打印出了它添加到的索引。这样做的目的是忽略所说的输出,我还找到了变量:
$null=$outarray.Add($TMP)$outarray.Add($TMP)>$nu