Powershell:将属性分配给现有数组

时间:2015-03-17 22:05:40

标签: arrays powershell

我有一个单维数组,我可以从get-content命令或多行文本框输入中获得。我想为这个数组中的条目分配一个属性,然后添加更多属性以便稍后在我的脚本中使用。

类似的东西:

$items = new-object psobject
$items | add-member -membertype NoteProperty –name Name –value NotSet
$items | add-member -membertype NoteProperty –name Percent –value NotSet

$names = @($textboxInputText.Lines)
$names | % { $items | Add-Member noteproperty $_.Name $temp.($_.Name) }

foreach ($item in $items)
{
$percent = {script block}
$item.percent = $percent
}

我知道这是破碎的代码,但我想举例说明我的目标。我搜索得很远,但却找不到我想要的东西。

修改

代码目标:从文本框或文本文件(单行条目)获取输入。将这些条目分配给“name”属性,然后将第二个属性添加到数组(Percent),该属性需要用另一个代码块填充。

编辑2:

以下代码中使用了集合:

foreach ($item in $collection) {
    $psConsoleFile = "PATH TO FILE.pc1"
    $variable1 = "something"
    $variable2 = "something else"
    $command = ".`"Command1 $item.name | Command2 -Switch $variable1 -Switch2 $variable2`""
    $OutputScriptBlock = "powershell.exe -PSConsoleFile $psConsoleFile -command $command"
}

输出如下:

powershell.exe -PSConsoleFile "PATH TO FILE.psc1" -command ."Command1 @{Name=name1; Percentage=}.name | Command2 -Switch1 something"

为什么代码输出完整行而不是名称?

另外,我正在使用PS 4.0来完成此脚本的所有实现。

1 个答案:

答案 0 :(得分:2)

好的,我在这里看到了问题。因此,您可以从多行文本框表单对象或带有Get-Content命令的文本文档中获得一个字符串数组,但您真正需要的是一个PSObject数组。

一个字符串对象不能像你想要的那样添加额外的属性(嗯,不是传统的,不要去那里,因为你不会对事情的结局感到满意,相信我这个)。相反,让我们获取该字符串数组,并为每个字符串创建一个PSObject,就像你想要的那样。你需要一个ForEach-Object循环,这很简单。无论哪种方式,您都希望将输入(文本框或get-content命令)传递给ForEach循环,并且您可以将整个事物分配给一个变量,该变量将收集稍后要处理的所有对象(以更新百分比属性)。这样的事情应该能达到你想要的效果:

[Array]$Collection = $textboxInputText.Lines | ForEach{
    New-Object PSObject -Property @{
        'Name' = $_
        'Percentage' = $null
    }
}

我将$Collection指定为类型[Array],因此如果您想稍后将其编入索引,那么如果您的输入只是单个项目,则不会出现任何问题。然后,如果要更新百分比,可以通过ForEach循环运行$Collection(内联或不内联)来更新百分比

$Collection | ForEach{ $_.Percentage = {Script Block} }

ForEach($Item in $Collection){
    $Item.Percentage = {Script Block}
}

现在,需要注意的事项......您无法将$ Collection分配回文本框。您可以分配$ Collection.Name,但这可能需要更新版本的PS,因为我不知道它是如何向后兼容的。如果您使用Get-Content命令而不是引用文本框,只需将$textboxInputText.Lines | ForEach{更改为Get-Content "C:\Path\To\File.txt" | ForEach{即可完成设置。

编辑:好的,您现在遇到的问题不在于该对象,而在于您是如何尝试在双引号内扩展其属性的。要访问该名称,您必须在$Item.Name中包装$(),在双引号内创建子表达式。所以这条线看起来像:

    $command = ".`"Command1 $($item.name) | Command2 -Switch $variable1 -Switch2 $variable2`""