关于对象创建

简短说明

说明如何在 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 提供程序向 返回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 中添加

从哈希表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

从哈希表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 中的泛型

另请参阅

about_Objects

about_Methods

about_Properties

about_pipelines

about_Types.ps1xml