Поделиться через


about_Object_Creation

Краткое описание

Описание создания объектов в PowerShell.

Длинное описание

Объекты можно создавать в PowerShell и использовать объекты, создаваемые в командах и сценариях.

Существует множество способов создания объектов, этот список не является окончательным:

  • новый объект: создает экземпляр объекта .NET Framework или COM-объекта.
  • Import-Csv/ConvertFrom-Csv: создает пользовательские объекты (PSCustomObject) из элементов, определенных как символьные значения.
  • ConvertFrom-Json: создает пользовательские объекты, определенные в нотации объектов JavaScript (JSON).
  • ConvertFrom-StringData: создает пользовательские объекты, определенные как пары значений ключей.
  • надстройки. Позволяет определить класс в сеансе PowerShell, который можно создать с помощью New-Object.
  • New-Module: параметр AsCustomObject создает настраиваемый объект, который вы определяете с помощью scriptblock.
  • надстройки: добавляет свойства в существующие объекты. Вы можете использовать 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. Командлеты PowerShell, поставщики и система расширенных типов могут добавлять дополнительные свойства в экземпляр.

Например, поставщик FileSystem в PowerShell добавляет шесть значений NoteProperty в объект DirectoryInfo, возвращаемый Get-Item.

$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 задают некоторые значения переменных, а затем используют эти значения для создания пользовательского объекта. Этот объект можно увидеть в примере раздела справки по командлетам 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 поддерживают список элементов в порядке добавления элементов в объект. Несмотря на то, что хэш-хэш-файл объекты не гарантируют порядок пар "ключ-значение", приведение литерального хэш-указателя к [pscustomobject] поддерживает порядок.

Хэш-файл должен быть литералом. Если вы упаковываете хэш-файл в скобки или приведение переменной, содержащей хэш-файл, не гарантирует сохранение порядка.

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

Создание не настраиваемых объектов из хэш-таблиц

Хэш-таблицы также можно использовать для создания объектов для не настраиваемых классов. При создании объекта для не настраиваемого класса требуется имя типа, соответствующее пространству имен, хотя можно опустить любой начальный компонент System пространства имен.

Например, следующая команда создает объект параметра сеанса.

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

При задании значений параметров можно также использовать функцию хэш-таблицы. Например, значение параметра SessionOptionNew-PSSession. командлет может быть хэш-таблицей.

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

Универсальные объекты

Вы также можете создавать универсальные объекты в PowerShell. Универсальные шаблоны — это классы, структуры, интерфейсы и методы, имеющие заполнители (параметры типа) для одного или нескольких типов, которые они хранят или используют.

В следующем примере создается объект словаря.

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

Дополнительные сведения о универсальных службах см. в разделе Generics в .NET.

См. также