O metodách
Stručný popis
Popisuje, jak používat metody k provádění akcí 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 na 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í objekt změnit.
"Metoda" je sada instrukcí, které určují akci, kterou můžete s objektem provést. Například objekt obsahuje metoduCopyTo
, FileInfo
která zkopíruje soubor, který FileInfo
objekt představuje.
K získání metod libovolného objektu použijte rutinu Get-Member
. Použijte jeho 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...
Chcete-li 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řijímá více argumentů, měly by být odděleny čárkami.
Například následující příkaz vyvolá metodu Kill procesů pro ukončení procesu 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
je poté vyvolána u vráceného Process
objektu.
Další velmi užitečnou metodou Replace
je metoda řetězců. Metoda Replace
nahrazuje text v řetězci. V následujícím příkladu je možné 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 pro objekt, 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).
Od PowerShellu 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 na webu MSDN a vyhledejte jeho stránku metod. Například následující stránka popisuje metody objektů procesu System.Diagnostics.Process.
Pokud chcete zjistit argumenty metody, projděte si definici metody, která se podobá diagramu syntaxe rutiny PowerShellu.
Definice metody může mít jeden nebo více podpisů metody, které se podobají 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 signatury metody:
CopyTo(String destFileName)
CopyTo(String destFileName, Boolean overwrite)
První podpis metody převezme 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ějí v režimu výrazu , což je předávání do rozhraní .NET, na kterém je PowerShell postavený. V režimu výrazu nejsou povoleny argumenty typu bareword (řetězce bez citací). Můžete to vidět v cestě rozdílu jako parametru a v cestě 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)
Metody skalárních objektů a kolekcí
Metody jednoho ("skalárního") objektu určitého typu se často liší od metod kolekce objektů stejného typu.
Například každý proces má metodu Kill
, ale kolekce procesů nemá metodu Kill.
Počínaje PowerShellem 3.0 se PowerShell snaží zabránit chybám skriptování, které jsou důsledkem odlišných metod skalárních objektů a kolekcí.
Pokud odešlete kolekci, ale požádáte o metodu, která existuje pouze u jednoho ("skalárního") objektu, PowerShell vyvolá metodu pro každý objekt v kolekci.
Pokud metoda existuje pro jednotlivé objekty a v kolekci, je vyvolána pouze metoda kolekce.
Tato funkce funguje také u vlastností skalárních objektů a kolekcí. Další informace najdete v tématu about_Properties.
Příklady
Následující příklad spustí metodu Kill jednotlivých objektů procesu na kolekci objektů procesu. Tento příklad funguje jenom v PowerShellu 3.0 a novějších verzích PowerShellu.
První příkaz spustí tři instance procesu Poznámkového bloku. Druhý příkaz pomocí příkazu Get-Process
získá všechny tři instance procesu Poznámkového bloku a uloží je do proměnné $p.
Notepad; Notepad; Notepad
$p = Get-Process Notepad
Třetí příkaz používá vlastnost Count všech kolekcí k ověření, že proměnná $p obsahuje tři procesy.
$p.Count
3
Čtvrtý příkaz spustí metodu Kill pro všechny tři procesy v proměnné $p.
Tento příkaz funguje, i když kolekce procesů nemá metodu Kill
.
$p.Kill()
Pátý příkaz používá příkaz Get-Process k potvrzení, že Kill
příkaz fungoval.
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
Pokud chcete provést stejnou úlohu v PowerShellu Foreach-Object
2.0, pomocí rutiny spusťte metodu 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