3

PowerShellでは、コマンドレットとスクリプト化された関数にパイプできます。しかし、オブジェクト、プロパティ、またはメンバー関数にパイプすることは可能ですか?

たとえば、データベース接続オブジェクトがある場合$dbCon、次のようなことができるようにしたいと思います。

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

オブジェクトを引数として取得するコマンドレットを使用して、または使用して同じ機能を実現できることを知ってForeach-Objectいます-オブジェクトまたはそのメンバーに直接パイプしたい理由は、エレガンスを実現し、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.(()を追加しても効果はありません)。私が探しているのは、そのコマンドをグローバル関数と同じように機能させる方法です。

4

2 に答える 2

3

これはあなたが求めているものとは正確には異なりますが、構文はほぼ同じです。ScriptedMethodの代わりにNotePropertyを使用し、演算子.または&:を使用して呼び出します。

$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コマンドレットを使用して既存のオブジェクトに新しいスクリプトメソッドをアタッチできます(ヘルプのサンプルコード#4を参照してください)。それらをタイプファイル(xml)に追加し、Update-TypeDataコマンドレットを使用してファイルをロードして、特定のタイプのオブジェクトが手元にあるときに自動的に使用できるようにすることもできます。

アップデート

メソッドにパイプすることはできません。追加するメソッドは、オブジェクトで使用できます。

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 に答える