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