【问题标题】:Extra space in custom PSObject自定义 PSObject 中的额外空间
【发布时间】:2015-05-11 21:09:18
【问题描述】:

我正在构建自定义 PSObject 数组,但我注意到在没有明显原因的情况下插入了很多额外的空间。示例:

PS> $user = @()
PS> $user += New-Object PSObject -Property @{"Name" = "John Smith"}
PS> $user += New-Object PSObject -Property @{"Age" = "18"}
PS> $user += New-Object PSObject -Property @{"City of birth" = "New York"}
PS> $user += New-Object PSObject -Property @{"Pet" = "none"}
PS> "[$($user.Name)]"
[John Smith   ]
PS> "[$($user.Pet)]"
[   none]

似乎我添加的键/值对越多,为这些值添加的空间就越多。任何想法为什么会这样?

【问题讨论】:

  • 您正在构建一个数组...您不应该通过"[$($user[0].Name)]" 访问用户吗 - 数组中的第一个元素,选择 NoteProperty 名称?

标签: powershell


【解决方案1】:

$user 是一个数组,因此$user.Name 的行为是获取所有条目的 Name 属性。由于它被放入字符串中,因此值由空格连接在一起。因此,每次您向 $user 添加条目时,都会在所有属性的某处添加一个额外的空间。

我不太确定您是否将$user 定义为一个数组。构建一个包含所有属性的哈希表并将其初始化为 $user 作为 PSObject 会更有意义:

$props = @{ "Name" = "John Smith"; "Age" = "18"; "City of birth" = "New York"; "Pet" = "none"}
$user = New-Object PSObject -Property $props

或者如果您需要动态构建一些属性:

$props = @{ "Name" = "John Smith"; "Age" = "18"; "City of birth" = "New York"; "Pet" = "none"}
if ($myCondition) 
{
    $props.PropertyA = "A"
}
else
{
    $props.PropertyB = "B"
}
$user = New-Object PSObject -Property $props

或者如果您是从database it would probably look more like this 阅读它们:

while($reader.Read()) {
     $props = @{}
     for($i = 0; $i -lt $reader.FieldCount; $i+=1) {
        $name = $reader.GetName($i)
        $value = $reader.item($i)
        $props.Add($name, $value)   
     }
     $obj = new-object PSObject -Property $props
     Write-Output $obj
}

【讨论】:

  • 我知道我可以一次将它们全部添加,但问题是我正在迭代一些数据并且事先不知道所有属性将是什么。我不能将它们全部放在一条线上。如果做一个数组并 op_adding 它们不是构建对象的正确方法,我该如何随着时间的推移构建它?
  • 您也可以稍后使用Add-Member向现有对象添加属性
【解决方案2】:

感谢@mike-z 对Add-Member 的评论。事实证明,这段代码做了我想要的:

PS> $user = New-Object PSObject
PS> $user | Add-Member -NotePropertyName "Name" -NotePropertyValue "John Smith"
PS> $user | Add-Member -NotePropertyName "Age" -NotePropertyValue "18"
PS> $user | Add-Member -NotePropertyName "City of birth" -NotePropertyValue "New York"
PS> $user | Add-Member -NotePropertyName "Pet" -NotePropertyValue "none"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2020-04-26
    相关资源
    最近更新 更多