我再次遇到同样的问题,我有我的默认处理方式,但它一直困扰着我。
有没有更好的办法?
所以基本上我有一个运行的管道,在管道内做一些事情,并想从管道内返回一个键/值对。
我希望整个管道返回一个类型为 psobject(或 pscustomobject)的对象。
这是我每次都这样做的方式。
我在管道的开头创建了一个哈希表,并使用 .Add() 方法将管道内的键/值对添加到此哈希表。
之后,我通过将 hashtbale 传递给 New-Object 的 -Property 参数来创建一个 psobject。
这给了我想要的结果。
Get-Process | Sort -Unique Name | ForEach-Object -Begin { $ht = @{} } -Process {
# DO STUFF
$key = $_.Name
$val = $_.Id
# Add Entry to Hashtable
$ht.Add($key,$val)
}
# Create PSObject from Hashtable
$myAwesomeNewObject = New-Object psobject -Property $ht
# Done - returns System.Management.Automation.PSCustomObject
$myAwesomeNewObject.GetType().FullName
但这看起来有点笨拙,有没有更优雅的方法呢?
像这样:
[PSObject]$myAwesomeNewObject = Get-Process | Sort -Unique Name | ForEach-Object -Process {
# DO STUFF
$key = $_.Name
$val = $_.Id
# return Key/Val Pair
@{$key=$val}
}
# Failed - returns System.Object[]
$myAwesomeNewObject.GetType().FullName
不幸的是,这不起作用,因为管道返回了一个哈希表数组,但我希望你现在知道我正在努力实现什么。
谢谢
最佳答案
不确定这是否更优雅,但只是另一种方式,它使用匿名函数,因此 $ht
在执行后将不再可用,并转换为 [pscustomobject]
而不是使用 New-Object
:
[pscustomobject] (Get-Process | Sort -Unique Name | & {
begin { $ht = @{ } }
process {
# DO STUFF
$key = $_.Name
$val = $_.Id
# Add Entry to Hashtable
$ht.Add($key, $val)
}
end { $ht }
})
关于Powershell 管道 - 返回一个在管道内创建的新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74495144/