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.

Se även