我有一个脚本,该脚本针对特定变量发出逗号分隔的值,并且该变量始终是动态的,我如何将它们分成多个键值对,我尝试了以下操作,但输出数组仅给出values [0]和{{3 }}
$tagsd = @()
foreach ($a in $vms)
{
$tags = (($a.ExtensionData.GetResourceProperties()).property | ?{$_.name -eq 'summary|tag'}).value.TrimStart('[').TrimEnd(']').split(",").trim()
#<vSphere Tag-Production>, <Cost Center-90210>
$Object = [pscustomobject][ordered]@{
VmName = $a.name
}
0..$tags.count | % {
Add-Member -InputObject $Object -NotePropertyName "VMtag$_" -NotePropertyValue $tags[$_]
}
$tagsd += $Object
}
但是输出如下,即使导出csv也能得到相同的结果
但是该数组由所有值组成,如下所示,某些VM具有Tag1到Tag 5,但是我只有VMtag [0]和VMtag ,可以帮一个忙吗?,我想要所有标签值成为导出csv的一部分。
答案 0 :(得分:1)
根据第一个对象创建表。如果要显示所有列:
$propNames = $tagsd | foreach { $_.psobject.Properties.Name } | select -Unique
$tagsd | select $propNames
此外,您的代码似乎还有其他问题。
如果$tags
仅具有一个值(例如$tags = "none"
),则$tags[0]
将返回第一个字符“ n”,而不是字符串“ none”。因此您可以通过[array]$tags = ...
或$tags = @(...)
解决此问题。
此外,范围应为0..($tags.Count -1)
,而不是0..$tags.Count
。
$tagsd = @()
foreach ($a in $vms) {
[array]$tags = (($a.ExtensionData.GetResourceProperties()).Property | where { $_.Name -eq 'summary|tag' }).Value.TrimStart('[').TrimEnd(']').Split(",").Trim()
$object = [pscustomobject]@{ VmName = $a.Name }
if($tags.Count) {
0..($tags.Count - 1) | foreach {
$object | Add-Member -NotePropertyName "VMtag$_" -NotePropertyValue $tags[$_]
}
}
$tagsd += $object
}
如果可能的话,最好避免对数组的索引访问。
$tagsd = foreach ($a in $vms) {
$tags = (($a.ExtensionData.GetResourceProperties()).Property | where { $_.Name -eq 'summary|tag' }).Value.TrimStart('[').TrimEnd(']').Split(",").Trim()
$h = [ordered]@{ VmName = $a.Name }
$tags | foreach { $i = 0 } { $h.Add("VMtag${i}", $_); $i++ }
[pscustomobject]$h
}
$propNames = $tagsd | foreach { $_.psobject.Properties.Name } | select -Unique
$tagsd | select $propNames