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() 方法调用类型的构造函数
  • 通过键入属性名称和属性值的哈希表

Static 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 提供程序向由该对象返回Get-ItemDirectoryInfo 对象添加六个 NoteProperty 值。

$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 中添加

从哈希表创建对象

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

语法如下:

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

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

此功能已在 PowerShell 版本 3.0 中添加

从哈希表创建自定义对象

自定义对象非常有用,并且很容易使用哈希表方法创建。 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

从哈希表创建非自定义对象

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

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

[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 中的泛型

另请参阅