Udostępnij za pośrednictwem


about_Object_Creation

Krótki opis

Objaśnienie sposobu tworzenia obiektów w programie PowerShell.

Długi opis

Obiekty można tworzyć w programie PowerShell i używać obiektów tworzonych w poleceniach i skryptach.

Istnieje wiele sposobów tworzenia obiektów. Ta lista nie jest ostateczna:

  • Nowy obiekt: tworzy wystąpienie obiektu .NET Framework lub obiektu COM.
  • Import-Csv/ConvertFrom-CSV: tworzy obiekty niestandardowe (PSCustomObject) z elementów zdefiniowanych jako wartości oddzielone znakami.
  • ConvertFrom-Json: tworzy obiekty niestandardowe zdefiniowane w notacji obiektów JavaScript (JSON).
  • ConvertFrom-StringData: tworzy niestandardowe obiekty zdefiniowane jako pary wartości klucza.
  • Add-Type: umożliwia zdefiniowanie klasy w sesji programu PowerShell, którą można utworzyć za pomocą polecenia New-Object.
  • New-Module: Parametr AsCustomObject tworzy obiekt niestandardowy zdefiniowany przy użyciu bloku skryptu.
  • Add-Member: dodaje właściwości do istniejących obiektów. Możesz użyć Add-Member polecenia , aby utworzyć obiekt niestandardowy poza prostym typem, na przykład [System.Int32].
  • Select-Object: wybiera właściwości obiektu. Można użyć Select-Object polecenia , aby utworzyć niestandardowe i obliczone właściwości na już utworzonym obiekcie.

W tym artykule omówiono następujące dodatkowe metody:

  • Wywołując konstruktor typu przy użyciu metody statycznej new()
  • Przez typecasting skrót tabel nazw właściwości i wartości właściwości

Static new(), metoda

Wszystkie typy platformy .NET mają metodę new() , która umożliwia łatwiejsze konstruowanie wystąpień. Można również wyświetlić wszystkie dostępne konstruktory dla danego typu.

Aby wyświetlić konstruktory typu, określ new nazwę metody po nazwie typu i naciśnij <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)

Teraz możesz utworzyć identyfikator System.Uri , określając odpowiedni konstruktor.

[System.Uri]::new("https://www.bing.com")
AbsolutePath   : /
AbsoluteUri    : https://www.bing.com/
LocalPath      : /
Authority      : www.bing.com
...

W poniższym przykładzie można określić, jakie typy platformy .NET są aktualnie ładowane do utworzenia wystąpienia.

[AppDomain]::CurrentDomain.GetAssemblies() |
  ForEach-Object {
    $_.GetExportedTypes() |
      ForEach-Object { $_.FullName }
  }

Obiekty utworzone przy użyciu new() metody mogą nie mieć takich samych właściwości jak obiekty tego samego typu, które są tworzone przez polecenia cmdlet programu PowerShell. Polecenia cmdlet, dostawcy i rozszerzony system typów programu PowerShell mogą dodawać dodatkowe właściwości do wystąpienia.

Na przykład dostawca systemu plików w programie PowerShell dodaje sześć wartości NoteProperty do obiektu DirectoryInfo zwróconego przez Get-Itempolecenie .

$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

Podczas bezpośredniego tworzenia obiektu DirectoryInfo nie ma tych sześciu wartości 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

Aby uzyskać więcej informacji na temat systemu rozszerzonego typu, zobacz about_Types.ps1xml.

Ta funkcja została dodana w programie PowerShell 5.0

Tworzenie obiektów na podstawie tabel skrótów

Obiekt można utworzyć na podstawie tabeli skrótów właściwości i wartości właściwości.

Składnia wygląda następująco:

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

Ta metoda działa tylko w przypadku klas, które mają konstruktor bez parametrów. Właściwości obiektu muszą być publiczne i konfigurowalne.

Ta funkcja została dodana w programie PowerShell w wersji 3.0

Tworzenie obiektów niestandardowych na podstawie tabel skrótów

Obiekty niestandardowe są bardzo przydatne i można je łatwo tworzyć przy użyciu metody tabeli skrótów. Klasa PSCustomObject została zaprojektowana specjalnie w tym celu.

Obiekty niestandardowe to doskonały sposób zwracania dostosowanych danych wyjściowych z funkcji lub skryptu. Jest to bardziej przydatne niż zwracanie sformatowanych danych wyjściowych, których nie można ponownie sformatować ani przesyłać potokami do innych poleceń.

Polecenia w ustawieniu Test-Object function niektórych wartości zmiennych, a następnie użyj tych wartości do utworzenia obiektu niestandardowego. Ten obiekt można zobaczyć w użyciu w przykładowej sekcji tematu Update-Help pomocy polecenia cmdlet.

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

Dane wyjściowe tej funkcji są domyślnie kolekcją obiektów niestandardowych sformatowanych jako tabela.

ModuleName        UICulture      Version
---------         ---------      -------
PSScheduledJob    en-us          3.1.0.0
PSWorkflow        en-us          3.0.0.0

Użytkownicy mogą zarządzać właściwościami obiektów niestandardowych tak samo jak w przypadku obiektów standardowych.

(Test-Object).ModuleName
 PSScheduledJob
 PSWorkflow

Obiekty typu PSObject utrzymują listę elementów członkowskich w kolejności, w których składowe zostały dodane do obiektu. Mimo że obiekty tabeli skrótu nie gwarantują kolejności par klucz-wartość, rzutowanie tabeli skrótów literału w celu [pscustomobject] zachowania kolejności.

Tabela skrótów musi być literałem. W przypadku zawijania tabeli skrótu w nawiasach lub rzutowania zmiennej zawierającej tabelę skrótu nie ma gwarancji, że kolejność jest zachowywana.

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

Tworzenie obiektów innych niż niestandardowe na podstawie tabel skrótów

Tabele skrótów umożliwiają również tworzenie obiektów dla klas innych niż niestandardowe. Podczas tworzenia obiektu dla klasy innej niż niestandardowa wymagana jest nazwa typu kwalifikowanego przestrzeni nazw, chociaż można pominąć dowolny początkowy składnik przestrzeni nazw systemu .

Na przykład następujące polecenie tworzy obiekt opcji sesji.

[System.Management.Automation.Remoting.PSSessionOption]@{
  IdleTimeout=43200000
  SkipCnCheck=$True
}

Wymagania funkcji tabeli skrótów, zwłaszcza wymagania konstruktora bez parametrów, eliminują wiele istniejących klas. Jednak większość klas opcji programu PowerShell jest przeznaczona do pracy z tą funkcją, a także innych bardzo przydatnych klas, takich jak klasa 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
...

Funkcję tabeli skrótów można również użyć podczas ustawiania wartości parametrów. Na przykład wartość parametru SessionOption parametru New-PSSession. polecenie cmdlet może być tabelą skrótów.

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

Obiekty ogólne

Można również tworzyć obiekty ogólne w programie PowerShell. Typy ogólne to klasy, struktury, interfejsy i metody, które mają symbole zastępcze (parametry typu) dla co najmniej jednego typu, które przechowują lub używają.

Poniższy przykład tworzy obiekt Słownik .

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

Aby uzyskać więcej informacji na temat typów ogólnych, zobacz Generics in .NET (Typy ogólne na platformie .NET).

Zobacz też