2009-03-13 21 views
9

Liệu phiên bản mới nhất của Powershell có khả năng để làm điều gì đó như của JavaScript:Struct hoặc đối tượng trong Powershell 2

var point = new Object(); 
point.x = 12; 
point.y = 50; 

Nếu không, những gì là tương đương hoặc workaround?

CẬP NHẬT
Đọc tất cả các ý kiến ​​

Trả lời

13

Cú pháp không được hỗ trợ trực tiếp bởi các chức năng là có thông qua cmdlet của add-thành viên. Trong khi đó, tôi đã bọc chức năng này trong một chức năng tuple mục đích chung.

Điều này sẽ cho bạn khả năng tạo một dòng đối tượng này.

$point = New-Tuple "x",12,"y",50 

Đây là mã cho New-tuple

function New-Tuple() 
{ 
    param ([object[]]$list= $(throw "Please specify the list of names and values")) 

    $tuple = new-object psobject 
    for ($i= 0 ; $i -lt $list.Length; $i = $i+2) 
    { 
     $name = [string]($list[$i]) 
     $value = $list[$i+1] 
     $tuple | add-member NoteProperty $name $value 
    } 

    return $tuple 
} 

Blog Post về đề tài này: http://blogs.msdn.com/jaredpar/archive/2007/11/29/tuples-in-powershell.aspx#comments

+0

+1 Tôi thích điều này. Bạn biết đấy ... trước khi tôi hỏi điều này, tôi nên nghĩ về việc sử dụng một Powershell hashtable. Nhưng cách tiếp cận rất mát mẻ. – BuddyJoe

+0

Cảm ơn. Chỉ cần làm một số đọc trên psobject, thêm thành viên, NoteProperty ... thứ mát mẻ. Đã học một điều gì đó ngày hôm nay :) – BuddyJoe

+0

Nếu bạn được insterested trong 'Tuple' bạn có thể đọc [câu trả lời này] (http://stackoverflow.com/questions/5882187/how-use-system-tuple-in-powershell/5885531#5885531) . Nó ở trên cùng của CLR 4.0. – JPBlanc

3

Bạn có thể làm điều đó như thế này:

$point = New-Object Object | 
    Add-Member NoteProperty x ([int] 12) -passThru | 
    Add-Member NoteProperty y ([int] 15) -passThru 

Về một trong những ý kiến ​​của bạn ở nơi khác, các đối tượng tùy chỉnh có thể hữu ích hơn các bảng băm vì chúng hoạt động tốt hơn w Lệnh ghép ngắn thứ i mong đợi các đối tượng có các thuộc tính được đặt tên. Ví dụ:

$mypoints | Sort-Object y # mypoints sorted by y-value 
3

thế nào để tạo một đối tượng trong PowerShell
http://blogs.msdn.com/powershell/archive/2009/03/11/how-to-create-an-object-in-powershell.aspx

+0

Có, James cho chúng ta hầu hết các câu trả lời. Có một tùy chọn đơn giản khác cho các lớp chỉ là các túi thuộc tính: $ Object = "" | Chọn Prop1, Prop2, Prop3 – JasonMArcher

+1

Ngoài ra còn có chức năng này chuyển đổi một hashtable thành một đối tượng: http://powershell.com/cs/blogs/tips/archive/2008/11/14/converting-hash-tables-to- các đối tượng.aspx – JasonMArcher

+0

@JasonMArcher: Tôi đã +1 câu trả lời nhưng thực sự có ý nghĩa để đăng mẹo của bạn - đối với tôi, nó được đánh giá cao hơn chấp nhận và tôi đã sử dụng nó. Bây giờ, hãy tìm một bài đăng khác của bạn để +1! –

5

Xin lỗi, mặc dù câu trả lời được lựa chọn là tốt, tôi không thể cưỡng lại sự một dòng hacky câu trả lời:

New-Object PsObject | Select-Object x,y | %{$_.x = 12; $_.y = 50; $foo = $_; } 
+0

Cá nhân tôi thích cú pháp đa khớp: ... | % {$ _. x, $ _. y, $ foo = 12,50, $ _} – stej

9

Đối với những cách đơn giản, đầu tiên, là một hashtable (có sẵn trong V1)

$obj = @{} 
$obj.x = 1 
$obj.y = 2 

Thứ hai, là một PSObject (dễ dàng hơn trong V2)

$obj = new-object psobject -property @{x = 1; y =2} 

Nó cung cấp cho bạn khoảng cùng một đối tượng, nhưng psobjects là đẹp hơn nếu bạn muốn sắp xếp/nhóm/định dạng/xuất khẩu chúng

+0

Câu trả lời rất hay. +1 – BuddyJoe

0
$point = "" | Select @{Name='x'; Expression={12}} ,@{Name='y'; Expression={15}} 

hoặc trực quan hơn

$point = "" | Select x,y 
$point.x=12; $point.y=15