Share via


關於建立物件

簡短描述

說明如何在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

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