9

最新版本的 Powershell 是否有能力做类似 JavaScript 的事情:

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

如果不是,等效或解决方法是什么?

更新
阅读所有评论

4

6 回答 6

13

通过 add-member cmdlet 的功能不直接支持语法。不久前,我将此功能包装在一个通用的元组函数中。

这将使您能够在一行中创建这些对象。

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

这是新元组的代码

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
} 

关于该主题的博客文章:http: //blogs.msdn.com/jaredpar/archive/2007/11/29/tuples-in-powershell.aspx#comments

于 2009-03-13T22:20:56.213 回答
12

对于简单的方法,首先是一个哈希表(在 V1 中可用)

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

其次,是一个 PSObject(在 V2 中更容易)

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

它为您提供大致相同的对象,但如果您想对它们进行排序/分组/格式化/导出,psobjects 会更好

于 2009-06-12T04:31:14.980 回答
5

抱歉,即使选择的答案很好,我也无法抗拒 hacky 的一行答案:

New-Object PsObject | Select-Object x,y | %{$_.x = 12; $_.y = 50; $foo = $_; }
于 2009-03-16T13:50:02.200 回答
3

你可以这样做:

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

关于您在其他地方的评论之一,自定义对象可能比哈希表更有用,因为它们与期望对象具有命名属性的 cmdlet 一起工作得更好。例如:

$mypoints | Sort-Object y   # mypoints sorted by y-value
于 2009-03-14T02:12:30.370 回答
3

如何在 PowerShell 中创建对象
http://blogs.msdn.com/powershell/archive/2009/03/11/how-to-create-an-object-in-powershell.aspx

于 2009-03-14T20:21:31.993 回答
0
$point = "" | Select @{Name='x'; Expression={12}} ,@{Name='y'; Expression={15}}

或更直观地

$point = "" | Select x,y
$point.x=12; $point.y=15
于 2012-02-13T11:37:05.747 回答