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 stanu 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 określających akcję, którą można wykonać na obiekcie. Na przykład FileInfo obiekt zawiera metodę CopyTo , 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 procesu.

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 zawiera 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, powinny być rozdzielone przecinkami.

Na przykład następujące polecenie wywołuje metodę Kill procesów, aby zakończyć proces Notatnik 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. Kill Metoda 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że zostać umieszczona 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 niczego, co powoduje wystąpienie obiektu (na przykład ciąg w cudzysłowie).

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

Edukacja o metodach

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 zawierać 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 argumentu 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 podczas używania ścieżki jako parametru w porównaniu ze ścieżką jako argumentem. Więcej informacji na temat trybów analizowania można uzyskać 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 składowej (.) 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ę w każdym elemencie. 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 Notatnik. Get-Processpobiera wszystkie trzy wystąpienia procesu Notatnik i zapisuje je w zmiennej$p.

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

Następne polecenie uruchamia metodę Kill we 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 uruchomienia metody na każdym obiekcie w kolekcji.

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

Metody ForEach i Where

Począwszy od programu PowerShell 4.0, filtrowanie kolekcji przy użyciu składni metody jest obsługiwane. Dzięki temu można używać dwóch nowych metod do obsługi kolekcji 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 runspace na proces. Każdy obszar uruchamiania 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, należy rozpoznać ścieżkę do ścieżki natywnej systemu plików przed przekazaniem jej do metody .NET.

Zobacz też