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ého bloku 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.
Seznámení s metodami
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ého bloku. Get-Process
získá všechny tři instance procesu Poznámkového bloku 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ů.