Articles

ForEach a Kde magie metod

ForEach a Kde jsou dva často používané pojmy, které byly k dispozici v Powershellu od verze 1 vyšla v roce 2006. ForEach je k dispozici jako prohlášení a rutiny (ForEach-Object), který umožňuje iterovat kolekce objektů a provést nějakou akci jednou pro každý objekt v této kolekci. Kde byl k dispozici jako rutinu (Kde-Objekt), který umožňuje filtrovat položky v kolekci, která neprojdou nějakou podmínku, podmínku, která může být hodnocena buď pomocí vlastnosti na objekty v kolekci, nebo samotné objekty, které patří do sběru. ForEach schopnost jednat na položky v kolekci a Kde schopnost filtrovat kolekci jsou vlastnosti, které jsou velmi užitečné a jsou zahrnuty v té či oné podobě v logice za mnoho PowerShell skripty, příkazy a moduly, bez ohledu na to, jakou verzi PowerShell je používán. Ve skutečnosti, oni jsou tak vytížené, že byly oblast zaměření pro zlepšení výkonu, funkčnosti a syntaxe v PowerShell verze 3.0 a 4.0.

S vydáním Windows PowerShell 4.0, dva nové „magické“ metody byly zavedeny pro typy kolekcí, které poskytují novou syntaxi pro přístup ForEach a Kde schopnosti v prostředí Windows PowerShell. Tyto metody jsou vhodně pojmenoványkaždý a kde. Tyto metody nazývám „magií“, protože jsou docela magické v tom, jak fungují v PowerShell. Nezobrazují se ve výstupu Get-Member, i když použijete-Force a request-MemberType All. Pokud si vyhrnete rukávy a vykopáte se s odrazem, najdete je; vyžaduje však široké vyhledávání, protože se jedná o soukromé metody rozšíření implementované v soukromé třídě. Přesto, i když nejsou zjistitelné bez pokukování pod kryty, které jsou tam, když je potřebujete, jsou rychlejší než jejich starší protějšky, a zahrnují funkce, které nejsou k dispozici v jejich starší protějšky, a proto „magické“ pocit, že nechat se při jejich použití v prostředí PowerShell. Bohužel, tyto metody zůstávají nezdokumentované i dnes, téměř rok od jejich zveřejnění, tolik lidí si neuvědomuje sílu, která je v těchto metodách k dispozici. Tento článek se to pokusí napravit vysvětlením, kde mohou být použity a jak fungují, abyste mohli tuto magii využít při použití PowerShell.

poznámka o PowerShell 3.0

Než jsem se do vysvětlování, jak ForEach a Kde metody práce, musím zmínit něco, s ohledem na tyto dvě metody, a PowerShell 3.0. I když je pravda, že metody ForEach a kde byly k dispozici pouze v PowerShell 4.0 a novějších verzích, PowerShell 3.0 je stále velmi široce používán v mnoha prostředích, a pokud používáte PowerShell v prostředí, které má standardizované na PowerShell 4.0 a novější, můžete najít sami, kteří chtějí byste mohli využít syntaxi poskytována nové metody při použití PowerShell 3.0. Jsem cítil, že to omezení stojí za to řešit, tak jako součást TypePx modul, který jsem nedávno publikoval na Githubu a v PowerShell Zdroj Galerie (aka PowerShellGet veřejné úložiště, v současné době v omezené preview), jsem součástí ForEach a Kde scénář metody, které jsou funkčně ekvivalentní metody zavedené v PowerShell 4.0, takže můžete využít novou syntaxi a funkce, i když jste pomocí PowerShell 3.0. V této implementaci je několik nedostatků, které zdůrazním později v tomto článku.

ForEach metoda

ForEach je metoda, která umožňuje rychle iterovat kolekce objektů a provést nějakou akci na každý objekt v této kolekci. Tato metoda poskytuje vyšší výkon než jeho starší kolegové (foreach prohlášení a ForEach-Object rutiny), a to také zjednodušuje některé z nejčastějších akcí, které možná budete chtít vzít na objekty v kolekci. Všechny objekty, které jsou vyvedeny touto metodou, jsou vráceny v obecné sbírce typového systému.Suvenýr.ObjectModel.Kolekce1.

existuje šest podporovaných způsobů, jak tuto metodu vyvolat, a každý z nich bude podrobněji vysvětlen níže. Podporované argumenty, které lze použít při vyvolání metody ForEach, jsou následující:

  • ForEach(scriptblock výraz)
  • ForEach(typ convertToType)
  • ForEach(string propertyName)
  • ForEach(string propertyName, objekt newValue)
  • ForEach(string methodName)
  • ForEach(string methodName, objekt argumenty)
  • ForEach(scriptblock výraz, objekt arguments)

Všimněte si, že tyto jsou podporovány argument párování, neliší přetížení je k dispozici pro ForEach metoda. Použití jiných párů argumentů, než jsou tyto, může mít za následek chyby, které jasně neidentifikují, jaký je skutečný problém.

ForEach(scriptblock výraz) a ForEach(scriptblock výraz, objekt argumenty)

Pokud se vám projít blok skriptu výraz do ForEach metoda, budete moci provádět stejné úkoly, které by se v bloku skriptu, který používáte s foreach nebo ForEach-Object rutiny. Stejně jako rutina ForEach-Object, proměnné $_ a $PSItem odkazují na aktuální zpracovávanou položku. Všechny argumenty, které poskytnete nad rámec argumentu počátečního bloku skriptu, budou použity jako argumenty pro blok skriptu. Je to stejné, jako když parametr-ArgumentList pracuje na rutině ForEach-Object. Zde je příklad ukazuje, jak můžete použít k spustit skript blok na každou položku v kolekci:

# Get a set of services$services = Get-Service c*# Display the names and display names of all services in the collection$services.foreach{"$($_.Name) ($($_.DisplayName))"}# Select a property name to expand using a script block argument$services.foreach({param($PropertyName); $_.$PropertyName}, 'DisplayName')

možná Jste si všimli něčeho zvláštního o této syntaxi, protože jsem nechtěl zabalit blok skriptu sám v závorkách. Můžete zabalit to v kulatých závorkách, ale to je volitelná v PowerShell 4.0 nebo novější, protože PowerShell parser byl rozšířen pro závorky vynechány, kdykoli odvoláváte se na metodu, která přijímá jeden blok skriptu argument. Stejně jako příkaz foreach a rutina ForEach-Object je zadaný blok skriptů vyvolán v aktuálním rozsahu. To znamená, že všechna přiřazení proměnných, která provedete uvnitř tohoto bloku skriptů, budou přetrvávat i po dokončení provádění metody ForEach.

ForEach (type convertToType)

unikátní pro metodu ForEach můžete předat Typ do metody ForEach, pokud chcete převést každou položku v kolekci na jiný typ. Představte si například, že máte sbírku objektů a chcete tyto objekty převést na jejich řetězcový ekvivalent. Zde je, jak by to vypadalo s ForEach metoda:

# Get a collection of processes$processes = Get-Process# Convert the objects in that collection into their string equivalent$processes.foreach()

můžete provést stejný úkol obsadit kolekce do pole typu string (např. ]$procesy), a přetypování pole je ve skutečnosti výrazně rychlejší, nicméně je tu velmi dobrá šance, nebudete ani nevšimnete, rozdíl ve výkonu čas, pokud jste pracovali s velmi, velmi velkou sbírku. I přes časový rozdíl, mám tendenci preferovat ForEach metoda syntaxe v určitých situacích, pokud to umožňuje udržovat elegance při provádění vyhnout další kulaté závorky v skripty píšu.

ForEach(string propertyName)

V PowerShell 3.0 a novější, druhý parametr nastavení byla přidána do ForEach-Object, aby vám více snadno získat hodnotu konkrétní nemovitosti pouhým předáním v název vlastnosti jako jediný parametr hodnota pro ForEach-Object. Toto pohodlí bylo nabídnuto také v metodě ForEach. Zde je příklad ukazuje, jak můžete iterovat v kolekci a vrátí vlastnost, že kolekce:

# Get all services whose name starts with "w"$services = Get-Service w*# Return the names of those services$services.foreach('Name')

samozřejmě, že od verze 3.0 prostředí PowerShell, můžete jednoduše vyvolat $služby.Jméno, aby si jména všech služeb, a že bude kompletní rychlejší než ForEach metoda alternativní (i když budete jen všimnout, rozdíl ve výkonnosti ve velkých kolekcích v řádu stovek tisíc objektů); to však funguje pouze pro vlastnosti, které nejsou v samotné sbírce, a je to syntaxe, se kterou někteří scripters nejsou spokojeni kvůli implicitní povaze toho, co příkaz dělá. Nová syntaxe metody ForEach vám poskytuje explicitnější alternativu, která má další výhodu v tom, že je také trochu více dokumentující.

ForEach(string propertyName, objekt newValue)

nejen, že můžete získat nemovitosti na kolekce objektů, můžete nastavit vlastnost na kolekce objektů stejně. Toto je funkce, která není k dispozici v ostatních foreach, pokud k tomu výslovně nevytvoříte blok skriptů. Nastavte vlastnost, jednoduše poskytnout název vlastnosti a hodnota, kterou chcete použít při nastavení, že majetek, jako je tento:

# Note, this is not a realistic example# This would be used more commonly on configuration data$services = Get-Service c*# Now change the display names of every service to some new value$services.foreach('DisplayName','Hello')

Stejně jako úkoly by se pomocí operátoru rovná se, PowerShell se pokusí převést cokoliv zadáte jako novou hodnotu do příslušného typu pro majetek byl přidělen.

ForEach(string methodName) a ForEach(string methodName, objekt argumenty)

K vyvolání metody, stačí poskytnout jméno metody jako první argument, a pak argumenty pro to, že metoda jako druhý, třetí, čtvrtý, atd. argument. Pokud metoda nebere žádné argumenty, můžete jednoduše zadat název metody a bude vyvolána bez jakýchkoli argumentů. Zde je příklad, který ukazuje, jak byste mohli zabít spoustu procesů, na kterých běží konkrétní program:

# Get all processes running Chrome$processes = Get-Process -Name Chrome# Now kill all of those processes$processes.foreach('Kill')

Zde je další příklad, tentokrát s využitím metody s argumenty, a zároveň ukazuje, jak si mohl ověřit, že příkazy jsou následující nejlepší postupy vhodnými názvy a aliasy pro často používané parametry:

# Get all commands that have a ComputerName parameter$cmds = Get-Command -ParameterName ComputerName# Now show a table making sure the parameter names and aliases are consistent$cmds.foreach('ResolveParameter','ComputerName') | Format-Table Name,Aliases

Jak můžete vidět z těchto výsledků, tam jsou určitě některé nesrovnalosti v provádění Název_počítače parametry, které by měly být opraveny.

který pokrývá všechny funkce, které jsou v současné době k dispozici v metodě ForEach. Jak můžete vidět, není mnoho nových funkcí nabízených v této metodě, ale syntaxe zlepšení, když provádíte jednoduchý úkol na kolekce objektů jsou pěkné, a ForEach metoda zlepšení výkonu při srovnání s ekvivalentní foreach pro ForEach-Object potrubí jsou rozhodně vítaným zlepšením stejně. S tímto vysvětlením z cesty, pojďme k metodě Where.

metoda Where

kde je metoda, která umožňuje filtrovat sbírku objektů. To je velmi podobně jako where-Object rutiny, ale Kde metoda je také jako Vyberte-Objektu a Skupiny Objektů, stejně, obsahuje několik dalších funkcí, které Kde-Objekt rutiny nativně nepodporuje sama o sobě. Tato metoda poskytuje rychlejší výkon než kde-objekt v jednoduchém, elegantním příkazu. Stejně jako metoda ForEach jsou všechny objekty, které jsou touto metodou vyvedeny, vráceny v obecné sbírce typového systému.Suvenýr.ObjectModel.Kolekce1.

existuje pouze jedna verze této metody, kterou lze popsat následovně:

Where(scriptblock expression])

Jak je uvedeno v hranatých závorkách, výraz blok skriptu je vyžadováno, a režim výčet a numberToReturn celočíselné argumenty jsou volitelné, takže si můžete vyvolat tato metoda s použitím 1, 2, nebo 3 argumenty. Pokud chcete použít konkrétní argument, musíte poskytnout všechny argumenty na levé tohoto argumentu (tj. pokud chcete poskytnout hodnotu pro numberToReturn, musíte zadat hodnoty pro režim a projevu, stejně).

kde (scriptblock expression)

nejzákladnější vyvolání metody Where jednoduše bere výraz skriptového bloku jako argument. Výraz bloku skriptů bude vyhodnocen jednou pro každý objekt ve sbírce, která je zpracovávána, a pokud vrátí true, objekt bude vrácen metodou Where. Toto je funkční ekvivalent volání rutiny Where-Object a předání bloku skriptů. Stejně jako cmdlet Where-Object lze proměnné $_ a $PSItem použít k označení aktuální položky, která je zpracovávána uvnitř bloku skriptů.

zde je velmi jednoduchý příklad, který ukazuje, jak můžete získat seznam spuštěných služeb.

# Get all services$services = Get-Service# Now filter out any services that are not running$services.where{$_.Status -eq 'Running'}

Tento nenabízí žádné nové funkce, ale nabízí mnohem vyšší výkon než Kde-Objekt a syntaxe je poměrně snadné řídit, takže si opravdu měli zvážit pro vaše skripty při provádění na straně klienta filtrování kolekcí, které máte uložené v proměnné.

, Kde(scriptblock výraz, WhereOperatorSelectionMode režim)

Když se začnete dívat na volitelné parametry, Kde metoda, začne to být mnohem zajímavější. Windows PowerShell verze 4.0 obsahoval nový výčet s typovým označením systému.Řízení.Automatizace.WhereOperatorSelectionMode. Všimněte si přípony tohoto typuname: „SelectionMode“. Používá se k poskytování výkonných možností výběru v syntaxi Where. Zde jsou hodnoty obsažené v tomto výčtu spolu s jejich definicemi:

Default Filtr kolekce pomocí výraz blok skriptu, maximální počet, pokud jeden byl poskytnut nebo prodlení na všechny objekty v kolekci, pokud ne, maximální počet byl poskytnut v numberToReturn.
Vrátí prvních N objektů, které projdou výraz blok skriptu filtr, splácet pouze 1 objekt, pokud určitý počet nebylo požadováno v numberToReturn.
Poslední Vrátí posledních N objektů, které projdou výraz blok skriptu filtr, splácet pouze 1 objekt, pokud určitý počet nebylo požadováno v numberToReturn.
SkipUntil Přeskočit objekty v kolekci, dokud objekt prochází výraz script blok filtru, a pak se vrátí prvních N objektů, prodlení na všechny zbývající objekty, pokud ne, maximální počet byl poskytnut v numberToReturn.
Do Vrátí prvních N objekty v kolekci, dokud objekt prochází výraz blok skriptu filtr, prodlení na všechny objekty vedoucí k první objekt, který prošel pokud ne, maximální počet byl poskytnut v numberToReturn.
Rozdělení Rozdělit sbírku na dvě části, umístění všech objektů, které projdou výraz blok skriptu filtr do první sbírky až na maximální počet, pokud jeden byl poskytnut v numberToReturn, nebo všechny objekty, které projít, pokud ne, maximální počet byl poskytnut, a uvedení všech dalších objektů, které nejsou v první kolekce do druhé kolekce.

Každý z nich nabízí některé jedinečné hodnoty, když jste zpracování kolekcí dat, takže budu poskytovat další podrobnosti o každém režimu výběru níže.

výchozí

není divu, že výchozí hodnota argumentu mode je „výchozí“. Výchozí režim výběru nabízí stejnou funkci, jakou získáte, když režim výběru vůbec neposkytnete. Například jsme mohli napsat poslední řádek našeho předchozího příkladu takto:

# Now filter out any services that are not running$services.where({$_.Status -eq 'Running'},'Default')

V tomto příkladu, extra argument není nutné, protože to dělá přesně to samé, že to by dělat, pokud jste neposkytl argument. Můžete také poskytnout maximální počet objektů, které chcete vrátit při použití výchozího režimu výběru pomocí argumentu numberToReturn, jako je tento:

# Get the first 10 services in our collection that are running$services.where({$_.Status -eq 'Running'},'Default',10)

je důležité si uvědomit, že přesná funkce je také k dispozici při použití První výběr režimu (který probereme za chvíli), takže to opravdu není praktické použít některý z volitelných parametrů, když používáte Výchozí režim výběru.

Jak jste možná uhodli, První v režimu výběr umožňuje vybrat první objekt(y) v kolekci, které projdou blok skriptu výrazu filtru. Při použití První bez hodnoty pro numberToReturn argument, nebo při použití První s hodnotou 0 pro numberToReturn argument, pouze první objekt, který projde filtrem bude vrácena. Volitelně můžete určit, kolik objektů se má vrátit v argumentu numberToReturn, v takovém případě bude vráceno mnoho objektů (za předpokladu, že existuje mnoho objektů, které projdou filtrem).

zde je několik příkladů z naší kolekce služeb zobrazujících první režim výběru v akci:

# Get the first service in our collection that is running$services.where({$_.Status -eq 'Running'},'First')# Get the first service in our collection that is running$services.where({$_.Status -eq 'Running'},'First',1)# Get the first 10 services in our collection that are running$services.where({$_.Status -eq 'Running'},'First',10)

Všimněte si, že druhý příkaz v tyto příklady vrátí stejné výsledky jako první příkaz, protože je to prostě výslovně předáním výchozí hodnota numberToReturn argument, když První výběr režimu je používán.

Poslední

Poslední režim výběru funkce, stejně jako První výběr režimu, což vám umožní vybrat poslední objekt(y) v kolekci, které projdou blok skriptu výrazu filtru. Pokud použijete Poslední bez hodnoty pro argument numberToReturn, nebo pokud použijete Poslední s hodnotou 0 pro argument numberToReturn, bude vrácen pouze poslední objekt, který projde filtrem. Volitelně můžete určit, kolik objektů se má vrátit v argumentu numberToReturn, v takovém případě bude vráceno mnoho objektů (za předpokladu, že existuje mnoho objektů, které projdou filtrem).

zde je několik příkladů z naší kolekce služeb zobrazujících poslední režim výběru v akci:

# Get the last service in our collection that is running$services.where({$_.Status -eq 'Running'},'Last')# Get the last service in our collection that is running$services.where({$_.Status -eq 'Running'},'Last',1)# Get the last 10 services in our collection that are running$services.where({$_.Status -eq 'Running'},'Last',10)

Také, jako První výběr režimu, příklady, druhý příkaz v tyto příklady vrátí stejné výsledky jako první příkaz, protože je to prostě výslovně předáním výchozí hodnota numberToReturn argument, když Poslední výběr režimu je používán.

SkipUntil

SkipUntil režimu výběr umožňuje přeskočit všechny objekty v kolekci, dokud nenajdete ten, který prochází blok skriptu výrazu filtru. Jakmile jste najít objekt, který prochází filtrem, SkipUntil režimu bude buď vrátit všechny zbývající objekty v kolekci, pokud žádná hodnota nebo hodnota 0 byla poskytnuta numberToReturn argument, nebo se vrátí prvních N zbývající objekty v kolekci, pokud je hodnota větší než nula, byla poskytnuta numberToReturn argument. V obou případech budou výsledky zahrnovat první objekt, který prošel filtrem.

zde je několik příkladů, které používají podmnožinu naší kolekce služeb k zobrazení režimu výběru SkipUntil v akci:

# Get a collection of services whose name starts with "c"$services = Get-Service c*# Skip all services until we find one with a status of "Running"$services.where({$_.Status -eq 'Running'},'SkipUntil')# Skip all services until we find one with a status of "Running", then# return the first 2$services.where({$_.Status -eq 'Running'},'SkipUntil',2)

dokud

režim do výběru poskytuje opačnou funkčnost režimu SkipUntil selection. To vám umožní vrátit objekty ve sbírce, dokud nenajdete ten, který prochází filtrem výrazu skriptového bloku. Jakmile najdete objekt, který prochází filtrem, metoda Where zastaví zpracování objektů. Pokud neuvedete hodnotu argumentu numberToReturn nebo zadáte hodnotu 0, režim výběru do vrátí všechny objekty ve sbírce vedoucí k prvnímu, který projde filtrem výrazu bloku skriptů. Pokud si poskytovat hodnotu pro numberToReturn argument, že je větší než 0, Do režimu výběr bude návrat na nejvíce, že počet objektů, což znamená, že to ani nemusí najít objekt, který prochází blok skriptu výrazu filtru.

Zde jsou některé příklady, které používají různé podmnožiny našich služeb sběr ukázat Do režimu výběru v akci:

# Get a collection of services whose name starts with "p"$services = Get-Service p*# Return all services until we find one with a status of "Stopped"$services.where({$_.Status -eq 'Stopped'},'Until')# Return the first 2 services unless we find one with a status of# "Stopped" first$services.where({$_.Status -eq 'Stopped'},'Until',2)

Rozdělení

Rozdělit režim výběru je jedinečný. Namísto vrácení podmnožiny kolekce, kterou začnete v nové kolekci, vrací novou kolekci, která interně obsahuje dvě samostatné kolekce. To, co tyto vnořené kolekce obsahují, závisí na tom, jak používáte režim rozděleného výběru. Split umožňuje rozdělit sbírku objektů do dvou. Ve výchozím nastavení, pokud nechcete poskytnout hodnotu pro numberToReturn argument, nebo pokud zadáte hodnotu 0 pro numberToReturn argument, Split bude umístit všechny objekty, které projdou blok skriptu výrazu filtru do první vnořené kolekce, a všechny ostatní objekty (ty, které nemají projít blok skriptu výrazu filtru) do druhé vnořené kolekce. Pokud nám poskytnete hodnotu větší než 0 pro numberToReturn argument, split omezí velikost první kolekce se, že maximální množství, a všechny zbývající objekty v kolekci, a to i těch, které odpovídají blok skriptu výraz filtru, bude umístěn do druhé kolekce.

zde je několik příkladů, které ukazují, jak lze režim rozděleného výběru použít k rozdělení sbírky objektů různými způsoby:

# Get all services$services = Get-Service# Split the services into two groups: Running and not Running$running,$notRunning = $services.Where({$_.Status -eq 'Running'},'Split')# Show the Running services$running# Show the services that are not Running$notRunning# Split the services into the same two groups, but limit the Running group# to a maximum of 10 items$10running,$others = $services.Where({$_.Status -eq 'Running'},'Split',10)# Show the first 10 Running services$10running# Show all other services$others

Jak můžete vidět z tohoto příkladu, Rozdělit je docela silný výběr režimu, poskytuje mix filtrování, seskupování a výběr v jediném příkazu call.

tato kolekce výběrových režimů dělá metodu Where rychlou a elegantní, ale zároveň silnější než where-Object, Group-Object a Select-Object kombinované v jednom potrubí. Co na tom nemilovat?

nedostatky ve ForEach a kde metody skriptu v TypePx

Jak jsem již zmínil v tomto článku, napsal jsem rozšíření typu pro PowerShell 3.0 a později a zabalil je do modulu s názvem TypePx. TypePx je skriptový modul, který byl napsán výhradně v PowerShell a běží na PowerShell 3.0 nebo novějším. Pokud používáte PowerShell 3.0 (a pouze pokud používáte PowerShell 3.0), TypePx definuje ForEach a Kde scénář metody, které napodobují chování ForEach a Kde metody v prostředí PowerShell 4.0 a novější. Zatímco systém rozšířeného typu v PowerShell umožňuje napodobit toto chování, existuje několik nedostatků kvůli implementaci v PowerShell, která ovlivnila, jak daleko jsem byl schopen jít s těmito typovými rozšířeními. Tato část bude popisovat některé rozdíly a omezení, které existují v ForEach a kde metody skriptu v TypePx, které byste měli vědět, pokud používáte PowerShell 3.0.

bloky Skriptu spouštění skriptu metoda run u dítěte působnosti

na Rozdíl od ForEach a Kde metody, které se využívají jako součást PowerShell 4.0 nebo později, které se dovolávají výraz blok skriptu v aktuálním rozsahu, kde je volána metoda, ForEach a Kde scénář metody realizovány v prostředí PowerShell 3.0 vyvolat výraz script blok u dítěte působnosti. Toto je omezení v PowerShell, které existuje od samého začátku (omezení, mohu dodat, že si myslím, že je zdaleka největším nedostatkem PowerShell jako jazyka).

vzhledem k tomuto omezení budou všechny proměnné, které přiřadíte uvnitř bloku expression script, upraveny pouze v podřízeném rozsahu. To má důsledky, pokud je váš blok expression script určen k aktualizaci proměnné v rozsahu, ve kterém vyvoláte ForEach nebo kde. To je nepravděpodobné, že by způsobit problém při použití, Kde, protože to není velmi časté změnit proměnné v, Kde výraz blok skriptu, ale v ForEach bloky skriptu to může představovat problém, takže budete muset mít na paměti, pokud budete používat tyto rozšíření.

musím poznamenat, že bych chtěl odstranit toto omezení úplně, a věřím, že bude schopen tak učinit, nicméně v době, kdy jsem psal tento článek jsem dosud provedena oprava za to.

Většina, ale ne všechny sbírky budou mít ForEach a Kde metody

V PowerShell 4.0 a novější, ForEach a tam, Kde jsou metody jako mávnutím kouzelného proutku k dispozici pro všechny typy, které implementují IEnumerable až na Řetězec, XmlNode, a typy, které implementují IDictionary. V PowerShell systém extended type neumožňuje vytváření rozšíření pro rozhraní, pouze pro typy. To je výzva, pokud chcete vytvořit široké rozšíření, jako je ForEach a kde. V aktuální implementaci těchto rozšíření v TypePx, TypePx modul najde všechny typy ve všech sestavách vložen v aktuální aplikaci doména, a pro všechny non-generické typy, které definují IEnumerable, ale ne IDictionary (kromě String a XmlNode), plus pro všechny obecné typy, které definují IEnumerable, ale ne IDictionary pro generické kolekce PSObject, Object, String, Int32 nebo Int64, ForEach a Kde scénář metod bude vytvořen.

Toto zahrnuje velké množství typů, které v mé vlastní testování bylo dostatečné, nicméně můžete narazit na typy, kde chcete používat tyto metody a nejsou k dispozici. Pokud tomu tak je, dejte mi vědět přes GitHub a uvidím, co mohu udělat. Toto je také omezení, které bych chtěl odstranit,ale potřebuji více času na výzkum, jak implementovat ekvivalentní funkčnost v kompilované sestavě, kde ji mohu definovat spíše, jako je definována v PowerShell 4.0 a novějších.

PowerShell skripty nejsou tak rychle, jak zkompilovaný kód

To asi samozřejmé, ale když napíšeš něco v PowerShell, který je interpretovaný jazyk, nebude běžet tak rychle, jak by bylo, kdyby jsi napsal ekvivalent logiku v jazyce, jako je C#. To je absolutně případ ForEach and Where script methods, které interně používají ForEach-Object, Where-Object a pipelining k napodobení chování nativních ForEach a Where metod. V tomto případě výhoda těchto příkazů pochází z elegantní syntaxe a funkčnosti, kterou poskytují, a navíc je lze použít ve skriptech pro PowerShell 3.0 a 4.0. Výhody výkonu ve ForEach a kde jsou pouze v nativní implementaci PowerShell 4.0.

PowerShell 3.0 vyžaduje závorky kolem všech parametrů metody

ve výše uvedených příkladech jsem zmínil, že jsem byl schopen vyvolat metodu s jediným parametrem bloku doslovného skriptu bez zabalení tohoto bloku doslovného skriptu do dalších závorek. Tato schopnost existuje pouze v PowerShell 4.0 nebo později kvůli vylepšením, která byla provedena v analyzátoru v této verzi. V PowerShell 3.0, parser nepodporuje, takže závorky jsou vždy nezbytné pro ForEach a Kde scénář metody pro práci s jeden doslovný blok skriptu parametr v této verzi.

závěr

Když jsem se začal snažit napodobovat chování ForEach a kde magické metody v PowerShell 3.0, neuvědomil jsem si, kolik funkcí poskytují. Kopání do technických detailů za těchto metod, takže jsem mohl vytvořit rozšíření, které jsem chtěla v TypePx pomohl odhalit všechny skryté funkce v těchto velmi silné metody, a jsem velmi rád, podělit se s vámi v tomto článku. Doufám, že tyto informace vám pomohou využít tuto úžasnou novou sadu funkcí ve vaší práci PowerShell, i když stále používáte PowerShell 3.0. Šťastné skriptování!