Udostępnij za pośrednictwem


about_Methods

Krótki opis

Opisuje sposób używania metod do wykonywania akcji na obiektach w programie PowerShell.

Długi opis

Program PowerShell używa obiektów do reprezentowania elementów w magazynach danych lub stanie komputera. Na przykład obiekty FileInfo reprezentują pliki na dyskach systemu plików, a obiekty ProcessInfo reprezentują procesy na komputerze.

Obiekty mają właściwości, które przechowują dane dotyczące obiektu i metody, które umożliwiają zmianę obiektu.

"Metoda" to zestaw instrukcji, które określają akcję, którą można wykonać na obiekcie. Na przykład obiekt zawiera metodęCopyTo, FileInfo która kopiuje plik reprezentowany przez FileInfo obiekt.

Aby uzyskać metody dowolnego obiektu, użyj Get-Member polecenia cmdlet . Użyj jej właściwości MemberType z wartością "Method". Następujące polecenie pobiera metody obiektów przetwarzania.

Get-Process | Get-Member -MemberType Method
TypeName: System.Diagnostics.Process

Name                      MemberType Definition
----                      ---------- ----------
BeginErrorReadLine        Method     System.Void BeginErrorReadLine()
BeginOutputReadLine       Method     System.Void BeginOutputReadLine()
...
Kill                      Method     System.Void Kill()
Refresh                   Method     System.Void Refresh()
Start                     Method     bool Start()
ToString                  Method     string ToString()
WaitForExit               Method     bool WaitForExit(int milliseconds), ...
WaitForInputIdle          Method     bool WaitForInputIdle(int millisecon...

Aby wykonać lub "wywołać" metodę obiektu, wpisz kropkę (.), nazwę metody i zestaw nawiasów "()". Jeśli metoda ma argumenty, umieść wartości argumentów wewnątrz nawiasów. Nawiasy są wymagane dla każdego wywołania metody, nawet jeśli nie ma argumentów. Jeśli metoda przyjmuje wiele argumentów, należy je rozdzielić przecinkami.

Na przykład następujące polecenie wywołuje metodę Kill procesów, aby zakończyć proces Notatnika na komputerze.

$notepad = Get-Process notepad
$notepad.Kill()

Ten przykład można skrócić, łącząc powyższe instrukcje.

(Get-Process Notepad).Kill()

Polecenie Get-Process jest ujęte w nawiasy, aby upewnić się, że jest uruchamiane przed wywołaniem metody Kill. Metoda Kill jest następnie wywoływana na zwróconym Process obiekcie.

Inną bardzo przydatną Replace metodą jest metoda ciągów. Metoda Replace zastępuje tekst w ciągu. W poniższym przykładzie kropka (.) można umieścić bezpośrednio po cudzysłowie końcowym ciągu.

'this is rocket science'.Replace('rocket', 'rock')
this is rock science

Jak pokazano w poprzednich przykładach, można wywołać metodę dla obiektu, który otrzymujesz za pomocą polecenia, obiektu w zmiennej lub dowolnego elementu, który powoduje obiekt (na przykład ciąg w cudzysłowie).

Począwszy od programu PowerShell 4.0, obsługiwane jest wywołanie metody przy użyciu nazw metod dynamicznych.

Poznawanie metod

Aby znaleźć definicje metod obiektu, przejdź do tematu pomocy dla typu obiektu i poszukaj strony jego metod. Na przykład na poniższej stronie opisano metody obiektów przetwarzania System.Diagnostics.Process.

Aby określić argumenty metody, przejrzyj definicję metody, która jest podobna do diagramu składni polecenia cmdlet programu PowerShell.

Definicja metody może mieć co najmniej jeden podpis metody, który jest podobny do zestawów parametrów poleceń cmdlet programu PowerShell. Podpisy pokazują wszystkie prawidłowe formaty poleceń do wywołania metody.

Na przykład CopyTo metoda FileInfo klasy zawiera następujące dwa podpisy metody:

    CopyTo(String destFileName)
    CopyTo(String destFileName, Boolean overwrite)

Pierwszy podpis metody przyjmuje nazwę pliku docelowego (i ścieżkę). W poniższym przykładzie użyto pierwszej CopyTo metody do skopiowania Final.txt pliku do C:\Bin katalogu.

(Get-ChildItem c:\final.txt).CopyTo("c:\bin\final.txt")

Uwaga

W przeciwieństwie do trybu argumentów programu PowerShell metody obiektów są wykonywane w trybie wyrażeń , który jest przekazywaniem do platformy .NET, na której jest oparty program PowerShell. W trybie wyrażenia argumenty bareword (ciągi bez cudzysłów) są niedozwolone. Ta różnica jest widoczna w przypadku używania ścieżki jako parametru w porównaniu ze ścieżką jako argumentem. Więcej informacji na temat trybów analizowania można dowiedzieć się w about_Parsing

Drugi podpis metody przyjmuje nazwę pliku docelowego i wartość logiczną, która określa, czy plik docelowy powinien zostać zastąpiony, jeśli już istnieje.

W poniższym przykładzie użyto drugiej CopyTo metody do skopiowania Final.txt pliku do C:\Bin katalogu i zastąpienia istniejących plików.

(Get-ChildItem c:\final.txt).CopyTo("c:\bin\final.txt", $true)

Wyliczenie dostępu do składowych

Począwszy od programu PowerShell 3.0, gdy używasz operatora dostępu do elementu członkowskiego (.) w celu uzyskania dostępu do metody, która nie istnieje w kolekcji list, program PowerShell automatycznie wylicza elementy w kolekcji i wywołuje metodę dla każdego elementu. Aby uzyskać więcej informacji, zobacz about_Member-Access_Enumeration.

Przykłady

Poniższy przykład uruchamia metodę Kill poszczególnych obiektów procesu w kolekcji obiektów.

Pierwsze polecenie uruchamia trzy wystąpienia procesu Notatnika. Get-Process Pobiera wszystkie trzy wystąpienia procesu Notatnika i zapisuje je w zmiennej $p .

Notepad; Notepad; Notepad
$p = Get-Process Notepad
$p.Count
3

Następne polecenie uruchamia metodę Kill na wszystkich trzech procesach w zmiennej $p . To polecenie działa, mimo że kolekcja procesów nie ma Kill metody.

$p.Kill()
Get-Process Notepad

Polecenie Get-Process potwierdza, że Kill metoda zadziałała.

Get-Process : Cannot find a process with the name "notepad". Verify the proc
ess name and call the cmdlet again.
At line:1 char:12
+ Get-Process <<<<  notepad
    + CategoryInfo          : ObjectNotFound: (notepad:String) [Get-Process]
, ProcessCommandException
    + FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShel
l.Commands.GetProcessCommand

Ten przykład jest funkcjonalnie równoważny z użyciem Foreach-Object polecenia cmdlet do uruchamiania metody na każdym obiekcie w kolekcji.

$p | ForEach-Object {$_.Kill()}

Metody ForEach i Where

Począwszy od programu PowerShell 4.0, obsługiwane jest filtrowanie kolekcji przy użyciu składni metody. Umożliwia to korzystanie z dwóch nowych metod podczas pracy z kolekcjami ForEach i Where.

Więcej informacji na temat tych metod można uzyskać w about_arrays

Wywoływanie określonej metody, gdy istnieje wiele przeciążeń

Podczas wywoływania metod platformy .NET należy wziąć pod uwagę następujący scenariusz. Jeśli metoda przyjmuje obiekt, ale ma przeciążenie za pośrednictwem interfejsu, który przyjmuje bardziej konkretny typ, program PowerShell wybiera metodę, która akceptuje obiekt, chyba że jawnie rzutujesz go do tego interfejsu.

Add-Type -TypeDefinition @'

   // Interface
   public interface IFoo {
     string Bar(int p);
   }

   // Type that implements the interface
   public class Foo : IFoo {

   // Direct member method named 'Bar'
   public string Bar(object p) { return $"object: {p}"; }

   // *Explicit* implementation of IFoo's 'Bar' method().
   string IFoo.Bar(int p) {
       return $"int: {p}";
   }

}
'@

W tym przykładzie wybrano mniej specyficzne object przeciążenie metody Bar .

[Foo]::new().Bar(1)
object: 1

W tym przykładzie rzutujemy metodę na interfejs IFoo , aby wybrać bardziej szczegółowe przeciążenie metody Bar .

([IFoo] [Foo]::new()).Bar(1)
int: 1

Używanie metod platformy .NET, które przyjmują ścieżki systemu plików

Program PowerShell obsługuje wiele obszarów działania na proces. Każdy obszar działania ma własny bieżący katalog. Nie jest to samo, co katalog roboczy bieżącego procesu: [System.Environment]::CurrentDirectory.

Metody platformy .NET używają katalogu roboczego procesu. Polecenia cmdlet programu PowerShell używają lokalizacji Runspace. Ponadto metody platformy .NET działają tylko ze ścieżkami natywnego systemu plików, a nie z obiektami ścieżki programu PowerShell. Aby używać ścieżek programu PowerShell z metodami platformy .NET, przed przekazaniem jej do metody .NET należy rozpoznać ścieżkę do ścieżki natywnej systemu plików.

Zobacz też