2016-08-19 33 views
5

Tôi đang cố gắng hiểu cách pipe | một đối tượng và gọi các thuộc tính hoặc phương pháp trên đó.Gọi thuộc tính/phương thức trên đối tượng đường ống

Ex: 
$a = Get-Item Registry::HKLM\SOFTWARE\WOW6432Node\Microsoft\Test\abc\ 
$a.GetSomething() //calls the method 
(Get-Item Registry::HKLM\SOFTWARE\WOW6432Node\Microsoft\Test\abc\).GetSomething() //calls the method 

Tôi có thể tạo đầu ra của Get-Iteminvoke properties/methods trên đó không?

Get-Item Registry::HKLM\SOFTWARE\WOW6432Node\Microsoft\Test\abc\ | call GetSomething() 

Trả lời

1

Câu trả lời sắp xếp là không. Bạn không thể gọi một phương thức như thế này bằng Pipeline. Nhưng bạn có thể bao quanh Get-Item invoke của bạn trong dấu ngoặc đơn và gọi nó:

(Get-Item Registry::HKLM\SOFTWARE\WOW6432Node\Microsoft\Test\abc\).GetSomething() 

Nếu bạn không muốn điều đó, bạn có thể lạm dụng Select-Object cmdlet:

Get-Item Registry::HKLM\SOFTWARE\WOW6432Node\Microsoft\Test\abc\ | select { $_.GetSomething() } 
+1

Đó là buồn. Hãy tưởng tượng tôi không chắc chắn về 'Reg key' hoặc' Folder' tồn tại hay không. Tôi cứ tiếp tục sử dụng 'tab' để tôi có thể đặt nơi tôi muốn sử dụng' auto-suggestion' và gọi một cái gì đó ngay bây giờ, đột nhiên tôi phải quấn nó ngay từ đầu có thể gọi một phương thức. Nó thực sự đau đớn – Reddy

+1

Cách kinh điển sẽ là 'ForEach-Object'. Nó có thể được viết khá ngắn gọn bằng cách sử dụng bí danh '%': '... | % {$ _. method()} ' –

0

Đó là không thể không viết một cái gì đó để làm cho nó như vậy. Cái gì đó sẽ khá khó hiểu.

Như thế này.

filter Invoke-Method { 
    param(
     [String]$Method, 

     [Object[]]$ArgumentList 
    ) 

    $_.GetType().InvokeMember(
     $Method.Trim(), 
     ([System.Reflection.BindingFlags]'InvokeMethod'), 
     $null, 
     $_, 
     $ArgumentList 
    ) 
} 
"qwerty" | Invoke-Method Replace 'q', 'z' 

Thuộc tính được dễ dàng hơn trong đó có đã là một lệnh để làm điều đó:

(...).GetSomething() | Select-Object Property1, Property2 
Các vấn đề liên quan