Powershell 管道 - 返回一个在管道内创建的新对象

标签 powershell hashtable psobject pscustomobject

我再次遇到同样的问题,我有我的默认处理方式,但它一直困扰着我。
有没有更好的办法?

所以基本上我有一个运行的管道,在管道内做一些事情,并想从管道内返回一个键/值对。
我希望整个管道返回一个类型为 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/

相关文章:

data-structures - 如何找到搜索哈希表所需的最大和最小时间?

Python 日期哈希表

powershell - 如何在 PowerShell 自定义 PSObject 上使用 GetType().GetProperties()?

powershell - 方法调用失败 op_addition

sql - 使用PowerShell将Windows用户添加到本地SQL Server

sql-server - Invoke-Sqlcmd、InputFile 和变量

powershell - 有没有办法通过自定义 System.Management.Automation.ErrorRecord 抛出?

java - 使用哈希表作为集合的一般目的是什么?

powershell - 为管道重用自定义对象时出现意外结果

powershell - Set-MsmqQueueACL - 允许 - 不能按照文档使用列表?