2011-10-03 2 views
3

PowerShell에서 Cmdlet 및 스크립팅 된 함수로 파이프 할 수 있습니다. 그러나 객체, 속성 또는 멤버 함수로 파이프 할 수 있습니까? 나는 데이터베이스 연결 개체 $dbCon이있는 경우PowerShell의 개체/속성/메서드로 파이핑

예를 들어, 나는 할 수 있도록하려면 너무 이런 식으로 뭔가 :

$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 도움이되지 않습니다 추가). 내가 찾고있는 것은 명령이 전역 함수와 동일한 방식으로 작동하도록하는 방법입니다.

+0

스레드를 업데이트하여 지금 도움이되는지 확인하십시오. –

답변

3

이것은 당신이 요구되지만이 거의 같은 구문이 정확히되지 않습니다

$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을 보내면 더 좋을 것입니다.)

+0

그건 꽤 큰 "but"입니다. 제가 물체 안으로 파이프를 연결하고자하는 주된 이유는 배관에서 그들의 상태를 사용할 수 있기 때문입니다. 어쩌면 내가'NoteProperty'를 래퍼로 사용했다면 약간의 해킹을 할 수 있습니다 : 전역 사전에 객체를 저장하고, NoteProperty의 명령이 그 키를 사용하여 객체를 가져 오도록합니다 (텍스트만으로도 NoteProperty) 입력과 함께 실제 함수에 전달합니다. 그런 다음 자동화 나 무언가의 모든 것을 숨길 수 있습니다. 여전히 덜 익숙한 접근 방식을 선호합니다 ... –

+1

예, 큰 "but"입니다. 그러나 당신은 "buts"... 중에서 선택해야하는 것처럼 보입니다. 그래서 더 "buts"를 선택해야합니다. –

0

내가 따르는 경우 Add-Member cmdlet을 사용하여 새 스크립트 메서드를 기존 개체에 추가 할 수 있습니다 (도움말의 예제 코드 4 참조). 또한 형식 파일 (xml)에 추가하고 Update-TypeData cmdlet을 사용하여 파일을로드하면 특정 유형의 개체가있을 때 자동으로 사용할 수있게됩니다.

업데이트

메서드로 파이프 할 수 없습니다. 추가 방법은 객체에 avaiable이다 같습니다 ScriptedMethod 대신 NoteProperty을 사용 사업자 . 또는 &를 사용하여 전화 :

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 
+0

그건 내가 원한 것이 아니야. 질문에 예제를 추가하여 명확히했습니다. –

+0

미안하지만, 메서드에 파이프를 사용하여 메서드에 파이프를 연결하지 않고 개체에 파이프로 전달하려고합니다. 아직도 노력에 감사드립니다! –