about_Object_Creation

简短说明

介绍如何在 PowerShell 中创建对象。

长说明

可以在 PowerShell 中创建对象,并使用在命令和脚本中创建的对象。

可通过多种方式创建对象,此列表并不明确:

  • New-Object:创建.NET Framework对象或 COM 对象的实例。
  • Import-Csv/ConvertFrom-CSV:从定义为字符分隔值的项 (PSCustomObject) 创建自定义对象。
  • ConvertFrom-Json:创建在 JavaScript 对象表示法中定义的自定义对象 (JSON) 。
  • ConvertFrom-StringData:创建定义为键值对的自定义对象。
  • Add-Type:允许在 PowerShell 会话中定义可以使用 实例化的 New-Object类。
  • New-ModuleAsCustomObject 参数创建使用脚本块定义的自定义对象。
  • Add-Member:向现有对象添加属性。 可以使用 Add-Member 从简单类型(如 ) [System.Int32]创建自定义对象。
  • Select-Object:选择对象的属性。 可以使用 Select-Object 在已实例化的对象上创建自定义属性和计算属性。

本文介绍以下其他方法:

  • 通过使用静态 new() 方法调用类型的构造函数
  • 通过类型转换属性名称和属性值的哈希表

静态新 () 方法

所有 .NET 类型都有一个 new() 方法,可用于更轻松地构造实例。 还可以查看给定类型的所有可用构造函数。

若要查看类型的构造函数,请在类型名称后new指定方法名称,然后按 。<ENTER>

[System.Uri]::new
OverloadDefinitions
-------------------
uri new(string uriString)
uri new(string uriString, bool dontEscape)
uri new(uri baseUri, string relativeUri, bool dontEscape)
uri new(string uriString, System.UriKind uriKind)
uri new(uri baseUri, string relativeUri)
uri new(uri baseUri, uri relativeUri)

现在,可以通过指定适当的构造函数来创建 System.Uri

[System.Uri]::new("https://www.bing.com")
AbsolutePath   : /
AbsoluteUri    : https://www.bing.com/
LocalPath      : /
Authority      : www.bing.com
...

可以使用以下示例来确定当前加载的 .NET 类型以供实例化。

[AppDomain]::CurrentDomain.GetAssemblies() |
  ForEach-Object {
    $_.GetExportedTypes() |
      ForEach-Object { $_.FullName }
  }

使用 new() 方法创建的对象的属性可能与 PowerShell cmdlet 创建的同一类型的对象不同。 PowerShell cmdlet、提供程序和扩展类型系统可以向实例添加额外的属性。

例如,PowerShell 中的 FileSystem 提供程序将六个 NoteProperty 值添加到 由 Get-Item返回的 DirectoryInfo 对象。

$PSDirInfo = Get-Item /
$PSDirInfo | Get-Member | Group-Object MemberType | Select-Object Count, Name
Count Name
----- ----
    4 CodeProperty
   13 Property
    6 NoteProperty
    1 ScriptProperty
   18 Method

直接创建 DirectoryInfo 对象时,它没有这六个 NoteProperty 值。

$NewDirInfo = [System.IO.DirectoryInfo]::new('/')
$NewDirInfo | Get-Member | Group-Object MemberType | Select-Object Count, Name
Count Name
----- ----
    4 CodeProperty
   13 Property
    1 ScriptProperty
   18 Method

有关扩展类型系统的详细信息,请参阅 about_Types.ps1xml

此功能已在 PowerShell 5.0 中添加

从哈希表Create对象

可以从属性和属性值的哈希表创建对象。

语法如下所示:

[<class-name>]@{
  <property-name>=<property-value>
  <property-name>=<property-value>
}

此方法仅适用于具有无参数构造函数的类。 对象属性必须是公共且可设置的。

PowerShell 版本 3.0 中添加了此功能

从哈希表Create自定义对象

自定义对象非常有用,使用哈希表方法可以轻松创建。 PSCustomObject 类是专门为此目的设计的。

自定义对象是从函数或脚本返回自定义输出的好方法。 这比返回无法重新格式化或通过管道传递给其他命令的格式化输出更有用。

中的 Test-Object function 命令设置一些变量值,然后使用这些值创建自定义对象。 可以在 cmdlet 帮助主题的示例部分中 Update-Help 看到正在使用的此对象。

function Test-Object {
  $ModuleName = "PSScheduledJob"
  $HelpCulture = "en-us"
  $HelpVersion = "3.1.0.0"
  [PSCustomObject]@{
    "ModuleName"=$ModuleName
    "UICulture"=$HelpCulture
    "Version"=$HelpVersion
  }
  $ModuleName = "PSWorkflow"
  $HelpCulture = "en-us"
  $HelpVersion = "3.0.0.0"
  [PSCustomObject]@{
    "ModuleName"=$ModuleName
    "UICulture"=$HelpCulture
    "Version"=$HelpVersion
  }
}
Test-Object

此函数的输出在默认情况下是格式化为表的自定义对象集合。

ModuleName        UICulture      Version
---------         ---------      -------
PSScheduledJob    en-us          3.1.0.0
PSWorkflow        en-us          3.0.0.0

用户可以如同标准对象一样管理自定义对象的属性。

(Test-Object).ModuleName
 PSScheduledJob
 PSWorkflow

PSObject 类型对象按照成员添加到对象的顺序维护成员列表。 即使 Hashtable 对象不保证键值对的顺序,将文本哈希表 [pscustomobject] 强制转换为维护顺序。

哈希表必须是文本。 如果将哈希表包装在括号中,或者强制转换包含哈希表的变量,则无法保证保留顺序。

$hash = @{
    Name      = "Server30"
    System    = "Server Core"
    PSVersion = "4.0"
}
$Asset = [pscustomobject]$hash
$Asset
System      Name     PSVersion
------      ----     ---------
Server Core Server30 4.0

从哈希表中Create非自定义对象

还可以使用哈希表为非自定义类创建对象。 为非自定义类创建对象时,需要命名空间限定的类型名称,但可以省略任何初始 系统 命名空间组件。

例如,以下命令会创建一个会话选项对象。

[System.Management.Automation.Remoting.PSSessionOption]@{
  IdleTimeout=43200000
  SkipCnCheck=$True
}

哈希表功能的要求(尤其是无参数构造函数要求)消除了许多现有类。 但是,大多数 PowerShell 选项 类都设计为使用此功能,以及其他非常有用的类,如 ProcessStartInfo 类。

[System.Diagnostics.ProcessStartInfo]@{
  CreateNoWindow="$true"
  Verb="run as"
}
Arguments               :
ArgumentList            : {}
CreateNoWindow          : True
EnvironmentVariables    : {OneDriveConsumer, PROCESSOR_ARCHITECTURE,
                           CommonProgramFiles(x86), APPDATA...}
Environment             : {[OneDriveConsumer, C:\Users\user1\OneDrive],
                           [PROCESSOR_ARCHITECTURE, AMD64],
                           [CommonProgramFiles(x86),
                           C:\Program Files (x86)\Common Files],
                           [APPDATA, C:\Users\user1\AppData\Roaming]...}
RedirectStandardInput   : False
RedirectStandardOutput  : False
RedirectStandardError   : False
...

设置参数值时,也可以使用哈希表功能。 例如,的 SessionOption 参数 New-PSSession的值。 cmdlet 可以是哈希表。

New-PSSession -ComputerName Server01 -SessionOption @{
  IdleTimeout=43200000
  SkipCnCheck=$True
}
Register-ScheduledJob Name Test -FilePath .\Get-Inventory.ps1 -Trigger @{
  Frequency="Daily"
  At="15:00"
}

泛型对象

还可以在 PowerShell 中创建泛型对象。 泛型是为所存储或使用的一个或多个类型具有占位符(类型形参)的类、结构、接口和方法。

以下示例创建 Dictionary 对象。

$dict = New-Object 'System.Collections.Generic.Dictionary[String,Int]'
$dict.Add("One", 1)
$dict
Key Value
--- -----
One     1

有关泛型的详细信息,请参阅 .NET 中的泛型

另请参阅