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-Module: параметр AsCustomObject создает настраиваемый объект, который определяется с помощью блока скриптов.
  • 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. Командлеты 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.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. командлет может быть хэш-таблицей.

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.

См. также