PowerShell 定义 PowerShell 对象

3

我喜欢以结构化的方式定义我的变量。然而,大多数MSDN博客并没有这样做。

例如: [object]myObj = ...

这是PowerShell中所有对象的正确默认格式吗?

6个回答

9

使用 PsObject,可以这样做:

$o = new-Object PsObject -property @{Name='donald'; Kind='duck' }

您可以将一个哈希表作为-property参数的参数传递。您也可以创建一个空对象,稍后再添加属性:
$o = New-Object PsObject
$o | Add-Member NoteProperty project myproj.csproj
$o | Add-Member NoteProperty Success $true

当然,您可以使用管道将Add-Member添加到命令中。

$o = New-Object PsObject
# ...
$o | 
   Add-Member NoteProperty project myproj.csproj -pass |
   Add-Member NoteProperty Success $true

2
快捷方式:$O = [PSCustomObject] @{Name = 'Donald'; Kind='Duck'},从Powershell v3开始(blogs.msdn.com/b/powershell/archive/2012/06/14/new-v3-language-features.aspx),在“新转换”部分开始。 - tkokasih

2
如果我理解问题的意思,您正在询问以下几个问题:
  1. 您能明确指定变量的类型吗?
  2. 如果您没有明确指定类型,PowerShell会使用什么类型?
PowerShell肯定允许您明确指定类型,但它也会推断类型。请注意,由于所有类型都继承自System.Object,在组合声明/赋值语句中明确指定[object]没有任何价值。类型系统仍将推断出适当的子类型。例如:
$x = 3
$x.GetType() # Returns 'Int32'

Remove-Variable x
[object] $x = 3
$x.GetType() # Returns 'Int32'

Remove-Variable x
[valuetype] $x = 3
$x.GetType() # Returns 'Int32'

Remove-Variable x
[int] $x = 3
$x.GetType() # Returns 'Int32'

如果将声明和赋值拆分开来,你可以创建一个类型为Object的变量:
Remove-Variable x
$x = new-object -TypeName Object
$x.GetType() # Returns 'Object'

但一旦您为变量赋值,该变量将自动获得新的推断类型:

$x = 3
$x.GetType() # Returns 'Int32'

在指定为Object时,类型系统会很高兴地推断出Int32,但当推断出的类型不兼容时,显式类型会胜出。例如:

$x = 3          # Gets inferred type 'Int32'
[string] $x = 3 # Gets explicit type 'String'

$x = 'x'        # Gets inferred type 'String'
[char] $x = 'x' # Gets explicit type 'Char'

如果您的问题更关注定义和使用自定义对象类型,Stej的回答非常出色。

在你的例子中,你并没有真正地分开声明和赋值。$x = new-object -TypeName Object 是一个赋值语句。而 $x.GetType() 返回该值的类型。 - mcoolive

1

自PowerShell 3以来,也可以将哈希表解析为自定义对象,例如:

[PSObject] $Piza = [PSCustomObject] @{
    Ingredients = 4
}

如果您希望在对象中定义更详细的类型,可以使用New-Module的-AsCustomObject参数。

[PSObject] $Piza = New-Module -AsCustomObject -ScriptBlock {
    [Guid]$id = [Guid]::NewGuid()
    [String] $Name = 'Macaroni' 

    Function TestFunction() {}

    # Dont forget to export your members and functions 
    # as this is built up as a module and stuffed into 
    # an object later
    Export-ModuleMember -Function * -Variable *
}

由于PowerShell中没有类的概念,您可以向对象添加自定义类名和命名空间,以便稍后查询(伪实例;)
$Piza.PSObject.TypeNames.Insert(0, 'Pizas.Macaroni')

0

您还可以像这样创建快速对象:

$myVar = "" | select column1, column2, column3

这将创建一个具有 3 个 NoteProperties 的对象,您可以像正常访问属性一样访问每个属性

$myVar.column1

注意,这里使用的是Selecte.System.String而不是System.Management.Automation.PSCustomObject。

仍然足够保留数据行、导出和访问数据单元格。

更新:更灵活的解决方案,仍然易于实现,可以创建如下的Hashtable。

$myVar2 = @{

column1=value1

column2=value2

column3=value3

}

这将创建一个类型为System.Collections.Hashtable的变量

带有一些不错的方法

敬礼 hermitagup


0

创建PSObject对象是从脚本语言访问所有对象的基础,并为cmdlet开发人员提供抽象。

它在不同版本的PowerShell中有所不同。

New-Object PSObject -Property [HashTable]


     $Object = New-Object PSObject`                                       
     $Object | add-member Noteproperty LineNumber       $LineNumber                 
     $Object | add-member Noteproperty Date             $TodayDate       

0

如果我正确理解你的问题,你正在问

  • 如何在PowerShell中创建自定义对象?

在PowerShell中,可以使用New-Object创建一个.Net对象的实例。像这样

$ie = New-Object -ComObject InternetExplorer.Application
$ie.Navigate2("http://stackoverflow.com/")
$ie.Visible = $true

上面的代码创建了一个 COM 对象,它可以将您的 IE 导航到 StackOverflow。
如果您想要创建自己的对象,PSObject 将是您的选择。就像下面这样。
$obj = New-Object PSObject -Property @{
    Name = "Your Name"
    Age = 30
}

当您使用"$obj"调用对象时

$obj
Age Name
--- ----
30 Your Name

如果您正在使用 PowerShell 3.0,您可以像下面这样少打字并获得相同的结果。
[PSCustomObject] @{
    Name = "Your Name"
    Age = 30
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接