2011-10-03 18 views
3

在PowerShell中,您可以管理Cmdlet和腳本功能。但是,是否可以管入對象,屬性或成員函數?在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.(添加()不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 

但是: 有一個警告,可能是一個表演塞子:這根本不是一個腳本方法,它不會有核心定義的$this(你可以在自己調用之前定義$this = $object,但這很難看,作爲參數發送$object會更好)。

+0

這是一個相當大的「但」 - 我想將物體放入物體的主要原因是我可以在他們的管道中使用它們的狀態。 也許如果我使用'NoteProperty'作爲包裝器,我可以做一些小技巧:將對象存儲在某個全局字典中,使NoteProperty的命令使用它的關鍵字獲取對象(只是文本,可以存儲在NoteProperty )並將其與輸入一起傳遞給實際函數。然後我可以隱藏一切自動化或其他東西。 儘管如此,我寧願採取一種不太冒險的方法...... –

+1

是的,這是一個很大的「但」。但它看起來像你必須在「buts」之間進行選擇......所以你必須從更好的選擇中選擇更多的「buts」:) –

0

如果我正在關注,可以使用Add-Member cmdlet將新腳本方法附加到退出對象(請參閱幫助中的示例代碼#4)。您還可以將它們添加到Type文件(xml)中,並使用Update-TypeData cmdlet加載該文件,以便在手邊有特定類型的對象時它們將自動變爲可用。

UPDATE

您不能管道到方法。添加方法是繳費的對象:

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

對不起,但我想將東西傳入方法中,而不是將方法傳遞給對象。 不過,謝謝你的努力! –