about_Methods

Krátký popis

Popisuje, jak pomocí metod provádět akce s objekty v PowerShellu.

Dlouhý popis

PowerShell používá objekty k reprezentaci položek v úložištích dat nebo stavu počítače. Například FileInfo objekty představují soubory v jednotkách systému souborů a ProcessInfo objekty představují procesy v počítači.

Objekty mají vlastnosti, které ukládají data o objektu a metody, které umožňují změnit objekt.

"metoda" je sada instrukcí, které určují akci, kterou můžete u objektu provést. Objekt například FileInfo obsahuje metodu CopyTo , která kopíruje soubor, který FileInfo objekt představuje.

K získání metod libovolného objektu použijte rutinu Get-Member . Použijte vlastnost MemberType s hodnotou "Method". Následující příkaz získá metody procesních objektů.

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

Pokud chcete provést nebo vyvolat metodu objektu, zadejte tečku (.), název metody a sadu závorek "()". Pokud metoda obsahuje argumenty, umístěte hodnoty argumentů do závorek. Závorky jsou vyžadovány pro každé volání metody, i když neexistují žádné argumenty. Pokud metoda přebírá více argumentů, měly by být odděleny čárkami.

Například následující příkaz vyvolá metodu Kill procesů, která ukončí proces Poznámkový blok v počítači.

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

Tento příklad lze zkrátit kombinací výše uvedených příkazů.

(Get-Process Notepad).Kill()

Příkaz Get-Process je uzavřený v závorkách, aby se zajistilo, že se spustí před vyvolání metody Kill. Metoda Kill se pak vyvolá na vrácený Process objekt.

Další velmi užitečná metoda je Replace metoda řetězců. Metoda Replace nahrazuje text v řetězci. V následujícím příkladu lze tečku (.) umístit hned za koncovou uvozovku řetězce.

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

Jak je znázorněno v předchozích příkladech, můžete vyvolat metodu u objektu, který získáte pomocí příkazu, objektu v proměnné nebo čehokoli, co má za následek objekt (například řetězec v uvozovkách).

Počínaje PowerShellem 4.0 se podporuje vyvolání metody pomocí názvů dynamických metod.

Učení o metodách

Pokud chcete najít definice metod objektu, přejděte do tématu nápovědy pro typ objektu a vyhledejte jeho metody stránky. Například následující stránka popisuje metody procesních objektů System.Diagnostics.Process.

Pokud chcete určit argumenty metody, zkontrolujte definici metody, která se podobá diagramu syntaxe rutiny PowerShellu.

Definice metody může obsahovat jeden nebo více podpisů metody, které jsou podobné sadám parametrů rutin PowerShellu. Podpisy zobrazují všechny platné formáty příkazů pro vyvolání metody.

Například CopyTo metoda FileInfo třídy obsahuje následující dva podpisy metody:

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

První podpis metody přebírá název cílového souboru (a cestu). Následující příklad používá první CopyTo metodu ke zkopírování Final.txt souboru do C:\Bin adresáře.

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

Poznámka:

Na rozdíl od režimu argumentů PowerShellu se objektové metody spouští v režimu výrazu, což je průchod rozhraní .NET, na kterém je powershell založený. V režimu výrazů nejsou povoleny argumenty holého slova (necitované řetězce). Tento rozdíl můžete vidět při použití cesty jako parametru a cesty jako argumentu. Další informace o režimech analýzy najdete v about_Parsing

Druhý podpis metody přebírá název cílového souboru a logickou hodnotu, která určuje, zda má být cílový soubor přepsán, pokud již existuje.

Následující příklad používá druhou CopyTo metodu ke zkopírování Final.txt souboru do C:\Bin adresáře a k přepsání existujících souborů.

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

Výčet přístupu členů

Počínaje PowerShellem 3.0 použijete operátor přístupu člena (.) pro přístup k metodě, která v kolekci seznamů neexistuje, PowerShell automaticky vytvoří výčet položek v kolekci a vyvolá metodu pro každou položku. Další informace najdete v tématu about_Member-Access_Enumeration.

Příklady

Následující příklad spustí metodu Kill jednotlivých objektů procesu v kolekci objektů.

První příkaz spustí tři instance procesu Poznámkový blok. Get-Processzíská všechny tři instance procesu Poznámkový blok a uloží je do $p proměnné.

Notepad; Notepad; Notepad
$p = Get-Process Notepad
$p.Count
3

Následující příkaz spustí metodu Kill ve všech třech procesech v $p proměnné. Tento příkaz funguje, i když kolekce procesů nemá metodu Kill .

$p.Kill()
Get-Process Notepad

Příkaz Get-Process potvrdí, že Kill metoda fungovala.

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

Tento příklad je funkčně ekvivalentní použití Foreach-Object rutiny ke spuštění metody pro každý objekt v kolekci.

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

Metody ForEach a Where

Počínaje PowerShellem 4.0 se podporuje filtrování kolekcí pomocí syntaxe metody. To umožňuje použití dvou nových metod při práci s kolekcemi ForEach a Where.

Další informace o těchto metodách najdete v about_arrays

Volání konkrétní metody v případech, kdy existuje více přetížení

Při volání metod .NET zvažte následující scénář. Pokud metoda přebírá objekt, ale má přetížení prostřednictvím rozhraní, které přebírá konkrétnější typ, PowerShell zvolí metodu, která objekt přijme, pokud ho explicitně nepřetypujete do daného rozhraní.

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}";
   }

}
'@

V tomto příkladu byla zvolena méně specifická object přetížení barové metody.

[Foo]::new().Bar(1)
object: 1

V tomto příkladu přetypujeme metodu do rozhraní IFoo vybrat konkrétnější přetížení bar metody.

([IFoo] [Foo]::new()).Bar(1)
int: 1

Použití metod .NET, které přebírají cesty systému souborů

PowerShell podporuje více prostředí runspace na proces. Každý runspace má svůj vlastní aktuální adresář. Toto není totéž jako pracovní adresář aktuálního procesu: [System.Environment]::CurrentDirectory.

Metody .NET používají pracovní adresář procesu. Rutiny PowerShellu používají umístění Runspace. Metody .NET také pracují pouze s nativními cestami systému souborů, nikoli s objekty cesty PowerShellu. Pokud chcete použít cesty PowerShellu s metodami .NET, musíte před předáním metodě .NET přeložit cestu k nativní cestě systému souborů.

Viz také