2011-12-16 37 views
13

Về cơ bản tôi có mã này:Có tương đương với "điều này" trong PowerShell không?

$file = $web.GetFile("Pages/default.aspx") 
$file.CheckOut() 

và tôi đã tự hỏi nếu có anyway là sử dụng một đường ống và tương đương powershell của this để viết lại nó như:

$web.GetFile("Pages/default.aspx") | $this.CheckOut() 

Khi tôi cố gắng tôi này nhận được lỗi:

Expressions are only allowed as the first element of a pipeline.

tôi cũng đã cố gắng sử dụng $_ thay vì $this nhưng có cùng lỗi.

+1

Câu hỏi hay, Abe! Điều này bit cho tôi một vài lần khi tôi lần đầu tiên bắt đầu rối tung xung quanh với PS. – JNK

Trả lời

12

Điều bạn đang tìm kiếm là $_ và nó đại diện cho đối tượng hiện tại trong đường ống. Tuy nhiên bạn chỉ có thể truy cập vào $_ trong một scriptblock của một lệnh mà sẽ đưa đường ống đầu vào ví dụ:

$web.GetFile("Pages/default.aspx") | Foreach-Object -Process {$_.Checkout()} 

Tuy nhiên có một bí danh cho lệnh Foreach-Object {Foreach và%} và -Process là tham số mặc định vì vậy đây có thể được đơn giản hóa để:

$web.GetFile("Pages/default.aspx") | Foreach {$_.Checkout()} 

một điểm khác, cuộc gọi getfile dường như trở về một tập tin duy nhất như vậy trong trường hợp này, sau đây sẽ là cách dễ nhất để đi:

$web.GetFile("Pages/default.aspx").Checkout() 

Tất nhiên, tại thời điểm này bạn không còn có một biến chứa đối tượng tập tin.

1

$_ là biến cho "đối tượng hiện tại" trong PowerShell.

Tuy nhiên, bạn không chuyển bất kỳ dữ liệu nào, đây chỉ là nhiệm vụ thay đổi. Bạn chỉ có thể sử dụng đường ống nếu bạn thao tác đầu ra thực của lệnh và sử dụng nó làm đầu vào xuống đường ống.

Tôi nghĩ rằng những gì bạn muốn có thể được thực hiện với dấu ngoặc lồng nhau:

($web.GetFile("Pages/default.aspx")).CheckOut()

Trong PS, bất cứ điều gì bạn đặt dấu ngoặc đơn bên được coi là đối tượng của riêng mình, và bạn có thể áp dụng phương pháp để inline rằng nếu không có biến tái chỉ định.

10

Thực tế, có $ this trong một vài trường hợp. Bạn có thể tạo một ScriptProperty hoặc ScriptMethod và đính kèm nó vào một đối tượng và $ this sẽ là đối tượng gốc. Sau đó bạn có thể định nghĩa các tệp này trong các loại tệp (tôi khuyên bạn nên sử dụng mô-đun EZOut, nó giúp cuộc sống trở nên dễ dàng hơn nhiều) để bất kỳ khi nào bạn thấy loại đó, bạn sẽ có được phương thức đó.

Ví dụ:

$Web | Add-Member ScriptMethod EditFile { $this.Checkout() } 

Hope this helps

0

Chuyển nhượng không im lặng đầu ra mặc định, nhưng nó không ngăn cản một đối tượng từ đang được tham chiếu thêm.

($file = $web.GetFile("Pages/default.aspx")).CheckOut() 

Tất nhiên, đó là phổ biến hơn nhiều để hai cửa hàng giá trị trả về trong một biến và làm mọi thứ với nó hay chuỗi các phương pháp/tài sản/ống.

Các vấn đề liên quan