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 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. 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.
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 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 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 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.