Delen via


about_Methods

Korte beschrijving

Hierin wordt beschreven hoe u methoden gebruikt om acties uit te voeren op objecten in PowerShell.

Lange beschrijving

PowerShell gebruikt objecten om de items in gegevensarchieven of de status van de computer weer te geven. FileInfo-objecten vertegenwoordigen bijvoorbeeld de bestanden in bestandssysteemstations en ProcessInfo-objecten vertegenwoordigen de processen op de computer.

Objecten hebben eigenschappen, waarmee gegevens over het object worden opgeslagen en methoden waarmee u het object kunt wijzigen.

Een 'methode' is een reeks instructies waarmee een actie wordt opgegeven die u op het object kunt uitvoeren. Het FileInfo-object bevat bijvoorbeeld de CopyTo methode waarmee het bestand dat het FileInfo object voorstelt, wordt gekopieerd.

Gebruik de cmdlet Get-Member om de methoden van een object op te halen. Gebruik de eigenschap MemberType met de waarde 'Methode'. Met de volgende opdracht worden de methoden van procesobjecten opgehaald.

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

Als u een methode van een object wilt uitvoeren of aanroepen, typt u een punt (.), de naam van de methode en een set haakjes (). Als de methode argumenten heeft, plaatst u de argumentwaarden tussen de haakjes. De haakjes zijn vereist voor elke methode-aanroep, zelfs als er geen argumenten zijn. Als de methode meerdere argumenten gebruikt, moeten deze worden gescheiden door komma's.

Met de volgende opdracht wordt bijvoorbeeld de Kill-methode van processen aangeroepen om het Kladblok-proces op de computer te beëindigen.

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

Dit voorbeeld kan worden ingekort door de bovenstaande instructies te combineren.

(Get-Process Notepad).Kill()

De Get-Process opdracht staat tussen haakjes om ervoor te zorgen dat deze wordt uitgevoerd voordat de Kill-methode wordt aangeroepen. De Kill methode wordt vervolgens aangeroepen op het geretourneerde Process-object.

Een andere zeer nuttige methode is de Replace methode van tekenreeksen. De methode Replace vervangt tekst in een tekenreeks. In het onderstaande voorbeeld kan de punt (.) direct na het eindcitaat van de tekenreeks worden geplaatst.

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

Zoals u in de vorige voorbeelden kunt zien, kunt u een methode aanroepen voor een object dat u krijgt met behulp van een opdracht, een object in een variabele of iets dat resulteert in een object (zoals een tekenreeks tussen aanhalingstekens).

Vanaf PowerShell 4.0 wordt methode-aanroep met behulp van dynamische methodenamen ondersteund.

Meer informatie over methoden

Als u definities van de methoden van een object wilt vinden, gaat u naar het Help-onderwerp voor het objecttype en zoekt u de bijbehorende methodenpagina. Op de volgende pagina worden bijvoorbeeld de methoden van procesobjecten System.Diagnostics.Processbeschreven.

Als u de argumenten van een methode wilt bepalen, bekijkt u de definitie van de methode. Dit is vergelijkbaar met het syntaxisdiagram van een PowerShell-cmdlet.

Een methodedefinitie kan een of meer methodehandtekeningen hebben, die lijken op de parametersets van PowerShell-cmdlets. De handtekeningen tonen alle geldige indelingen van opdrachten om de methode aan te roepen.

De CopyTo methode van de klasse FileInfo bevat bijvoorbeeld de volgende twee methodehandtekeningen:

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

De eerste methodehandtekening gebruikt de naam van het doelbestand (en een pad). In het volgende voorbeeld wordt de eerste CopyTo methode gebruikt om het Final.txt-bestand te kopiëren naar de map C:\Bin.

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

Notitie

In tegenstelling tot het argument modus van PowerShell, worden objectmethoden uitgevoerd in expressie modus. Dit is een passthrough voor het .NET-framework waarop PowerShell is gebouwd. In expressie modus bareword argumenten (niet-aanhalingstekens) niet zijn toegestaan. U kunt dit verschil zien wanneer u het pad als parameter gebruikt, versus het pad als argument. Meer informatie over parseringsmodi vindt u in about_Parsing

De tweede methodehandtekening heeft een naam van het doelbestand en een Booleaanse waarde die bepaalt of het doelbestand moet worden overschreven, als het al bestaat.

In het volgende voorbeeld wordt de tweede methode CopyTo gebruikt om het Final.txt bestand naar de C:\Bin map te kopiëren en bestaande bestanden te overschrijven.

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

Opsomming voor lidtoegang

Wanneer u vanaf PowerShell 3.0 de operator voor lidtoegang (.) gebruikt om toegang te krijgen tot een methode die niet bestaat in een lijstverzameling, wordt in PowerShell automatisch de items in de verzameling opgesomd en wordt de methode voor elk item aangeroepen. Zie about_Member-Access_Enumerationvoor meer informatie.

Voorbeelden

In het volgende voorbeeld wordt de methode Kill van afzonderlijke procesobjecten in een verzameling objecten uitgevoerd.

Met de eerste opdracht worden drie exemplaren van het Kladblok-proces gestart. Get-Process haalt alle drie de exemplaren van het Kladblok-proces op en slaat deze op in de $p variabele.

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

Met de volgende opdracht wordt de methode Kill uitgevoerd op alle drie de processen in de variabele $p. Deze opdracht werkt ook al heeft een verzameling processen geen Kill methode.

$p.Kill()
Get-Process Notepad

Met de opdracht Get-Process wordt bevestigd dat de methode Kill heeft gewerkt.

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

Dit voorbeeld is functioneel gelijk aan het gebruik van de cmdlet ForEach-Object om de methode uit te voeren op elk object in de verzameling.

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

ForEach- en Where-methoden

Vanaf PowerShell 4.0 wordt het filteren van verzamelingen met behulp van een methodesyntaxis ondersteund. Dit maakt het gebruik van twee nieuwe methoden mogelijk bij het omgaan met verzamelingen ForEach en Where.

Meer informatie over deze methoden vindt u in about_Arrays

Een specifieke methode aanroepen wanneer er meerdere overbelastingen bestaan

Houd rekening met het volgende scenario bij het aanroepen van .NET-methoden. Als een methode een object gebruikt maar een overbelasting heeft via een interface die een specifieker type heeft, kiest PowerShell de methode die het object accepteert, tenzij u het expliciet naar die interface cast.

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 dit voorbeeld is de minder specifieke object overbelasting van de Bar methode gekozen.

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

In dit voorbeeld casten we de methode naar de interface IFoo- om de specifiekere overbelasting van de Bar methode te selecteren.

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

Bepalen welke overbelasting is gebruikt

Vanaf PowerShell 7.6 kunt u zien welke methode powerShell overbelast door middel van MethodInvocation tracering.

In de volgende voorbeelden wordt Trace-Command de overbelasting weergegeven die is gekozen bij het aanroepen van de methode String.Split.

Trace-Command -PSHost -Name MethodInvocation -Expression {
    "a 1 b 1 c 1 d".Split(1)
}

In het eerste voorbeeld is het gehele getal 1 geconverteerd naar een [char] in plaats van een [string], wat resulteert in een tekenreeks die wordt gesplitst [char]1 in plaats van de tekenreeks "1".

DEBUG: ... MethodInvocation Information: 0 : Invoking method: string[] Spli
t(char separator, System.StringSplitOptions options = System.StringSplitOpt
ions.None)

a 1 b 1 c 1 d

In het tweede voorbeeld wordt de Split() methode aangeroepen met de tekenreeks "1".

Trace-Command -PSHost -Name MethodInvocation -Expression {
    "a 1 b 1 c 1 d".Split("1")
}

PowerShell heeft gekozen voor de overbelasting die een [string] scheidingsteken gebruikt.

DEBUG: ... MethodInvocation Information: 0 : Invoking method: string[] Spli
t(string separator, System.StringSplitOptions options = System.StringSplitO
ptions.None)

a
 b
 c
 d

.NET-methoden gebruiken die bestandssysteempaden nemen

PowerShell ondersteunt meerdere runspaces per proces. Elke runspace heeft een eigen huidige map. Dit is niet hetzelfde als de werkmap van het huidige proces: [System.Environment]::CurrentDirectory.

.NET-methoden maken gebruik van de werkmap voor processen. PowerShell-cmdlets maken gebruik van de Runspace-locatie. Bovendien werken .NET-methoden alleen met systeemeigen bestandssysteempaden, niet met PowerShell-padobjecten. Als u PowerShell-paden met .NET-methoden wilt gebruiken, moet u het pad naar een systeemeigen bestandssysteempad omzetten voordat u het doorgeeft aan de .NET-methode.

Zie ook