如何将名称/值对对象传递给高级函数?

时间:2016-10-16 05:16:17

标签: powershell hash

我想要将名称/值对作为对象管道传递给高级函数。

我从一个看起来像这样的OrderedDictionary开始:

$jobs = [ordered]@{0='job0';1='job1';2='job2';3='job3';4='job4'; 5='job5';6='job6';}

控制台输出如下所示:

$jobs
Name                           Value                                                                                                                                                                
----                           -----                                                                                                                                                                
0                              job0                                                                                                                                                                 
1                              job1                                                                                                                                                                 
2                              job2                                                                                                                                                                 
3                              job3                                                                                                                                                                 
4                              job4                                                                                                                                                                 
5                              job5                                                                                                                                                                 
6                              job6 

该功能如下所示:

Function Process-Jobs {
   [cmdletbinding()]
   Param (
        [Parameter(ValueFromPipeline=$true)][hashtable]$jobs
   )
    Begin {
        Write-Output '--> begin block <--'
    }
    Process {
        Write-Output $_.Name
        Write-Output $_.Value
    }
    End {
        Write-Output '--> end block <--'
    }
}
$jobs = [ordered]@{0='job0';1='job1';2='job2';3='job3';4='job4'; 5='job5';6='job6';}
$jobs | Process-Jobs

上面的代码不起作用并将其返回到控制台:

--> begin block <--
--> end block <--

我尝试将哈希表设为这样的自定义对象:

$jobs = [PSCustomObject][ordered]@{0='job0';1='job1';2='job2';3='job3';4='job4'; 5='job5';6='job6';}

控制台输出如下所示:

$jobs
0 : job0
1 : job1
2 : job2
3 : job3
4 : job4
5 : job5
6 : job6

如果我修改了这个功能......

Function Process-Jobs {
   [cmdletbinding()]
   Param (
        [Parameter(ValueFromPipeline=$true)][PSCustomObject]$jobs
   )
    Begin {
        Write-Output '--> begin block <--'
    }
    Process {
        $i = 0
        Write-Output $jobs.Name
        Write-Output $jobs.$i
    }
    End {
        Write-Output '--> end block <--'
    }
}

$jobs = [PSCustomObject][ordered]@{0='job0';1='job1';2='job2';3='job3';4='job4'; 5='job5';6='job6';}
$jobs | Process-Jobs

控制台输出如下所示:

--> begin block <--
job0
--> end block <--

我似乎失去了引用Name属性的能力。

如何访问$jobs对象的Name属性?

我从OrderedDictionary开始,因为我需要它来处理函数中的其他地方。

是否有更好的方法将名称/值对管道传输到高级功能?

我应该使用这样的东西:

$jobs = New-Object –TypeName PSCustomObject
$jobs | Add-Member –MemberType NoteProperty –Name 'Name' –Value 0
$jobs | Add-Member –MemberType NoteProperty –Name 'Value' –Value 'job0'
...
$jobs | Process-Jobs

需要额外的代码来循环和排序......

0 个答案:

没有答案