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. Beispielsweise stellen FileInfo-Objekte die Dateien in Dateisystemlaufwerken und ProcessInfo-Objekten dar, die die Prozesse auf dem Computer darstellen.

Objekte verfügen über Eigenschaften, die Daten über das 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. Das Objekt enthält beispielsweise die Methode, FileInfo die die Datei kopiert, die das FileInfo Objekt CopyTo 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...

Wenn Sie eine Methode eines Objekts ausführen oder aufrufen möchten, geben Sie einen Punkt (.), den Methodennamen und einen Satz von Klammern "()" ein. Wenn die Methode Argumente enthält, platzieren Sie die Argumentwerte in den 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.

Der folgende Befehl ruft beispielsweise die Kill-Methode von Prozessen auf, um den Editorprozess auf dem Computer zu beenden.

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

Dieses Beispiel kann gekürzt werden, indem die obigen Anweisungen kombiniert werden.

(Get-Process Notepad).Kill()

Der Get-Process Befehl wird 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 innerhalb 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 mit einem Befehl, einem Objekt in einer Variable oder einem Objekt abrufen, das zu einem Objekt führt (z. B. eine Zeichenfolge in Anführungszeichen).

Ab PowerShell 4.0 werden Methodenaufrufe mithilfe von dynamischen 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 seiner 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 verfügt möglicherweise über eine oder mehrere Methodensignaturen, 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, was ein Pass-Through an das .NET Framework ist, auf dem PowerShell basiert. Im Ausdrucksmodus sind Bareword-Argumente (nicht anquotete Zeichenfolgen) nicht zulässig. Sie können diesen Unterschied sehen, wenn Sie einen Pfad als Parameter verwenden, und zwar im Vergleich zum Pfad als Argument. Weitere Informationen zum Analysieren von Modi finden Sie in about_Parsing

Die zweite Methodensignatur verwendet einen Zieldateinamen und einen booleschen Wert, der bestimmt, ob die Zieldatei überschrieben werden soll, falls 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)

Memberzugriffsaufzählung

Beginnend in PowerShell 3.0, wenn Sie den Memberzugriffsoperator (.) verwenden, um auf eine Methode zuzugreifen, die in einer Listensammlung nicht vorhanden ist, werden die Elemente in der Auflistung automatisch von PowerShell aufgezählt und die Methode für jedes Element aufgerufen. 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 Editorprozesses 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 keine Methode besitzt Kill .

$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 funktionell der Verwendung des Foreach-Object Cmdlets, um die Methode für jedes Objekt in der Auflistung auszuführen.

$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 das folgende Szenario beim Aufrufen von .NET-Methoden. Wenn eine Methode ein Objekt verwendet, aber über eine Überladung über eine Schnittstelle verfügt, die einen spezifischeren Typ übernimmt, wählt PowerShell die Methode aus, die das Objekt akzeptiert, es sei denn, Sie umwandeln sie explizit in diese Schnittstelle.

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 übernehmen

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 sie an die .NET-Methode übergeben.

Siehe auch