3

在 PowerShell 中,您可以通过管道进入 Cmdlet 和脚本函数。但是有可能通过管道传递到对象、属性或成员函数中吗?

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

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

我知道可以使用Foreach-Object或使用获取对象作为参数的 Cmdlet 来实现相同的功能 - 我想直接通过管道传递到对象或其成员的原因是为了实现优雅并保持 OOP 风格(使用对象的方法而不是将对象作为参数发送)

可能吗?


编辑:

看起来人们不理解我的问题,所以我需要澄清一下:

PowerShell 可以通过管道传输到正常功能。我可以写:

function ScriptedFunction
{
    $input|foreach{"Got "+$_}
}
1,2,3|ScriptedFunction

并得到 结果。但是当我尝试通过脚本方法使用该技术时:
Got 1
Got 2
Got 3

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

我收到一条错误消息:(Expressions are only allowed as the first element of a pipeline.添加 () 对 BTW 没有帮助)。我正在寻找的是一种使该命令以与全局函数相同的方式工作的方法。

4

2 回答 2

3

这不完全是您所要求的,但这具有几乎相同的语法:使用 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作为参数发送会会更好)。

于 2011-10-03T14:55:00.537 回答
0

如果我在关注,您可以使用 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
于 2011-10-03T13:43:21.287 回答