about_Methods
Kurze Beschreibung
Beschreibt, wie Methoden zum Ausführen von Aktionen für Objekte in PowerShell verwendet werden.
Lange Beschreibung
PowerShell verwendet Objekte, um die Elemente in Datenspeichern oder den Zustand des Computers darzustellen. FileInfo-Objekte stellen z. B. die Dateien in Dateisystemlaufwerken und ProcessInfo-Objekte die Prozesse auf dem Computer dar.
Objekte verfügen über Eigenschaften, die Daten zu dem Objekt speichern, und Methoden, mit denen Sie das Objekt ändern können.
Eine "Methode" ist eine Reihe von Anweisungen, die eine Aktion angeben, die Sie für das Objekt ausführen können. Beispielsweise enthält das FileInfo
Objekt die CopyTo
Methode, die die Datei kopiert, die das FileInfo
Objekt darstellt.
Verwenden Sie das Get-Member
Cmdlet, um die Methoden eines objekts abzurufen. Verwenden Sie die MemberType-Eigenschaft mit dem Wert "Method". Der folgende Befehl ruft die Methoden von Prozessobjekten ab.
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...
Um eine Methode eines Objekts auszuführen oder aufzurufen, geben Sie einen Punkt (.), den Methodennamen und einen Satz von Klammern "()" ein. Wenn die Methode Argumente enthält, platzieren Sie die Argumentwerte innerhalb der Klammern. Die Klammern sind für jeden Methodenaufruf erforderlich, auch wenn keine Argumente vorhanden sind. Wenn die Methode mehrere Argumente verwendet, sollten sie durch Kommas getrennt werden.
Beispielsweise ruft der folgende Befehl die Kill-Methode von Prozessen auf, um den Editor-Prozess auf dem Computer zu beenden.
$notepad = Get-Process notepad
$notepad.Kill()
Dieses Beispiel kann durch Kombinieren der obigen Anweisungen gekürzt werden.
(Get-Process Notepad).Kill()
Der Get-Process
Befehl ist in Klammern eingeschlossen, um sicherzustellen, dass er ausgeführt wird, bevor die Kill-Methode aufgerufen wird. Die Kill
Methode wird dann für das zurückgegebene Process
Objekt aufgerufen.
Eine weitere sehr nützliche Methode ist die Replace
Methode von Zeichenfolgen. Die Replace
Methode ersetzt Text in einer Zeichenfolge. Im folgenden Beispiel kann der Punkt (.) unmittelbar nach dem Ende des Anführungszeichens der Zeichenfolge platziert werden.
'this is rocket science'.Replace('rocket', 'rock')
this is rock science
Wie in den vorherigen Beispielen gezeigt, können Sie eine Methode für ein Objekt aufrufen, das Sie mithilfe eines Befehls, eines Objekts in einer Variablen oder einem Objekt abrufen, das zu einem Objekt führt (z. B. eine Zeichenfolge in Anführungszeichen).
Ab PowerShell 4.0 wird der Methodenaufruf mithilfe dynamischer Methodennamen unterstützt.
Lernen über Methoden
Um Definitionen der Methoden eines Objekts zu finden, wechseln Sie zum Hilfethema für den Objekttyp, und suchen Sie nach dessen Methodenseite. Auf der folgenden Seite werden beispielsweise die Methoden von Prozessobjekten System.Diagnostics.Process beschrieben.
Um die Argumente einer Methode zu ermitteln, überprüfen Sie die Methodendefinition, die wie das Syntaxdiagramm eines PowerShell-Cmdlets ist.
Eine Methodendefinition kann über eine oder mehrere Methodensignaturen verfügen, die wie die Parametersätze von PowerShell-Cmdlets sind. Die Signaturen zeigen alle gültigen Formate von Befehlen an, um die Methode aufzurufen.
Die Methode der FileInfo
Klasse enthält beispielsweise CopyTo
die folgenden beiden Methodensignaturen:
CopyTo(String destFileName)
CopyTo(String destFileName, Boolean overwrite)
Die erste Methodensignatur verwendet den Zieldateinamen (und einen Pfad). Im folgenden Beispiel wird die erste CopyTo
Methode verwendet, um die Final.txt
Datei in das C:\Bin
Verzeichnis zu kopieren.
(Get-ChildItem c:\final.txt).CopyTo("c:\bin\final.txt")
Hinweis
Im Gegensatz zum Argumentmodus von PowerShell werden Objektmethoden im Ausdrucksmodus ausgeführt. Dabei handelt es sich um eine Pass-Through an das .NET Framework, auf dem PowerShell basiert. Im Ausdrucksmodus sind Bareword-Argumente (nicht angehaltene Zeichenfolgen) nicht zulässig. Sie können diesen Unterschied sehen, wenn Sie den Pfad als Parameter im Vergleich zum Pfad als Argument verwenden. Weitere Informationen zum Analysieren von Modi finden Sie in about_Parsing
Die zweite Methodensignatur akzeptiert einen Zieldateinamen und einen booleschen Wert, der bestimmt, ob die Zieldatei überschrieben werden soll, sofern sie bereits vorhanden ist.
Im folgenden Beispiel wird die zweite CopyTo
Methode verwendet, um die Final.txt
Datei in das C:\Bin
Verzeichnis zu kopieren und vorhandene Dateien zu überschreiben.
(Get-ChildItem c:\final.txt).CopyTo("c:\bin\final.txt", $true)
Memberzugriffsenumeration
Ab PowerShell 3.0 zählt PowerShell automatisch die Elemente in der Auflistung auf, wenn Sie den Memberzugriffsoperator (.
) verwenden, um auf eine Methode zuzugreifen, die in einer Listensammlung nicht vorhanden ist. Weitere Informationen finden Sie unter about_Member-Access_Enumeration.
Beispiele
Im folgenden Beispiel wird die Kill-Methode einzelner Prozessobjekte in einer Auflistung von Objekten ausgeführt.
Der erste Befehl startet drei Instanzen des Editorprozesses. Get-Process
ruft alle drei Instanzen des Editor-Prozesses ab und speichert sie in der $p
Variablen.
Notepad; Notepad; Notepad
$p = Get-Process Notepad
$p.Count
3
Der nächste Befehl führt die Kill-Methode für alle drei Prozesse in der $p
Variablen aus. Dieser Befehl funktioniert auch dann, wenn eine Sammlung von Prozessen nicht über eine Kill
Methode verfügt.
$p.Kill()
Get-Process Notepad
Der Get-Process
Befehl bestätigt, dass die Kill
Methode funktioniert hat.
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
Dieses Beispiel entspricht funktional der Verwendung des Foreach-Object
Cmdlets zum Ausführen der Methode für jedes Objekt in der Auflistung.
$p | ForEach-Object {$_.Kill()}
ForEach- und Where-Methoden
Ab PowerShell 4.0 wird die Sammlungsfilterung mithilfe einer Methodensyntax unterstützt. Dies ermöglicht die Verwendung von zwei neuen Methoden beim Umgang mit Sammlungen ForEach
und Where
.
Weitere Informationen zu diesen Methoden finden Sie unter about_arrays.
Aufrufen einer bestimmten Methode, wenn mehrere Überladungen vorhanden sind
Berücksichtigen Sie beim Aufrufen von .NET-Methoden das folgende Szenario. Wenn eine Methode ein Objekt verwendet, aber über eine Überladung über eine Schnittstelle verfügt, die einen spezifischeren Typ verwendet, wählt PowerShell die Methode aus, die das Objekt akzeptiert, es sei denn, Sie wandeln es explizit in diese Schnittstelle um.
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}";
}
}
'@
In diesem Beispiel wurde die weniger spezifische object
Überladung der Bar-Methode ausgewählt.
[Foo]::new().Bar(1)
object: 1
In diesem Beispiel wandeln wir die Methode in die Schnittstelle IFoo um, um die spezifischere Überladung der Bar-Methode auszuwählen.
([IFoo] [Foo]::new()).Bar(1)
int: 1
Verwenden von .NET-Methoden, die Dateisystempfade verwenden
PowerShell unterstützt mehrere Runspaces pro Prozess. Jeder Runspace verfügt über ein eigenes aktuelles Verzeichnis. Dies entspricht nicht dem Arbeitsverzeichnis des aktuellen Prozesses: [System.Environment]::CurrentDirectory
.
.NET-Methoden verwenden das Arbeitsverzeichnis des Prozesses. PowerShell-Cmdlets verwenden den Runspace-Speicherort. Außerdem funktionieren .NET-Methoden nur mit systemeigenen Dateisystempfaden, nicht mit PowerShell Path-Objekten. Um PowerShell-Pfade mit .NET-Methoden zu verwenden, müssen Sie den Pfad zu einem systemeigenen Pfad auflösen, bevor Sie ihn an die .NET-Methode übergeben.