about_Methods
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. Till exempel representerar FileInfo-objekt filerna i 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
den CopyTo
metod 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 "Metod". 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-processen 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 metoden Kill anropas. Metoden Kill
anropas sedan på det returnerade Process
objektet.
En annan mycket användbar metod är Replace
strängmetoden. 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 inom citattecken).
Från och med PowerShell 4.0 stöds metodanrop med hjälp av dynamiska metodnamn.
Lär dig mer om metoder
Om du vill hitta definitioner av metoderna för ett objekt går du till hjälpavsnittet för objekttypen och letar efter sidan med dess metoder. På följande sida beskrivs till exempel metoderna för processobjekten System.Diagnostics.Process.
Om du vill fastställa argumenten för en metod läser 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")
Kommentar
Till skillnad från PowerShells argumentläge körs objektmetoder i uttrycksläge, vilket är en direktströmning till .NET-ramverket som PowerShell bygger på. I uttrycksläge tillåts inte bareword-argument (ociterade strängar). Du kan se den här skillnaden när du använder sö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 skriva över befintliga filer.
(Get-ChildItem c:\final.txt).CopyTo("c:\bin\final.txt", $true)
Uppräkning av medlemsåtkomst
Från och med PowerShell 3.0, när du använder operatorn för medlemsåtkomst (.
) för att komma åt en metod som inte finns i en listsamling, räknar PowerShell automatiskt upp objekten i samlingen och anropar metoden för varje objekt. Mer information finns i about_Member-Access_Enumeration.
Exempel
I följande exempel körs metoden Kill för enskilda processobjekt i en samling objekt.
Det första kommandot startar tre instanser av Anteckningar-processen. Get-Process
hämtar alla tre instanserna av Anteckningar-processen och sparar dem i variabeln $p
.
Notepad; Notepad; Notepad
$p = Get-Process Notepad
$p.Count
3
Nästa kommando 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()
Get-Process Notepad
Kommandot Get-Process
bekräftar att Kill
metoden fungerade.
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
Det här exemplet är funktionellt likvärdigt med att använda 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. Detta tillåter användning av två nya metoder när du hanterar samlingar ForEach
och Where
.
Du kan läsa mer om dessa metoder i about_arrays
Anropa en specifik metod när det finns flera överlagringar
Tänk på följande scenario när du anropar .NET-metoder. Om en metod tar ett objekt men har en överlagring via ett gränssnitt som tar en mer specifik typ, väljer PowerShell den metod som accepterar objektet om du inte uttryckligen omvandlar det till det gränssnittet.
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}";
}
}
'@
I det här exemplet valdes den mindre specifika object
överlagringen av metoden Bar .
[Foo]::new().Bar(1)
object: 1
I det här exemplet omvandlar vi metoden till gränssnittets IFoo för att välja den mer specifika överlagringen av bar-metoden .
([IFoo] [Foo]::new()).Bar(1)
int: 1
Använda .NET-metoder som använder filsystemsökvägar
PowerShell stöder flera runspaces per process. Varje runspace har en egen aktuell katalog. Det här är inte samma sak som arbetskatalogen för den aktuella processen: [System.Environment]::CurrentDirectory
.
.NET-metoder använder arbetskatalogen process. PowerShell-cmdletar använder Runspace-platsen. .NET-metoder fungerar också bara med interna filsystemsökvägar, inte PowerShell Path-objekt. Om du vill använda PowerShell-sökvägar med .NET-metoder måste du matcha sökvägen till en filsystembaserad sökväg innan du skickar den till .NET-metoden.