Om metoder

Kort beskrivning

Beskriver hur du använder metoder för att utföra åtgärder på objekt i PowerShell.

Lång beskrivning

PowerShell använder objekt för att representera objekten i datalager eller datorns tillstånd. FileInfo-objekt representerar till exempel filerna på filsystemenheter och ProcessInfo-objekt representerar processerna på datorn.

Objekt har egenskaper som lagrar data om objektet och metoder som gör att du kan ändra objektet.

En "metod" är en uppsättning instruktioner som anger en åtgärd som du kan utföra på objektet. Objektet innehåller till exempel FileInfo metoden CopyTo som kopierar filen som FileInfo objektet representerar.

Om du vill hämta metoderna för ett objekt använder du cmdleten Get-Member . Använd dess MemberType-egenskap med värdet "Method". Följande kommando hämtar metoderna för processobjekt.

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

Om du vill utföra eller "anropa" en metod för ett objekt skriver du en punkt (.), metodnamnet och en uppsättning parenteser "()". Om metoden har argument placerar du argumentvärdena inom parenteserna. Parenteserna krävs för varje metodanrop, även om det inte finns några argument. Om metoden tar flera argument bör de avgränsas med kommatecken.

Följande kommando anropar till exempel metoden Kill för processer för att avsluta anteckningar på datorn.

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

Det här exemplet kan förkortas genom att kombinera ovanstående instruktioner.

(Get-Process Notepad).Kill()

Kommandot Get-Process omges av parenteser för att säkerställa att det körs innan kill-metoden anropas. Metoden Kill anropas sedan på det returnerade Process objektet.

En annan mycket användbar metod är Replace metoden för strängar. Metoden Replace ersätter text i en sträng. I exemplet nedan kan punkten (.) placeras direkt efter strängens slutcitat.

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

Som du ser i föregående exempel kan du anropa en metod för ett objekt som du får med hjälp av ett kommando, ett objekt i en variabel eller något som resulterar i ett objekt (t.ex. en sträng med citattecken).

Från och med PowerShell 4.0 stöds metodanrop med hjälp av dynamiska metodnamn.

Lära dig mer om metoder

Om du vill hitta definitioner av metoderna för ett objekt går du till hjälpavsnittet för objekttypen i MSDN och letar efter dess metodsida. På följande sida beskrivs till exempel metoderna för processobjekten System.Diagnostics.Process.

Om du vill fastställa argumenten för en metod granskar du metoddefinitionen, som liknar syntaxdiagrammet för en PowerShell-cmdlet.

En metoddefinition kan ha en eller flera metodsignaturer, som liknar parameteruppsättningarna för PowerShell-cmdletar. Signaturerna visar alla giltiga format för kommandon för att anropa metoden .

Metoden FileInfo för klassen innehåller till exempel CopyTo följande två metodsignaturer:

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

Den första metodsignaturen tar målfilens namn (och en sökväg). I följande exempel används den första CopyTo metoden för att kopiera Final.txt filen till C:\Bin katalogen.

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

Anteckning

Till skillnad från PowerShells argumentläge körs objektmetoder i uttrycksläge , vilket är en direktströmning till det .NET-ramverk som PowerShell bygger på. I uttrycksläge tillåts inte bareword-argument (icke-citattecken). Du kan se detta i skillnadssökvägen som en parameter, jämfört med sökvägen som ett argument. Du kan läsa mer om parsningslägen i about_Parsing

Den andra metodsignaturen tar ett målfilnamn och ett booleskt värde som avgör om målfilen ska skrivas över, om den redan finns.

I följande exempel används den andra CopyTo metoden för att kopiera Final.txt filen till C:\Bin katalogen och för att skriva över befintliga filer.

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

Metoder för skalärobjekt och samlingar

Metoderna för ett ("skalärt") objekt av en viss typ skiljer sig ofta från metoderna för en samling objekt av samma typ.

Varje process har till exempel en Kill metod, men en samling processer har ingen Kill-metod.

Från och med PowerShell 3.0 försöker PowerShell förhindra skriptfel som härrör från de olika metoderna för skalära objekt och samlingar.

Om du skickar en samling, men begär en metod som bara finns på enskilda ("skalära")-objekt, anropar PowerShell metoden för varje objekt i samlingen.

Om metoden finns på de enskilda objekten och i samlingen anropas endast samlingens -metod.

Den här funktionen fungerar också med egenskaper för skalära objekt och samlingar. Mer information finns i about_Properties.

Exempel

I följande exempel körs kill-metoden för enskilda processobjekt på en samling processobjekt. Det här exemplet fungerar bara på PowerShell 3.0 och senare versioner av PowerShell.

Det första kommandot startar tre instanser av Anteckningar-processen. Det andra kommandot använder Get-Process kommandot för att hämta alla tre instanserna av anteckningar och spara dem i variabeln $p.

Notepad; Notepad; Notepad
$p = Get-Process Notepad

Det tredje kommandot använder egenskapen Antal för alla samlingar för att verifiera att det finns tre processer i variabeln $p.

$p.Count
3

Det fjärde kommandot kör metoden Kill på alla tre processerna i variabeln $p.

Det här kommandot fungerar även om en samling processer inte har någon Kill metod.

$p.Kill()

Det femte kommandot använder kommandot Get-Process för att bekräfta att Kill kommandot fungerade.

Get-Process Notepad
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

Om du vill utföra samma uppgift på PowerShell 2.0 använder du cmdleten Foreach-Object för att köra metoden på varje objekt i samlingen.

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

ForEach- och Where-metoder

Från och med PowerShell 4.0 stöds samlingsfiltrering med hjälp av en metodsyntax. På så sätt kan du använda två nya metoder när du hanterar samlingar ForEach och Where.

Du kan läsa mer om dessa metoder i about_arrays

Se även

about_Objects

about_Properties

Get-Member