我有一个单维数组,我可以从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来完成此脚本的所有实现。
答案 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`""