共用方式為


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() 方法呼叫型別的建構函式
  • 藉由鍵入屬性名稱和屬性值的哈希表

靜態 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中新增

從哈希表建立物件

您可以從屬性和屬性值的哈希表建立 物件。

語法如下所示:

[<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

PSObject 類型物件會依成員加入對象的順序維護成員清單。 即使 Hashtable 物件不保證索引鍵/值組的順序,仍會轉換常值哈希表來 [pscustomobject] 維護順序。

哈希表必須是常值。 如果您將哈希表包裝在括弧中,或如果您轉換包含哈希表的變數,則不保證會保留順序。

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

從哈希表建立非自定義物件

您也可以使用哈希表來建立非自定義類別的物件。 當您為非自定義類別建立 物件時,雖然您可以省略任何初始 系統 命名空間元件,但需要命名空間限定的類型名稱。

例如,下列命令會建立會話選項物件。

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

另請參閱