管道到PowerShell中的对象/属性/方法

管道到PowerShell中的对象/属性/方法,powershell,piping,Powershell,Piping,在PowerShell中,可以通过管道导入cmdlet和脚本函数。但是否可以将管道引入对象、属性或成员函数 例如,如果我有一个数据库连接对象$dbCon,我希望能够这样: $dbCon.GetSomeRecords() | <code-to-manipulate-those-records | $dbCon.WriteBackRecords() 并获得 得到1个 得到2个 得到3个 结果呢。但当我尝试将该技术与脚本化方法结合使用时: $object=New-Object System.

在PowerShell中,可以通过管道导入cmdlet和脚本函数。但是否可以将管道引入对象、属性或成员函数

例如,如果我有一个数据库连接对象
$dbCon
,我希望能够这样:

$dbCon.GetSomeRecords() | <code-to-manipulate-those-records | $dbCon.WriteBackRecords()
并获得

得到1个
得到2个
得到3个

结果呢。但当我尝试将该技术与脚本化方法结合使用时:

$object=New-Object System.Object
$object|Add-Member -MemberType ScriptMethod -Name ScriptedMethod -Value {$input|foreach{"Got "+$_}}
1,2,3|$object.ScriptedMethod

我收到一条错误消息:
表达式只允许作为管道的第一个元素。
(添加()无助于BTW)。我要寻找的是一种使该命令与全局函数的工作方式相同的方法。

如果我遵循,您可以使用Add-Member cmdlet将新的脚本方法附加到现有对象(请参阅帮助中的示例代码#4)。您还可以将它们添加到类型文件(xml)中,并使用Update-TypeData cmdlet加载该文件,以便当您手头有特定类型的对象时,它们会自动可用

更新

您不能将管道连接到方法。您添加的方法在对象上可用:

function ScriptedFunction
{
    process
    {
        $object = $_
        $object = $object | Add-Member -MemberType ScriptMethod -Name Increment -Value {$this+1} -PassThru -Force
        $object
    }
}

$newObjects = 1,2,3 | ScriptedFunction 
# increment the first object, its value is one, when the 
# Incereent method is invoked you get 2
$newObjects[0].Increment() 

2

这并不完全是您所要求的,但其语法几乎相同:使用NoteProperty而不是ScriptedMethod,并使用运算符调用它
&

$object = New-Object System.Object
$object | Add-Member -MemberType NoteProperty -Name Script -Value {$input|foreach{"Got "+$_}}
1,2,3 | & $object.Script
输出

Got 1
Got 2
Got 3

但是:
这里有一个警告,也许是一个显示障碍:这根本不是一个脚本方法,它的核心将不会为它定义
$this
(您可以在调用之前定义
$this=$object
,但这相当难看,将
$object
作为参数发送会更好)。

这不是我想要的。我在问题中添加了一个例子来澄清这一点。对不起,我想将内容导入方法,而不是将方法导入对象。不过,谢谢你的努力!我更新了线程,看看它现在是否有用。这是一个相当大的“但是”-我想管道到对象的主要原因是,我可以在管道中使用它们的状态。也许如果我使用
NoteProperty
作为包装,我可以做一些小改动:将对象存储在某个全局字典中,让NoteProperty的命令使用对象的键(它只是文本,可以存储在NoteProperty中)获取对象,并将其与输入一起传递给实函数。然后我就可以把一切都隐藏在自动化的东西后面。不过,我还是更喜欢一种不太老套的方法……是的,这是一个很大的“但是”。但看起来你必须在“但是”之间做出选择。。。因此,您必须从中选择的“但是”越多越好:)
Got 1
Got 2
Got 3