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 -object bevat bijvoorbeeld FileInfo
de CopyTo
methode waarmee het bestand wordt gekopieerd dat het FileInfo
object vertegenwoordigt.
Gebruik Get-Member
de cmdlet 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 methodenaam 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 methode Kill 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 methode Kill 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 Replace
methode 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 ophaalt met behulp van een opdracht, een object in een variabele of iets anders dat resulteert in een object (zoals een tekenreeks tussen aanhalingstekens).
Vanaf PowerShell 4.0 wordt het aanroepen van methoden 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 naar de pagina met methoden. Op de volgende pagina worden bijvoorbeeld de methoden van procesobjecten System.Diagnostics.Process beschreven.
Als u de argumenten van een methode wilt bepalen, bekijkt u de methodedefinitie, die lijkt op 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 methode van de FileInfo
klasse bevat bijvoorbeeld CopyTo
de volgende twee methodehandtekeningen:
CopyTo(String destFileName)
CopyTo(String destFileName, Boolean overwrite)
De eerste methodehandtekening neemt de naam van het doelbestand (en een pad). In het volgende voorbeeld wordt de eerste CopyTo
methode gebruikt om het Final.txt
bestand naar de C:\Bin
map te kopiëren.
(Get-ChildItem c:\final.txt).CopyTo("c:\bin\final.txt")
Notitie
In tegenstelling tot de argumentmodus van PowerShell worden objectmethoden uitgevoerd in de expressiemodus . Dit is een pass-through naar het .NET-framework waarop PowerShell is gebouwd. In de expressiemodus zijn bareword-argumenten (tekenreeksen zonder aanhalingstekens) niet toegestaan. U kunt dit verschil zien wanneer u het pad als parameter gebruikt en het pad als argument. Meer informatie over parseringsmodi vindt u in about_Parsing
De tweede methodehandtekening gebruikt een doelbestandsnaam en een Booleaanse waarde die bepaalt of het doelbestand moet worden overschreven, als het al bestaat.
In het volgende voorbeeld wordt de tweede CopyTo
methode 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 van ledentoegang
Vanaf PowerShell 3.0, wanneer u de operator lidtoegang (.
) gebruikt voor toegang tot een methode die niet bestaat in een lijstverzameling, inventariseert PowerShell automatisch de items in de verzameling en wordt de methode voor elk item aangeroepen. Zie about_Member-Access_Enumeration voor 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 $p
variabele. Deze opdracht werkt ook als een verzameling processen geen methode heeft Kill
.
$p.Kill()
Get-Process Notepad
De Get-Process
opdracht bevestigt dat de Kill
methode 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 equivalent aan het gebruik van de Foreach-Object
cmdlet 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. Hiermee kunt u twee nieuwe methoden gebruiken bij het werken met verzamelingen ForEach
en Where
.
Meer informatie over deze methoden vindt u in about_arrays
Een specifieke methode aanroepen wanneer er meerdere overbelastingen zijn
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 met een specifieker type, 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 balkmethode gekozen.
[Foo]::new().Bar(1)
object: 1
In dit voorbeeld casten we de methode naar de interface-IFoo om de specifiekere overbelasting van de methode Bar te selecteren.
([IFoo] [Foo]::new()).Bar(1)
int: 1
.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 proceswerkmap. PowerShell-cmdlets gebruiken de runspace-locatie. .NET-methoden werken ook alleen met systeemeigen bestandssysteempaden, niet met PowerShell Path-objecten. Als u PowerShell-paden wilt gebruiken met .NET-methoden, moet u het pad naar een bestandssysteemeigen pad omzetten voordat u het doorgeeft aan de .NET-methode.