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