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


Сведения о создании объектов

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

Объясняется, как создавать объекты в 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

Create объектов из хэш-таблиц

Объект можно создать из хэш-таблицы свойств и значений свойств.

Синтаксис выглядит следующим образом:

[<class-name>]@{
  <property-name>=<property-value>
  <property-name>=<property-value>
}

Этот метод работает только для классов, имеющих конструктор без параметров. Свойства объекта должны быть открытыми и задаваться.

Эта функция была добавлена в PowerShell версии 3.0.

Create пользовательских объектов из хэш-таблиц

Пользовательские объекты очень полезны и легко создавать с помощью метода хэш-таблицы. Класс 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

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

Хэш-таблицы также можно использовать для создания объектов для нестандартных классов. При создании объекта для нестандартного класса требуется имя типа с указанием пространства имен, хотя можно опустить любой исходный компонент пространства имен 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
...

Функцию хэш-таблицы можно также использовать при установке значений параметров. Например, значение параметра New-PSSessionSessionOption объекта . Командлет может быть хэш-таблицей.

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