在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.
(adding()无法帮助BTW)。我正在寻找的方法是使该命令的工作方式与使用全局函数的方式相同。
答案 0 :(得分: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
<强> BUT:强>
有一个警告,也许是一个显示停止:这根本不是一个脚本方法,核心不会为它定义$this
(您可以在调用之前定义$this = $object
,但这是相当的难看,发送$object
作为参数会更好。)
答案 1 :(得分:0)
如果我关注,您可以使用Add-Member cmdlet附加新脚本方法以退出对象(请参阅帮助中的示例代码#4)。您还可以将它们添加到Type文件(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