Sdílet prostřednictvím


Kapitola 4 – One-Liners a potrubí

Když jsem se začal učit PowerShell, zpočátku jsem se spoléhal na grafické uživatelské rozhraní (GUI) pro úlohy, které se pro jednoduché příkazy PowerShellu zdají být příliš složité. Jak jsem se ale dál učit, vylepšil jsem své dovednosti a přesunul jsem se od základních one-linerů k vytváření skriptů, funkcí a modulů. Je důležité si uvědomit, že je normální mít pocit zahlcení pokročilými příklady online. Nikdo nezačíná jako odborník v PowerShellu; všichni začneme jako začátečníky.

Pro ty, kteří primárně používají grafické uživatelské rozhraní pro úlohy správy, nainstalujte nástroje pro správu na pracovní stanici pro správu pro vzdálenou správu serverů. Bez ohledu na to, jestli váš server používá grafické uživatelské rozhraní nebo instalaci operačního systému jádra serveru, je tento přístup výhodný. Je to praktický způsob, jak se seznámit se vzdálenou správou serveru při přípravě na provádění úloh správy pomocí PowerShellu.

Stejně jako v předchozích kapitolách vyzkoušejte tyto koncepty ve vašem testovacím prostředí.

One-Liners

Jednoliniový příkaz v PowerShellu je jedna souvislá roura. Jedná se o běžnou mylnou představu, že příkaz na jednom fyzickém řádku je jednořádkovým příkazem PowerShellu, ale to neplatí vždy.

Představte si například následující příklad: příkaz se rozkládá na několik fyzických řádků, ale jedná se o PowerShell příkaz na jednom řádku, protože tvoří souvislý řetězec příkazů. Pro zlepšení čitelnosti a srozumitelnosti se doporučuje zalomení čáry u symbolu potrubí, přirozeného zásadního bodu v PowerShellu, aby se zlepšila čitelnost a srozumitelnost. Toto strategické použití konců řádků zlepšuje čitelnost bez narušení toku kanálu.

Get-Service |
    Where-Object CanPauseAndContinue -EQ $true |
    Select-Object -Property *
Name                : LanmanWorkstation
RequiredServices    : {NSI, MRxSmb20, Bowser}
CanPauseAndContinue : True
CanShutdown         : False
CanStop             : True
DisplayName         : Workstation
DependentServices   : {SessionEnv, Netlogon}
MachineName         : .
ServiceName         : LanmanWorkstation
ServicesDependedOn  : {NSI, MRxSmb20, Bowser}
ServiceHandle       :
Status              : Running
ServiceType         : Win32OwnProcess, Win32ShareProcess
StartType           : Automatic
Site                :
Container           :

Name                : Netlogon
RequiredServices    : {LanmanWorkstation}
CanPauseAndContinue : True
CanShutdown         : False
CanStop             : True
DisplayName         : Netlogon
DependentServices   : {}
MachineName         : .
ServiceName         : Netlogon
ServicesDependedOn  : {LanmanWorkstation}
ServiceHandle       :
Status              : Running
ServiceType         : Win32ShareProcess
StartType           : Automatic
Site                :
Container           :

Name                : vmicheartbeat
RequiredServices    : {}
CanPauseAndContinue : True
CanShutdown         : False
CanStop             : True
DisplayName         : Hyper-V Heartbeat Service
DependentServices   : {}
MachineName         : .
ServiceName         : vmicheartbeat
ServicesDependedOn  : {}
ServiceHandle       :
Status              : Running
ServiceType         : Win32OwnProcess, Win32ShareProcess
StartType           : Manual
Site                :
Container           :

Name                : vmickvpexchange
RequiredServices    : {}
CanPauseAndContinue : True
CanShutdown         : False
CanStop             : True
DisplayName         : Hyper-V Data Exchange Service
DependentServices   : {}
MachineName         : .
ServiceName         : vmickvpexchange
ServicesDependedOn  : {}
ServiceHandle       :
Status              : Running
ServiceType         : Win32OwnProcess, Win32ShareProcess
StartType           : Manual
Site                :
Container           :

Name                : vmicrdv
RequiredServices    : {}
CanPauseAndContinue : True
CanShutdown         : False
CanStop             : True
DisplayName         : Hyper-V Remote Desktop Virtualization Service
DependentServices   : {}
MachineName         : .
ServiceName         : vmicrdv
ServicesDependedOn  : {}
ServiceHandle       :
Status              : Running
ServiceType         : Win32OwnProcess, Win32ShareProcess
StartType           : Manual
Site                :
Container           :

Name                : vmicshutdown
RequiredServices    : {}
CanPauseAndContinue : True
CanShutdown         : False
CanStop             : True
DisplayName         : Hyper-V Guest Shutdown Service
DependentServices   : {}
MachineName         : .
ServiceName         : vmicshutdown
ServicesDependedOn  : {}
ServiceHandle       :
Status              : Running
ServiceType         : Win32OwnProcess, Win32ShareProcess
StartType           : Manual
Site                :
Container           :

Name                : vmicvss
RequiredServices    : {}
CanPauseAndContinue : True
CanShutdown         : False
CanStop             : True
DisplayName         : Hyper-V Volume Shadow Copy Requestor
DependentServices   : {}
MachineName         : .
ServiceName         : vmicvss
ServicesDependedOn  : {}
ServiceHandle       :
Status              : Running
ServiceType         : Win32OwnProcess, Win32ShareProcess
StartType           : Manual
Site                :
Container           :

Name                : webthreatdefsvc
RequiredServices    : {RpcSs, wtd}
CanPauseAndContinue : True
CanShutdown         : True
CanStop             : True
DisplayName         : Web Threat Defense Service
DependentServices   : {}
MachineName         : .
ServiceName         : webthreatdefsvc
ServicesDependedOn  : {RpcSs, wtd}
ServiceHandle       :
Status              : Running
ServiceType         : Win32OwnProcess, Win32ShareProcess
StartType           : Manual
Site                :
Container           :

Name                : webthreatdefusersvc_644de
RequiredServices    : {}
CanPauseAndContinue : True
CanShutdown         : True
CanStop             : True
DisplayName         : Web Threat Defense User Service_644de
DependentServices   : {}
MachineName         : .
ServiceName         : webthreatdefusersvc_644de
ServicesDependedOn  : {}
ServiceHandle       :
Status              : Running
ServiceType         : 240
StartType           : Automatic
Site                :
Container           :

Name                : Winmgmt
RequiredServices    : {RPCSS}
CanPauseAndContinue : True
CanShutdown         : True
CanStop             : True
DisplayName         : Windows Management Instrumentation
DependentServices   : {}
MachineName         : .
ServiceName         : Winmgmt
ServicesDependedOn  : {RPCSS}
ServiceHandle       :
Status              : Running
ServiceType         : Win32OwnProcess, Win32ShareProcess
StartType           : Automatic
Site                :
Container           :

K přirozeným koncům řádků může dojít u běžně používaných znaků, včetně čárky (,) a levých závorek ([), závorek ({) a závorek ((). Jiné, které nejsou tak běžné, zahrnují středník (;), znaménko rovná se (=) a jak jednoduché, tak dvojité uvozovky (',").

Použití zpětného zvýrazňujícího znaku (`) nebo znaku hrobu jako pokračování řádku je sporné. Je nejlepší se tomu vyhnout, pokud je to možné. Použití zpětného apostrofu za znakem nového řádku je běžnou chybou. Tato redundance není nutná a může kód nepotřebně zahlcovat.

Příkazy v následujícím příkladu se správně spustí z konzoly PowerShellu. Při pokusu o spuštění v podokně konzoly integrovaného skriptovacího prostředí PowerShellu (ISE) se ale zobrazí chyba. K tomuto rozdílu dochází, protože na rozdíl od konzoly PowerShellu podokno konzoly v integrovaném skriptovacím prostředí (ISE) automaticky nepředvídá pokračování příkazu na další řádek. Pokud chcete tomuto problému zabránit, stiskněte Shift+Enter v podokně konzoly isE místo Enter, když potřebujete příkaz rozšířit na více řádků. Tato kombinace kláves signalizuje ISE, že příkaz pokračuje na následujícím řádku, čímž se zabrání spuštění, které vede k chybám.

Get-Service -Name w32time |
    Select-Object -Property *
Name                : w32time
RequiredServices    : {}
CanPauseAndContinue : False
CanShutdown         : True
CanStop             : True
DisplayName         : Windows Time
DependentServices   : {}
MachineName         : .
ServiceName         : w32time
ServicesDependedOn  : {}
ServiceHandle       :
Status              : Running
ServiceType         : Win32OwnProcess, Win32ShareProcess
StartType           : Manual
Site                :
Container           :

Tento další příklad se nekvalifikuje jako jednořádkový příkaz PowerShellu, protože se nejedná o jeden nepřetržitý kanál. Místo toho jsou dva samostatné příkazy umístěné na jednom řádku oddělené středníkem. Tento středník označuje konec jednoho příkazu a začátek druhého příkazu.

$Service = 'w32time'; Get-Service -Name $Service
Status   Name               DisplayName
------   ----               -----------
Running  w32time            Windows Time

Mnoho programovacích a skriptovacích jazyků vyžaduje středník na konci každého řádku. V PowerShellu jsou ale středníky na konci řádků zbytečné a nedoporučuje se. Měli byste se jim vyhnout pro čistější a čitelnější kód.

Filtrování vlevo

Tato kapitola ukazuje, jak filtrovat výsledky různých příkazů.

Osvědčeným postupem v PowerShellu je filtrovat výsledky co nejdříve v potrubí. Tohoto se dosáhne použitím filtrů s parametry v počátečním příkazu, obvykle na začátku zpracování. To se běžně označuje jako filtrování doleva.

Pro ilustraci tohoto konceptu zvažte následující příklad: Použijte parametr NameGet-Service k filtrování výsledků na začátku kanálu a vrácení pouze podrobností pro službu Windows Time. Tato metoda demonstruje efektivní načítání dat a zajišťuje, že vrátíte pouze potřebné a relevantní informace.

Get-Service -Name w32time
Status   Name               DisplayName
------   ----               -----------
Running  w32time            Windows Time

Je běžné vidět online příklady příkazu PowerShell, který se předává pomocí roury do rutiny Where-Object pro filtrování jejích výsledků. Tato technika je neefektivní, pokud má dřívější příkaz v kanálu parametr k provedení filtrování.

Get-Service | Where-Object Name -EQ w32time
Status   Name               DisplayName
------   ----               -----------
Running  W32Time            Windows Time

První příklad ukazuje filtrování přímo ve zdroji a vrací výsledky speciálně pro službu Windows Time. Naproti tomu druhý příklad načte všechny služby a pak pomocí jiného příkazu vyfiltruje výsledky. V malých scénářích to může vypadat jako nevýznamné, ale zvažte situaci zahrnující velkou datovou sadu, jako je Active Directory. Načítat podrobnosti pro tisíce uživatelských účtů a zúžit je na malý počet je neefektivní. Procvičte si filtrování vlevo – použití filtrů co nejdříve v pořadí příkazů – i v zdánlivě triviálních případech. Tento zvyk zajišťuje efektivitu ve složitějších scénářích, kde je důležitější.

Sekvencování příkazů pro efektivní filtrování

Existuje špatná představa, že pořadí příkazů v PowerShellu je nekonvenční, ale jedná se o nedorozumění. Pořadí, ve kterém uspořádáte příkazy, zejména při filtrování, je důležité. Předpokládejme například, že používáte Select-Object k výběru konkrétních vlastností a Where-Object k filtrování. V takovém případě je důležité nejprve použít filtrování. Pokud to neuděláte, znamená to, že nezbytné vlastnosti nemusí být v kanálu k dispozici pro filtrování, což vede k neefektivním nebo chybným výsledkům.

Následující příklad selhává při generování výsledků, protože CanPauseAndContinue vlastnost chybí, když je Select-Object přesměrovaný do Where-Object. Důvodem je to, že vlastnost CanPauseAndContinue nebyla zahrnuta do výběru provedeného Select-Object. V podstatě je to vyloučeno nebo odfiltrováno.

Get-Service |
    Select-Object -Property DisplayName, Running, Status |
    Where-Object CanPauseAndContinue

Vrácení pořadí Select-Object a Where-Object vytvoří požadované výsledky.

Get-Service |
    Where-Object CanPauseAndContinue |
    Select-Object -Property DisplayName, Status
DisplayName                                    Status
-----------                                    ------
Workstation                                   Running
Netlogon                                      Running
Hyper-V Heartbeat Service                     Running
Hyper-V Data Exchange Service                 Running
Hyper-V Remote Desktop Virtualization Service Running
Hyper-V Guest Shutdown Service                Running
Hyper-V Volume Shadow Copy Requestor          Running
Web Threat Defense Service                    Running
Web Threat Defense User Service_644de         Running
Windows Management Instrumentation            Running

Kanál

Jak je vidět v mnoha příkladech v této knize, můžete často použít výstup jednoho příkazu jako vstup pro jiný příkaz. V kapitole 3 se Get-Member použil k určení typu objektu, který příkaz vytvoří.

Kapitola 3 také ukázala použití parametru ParameterTypeGet-Command k určení, které příkazy akceptovaly tento typ vstupu. V závislosti na tom, jak důkladná je nápověda k příkazu, může obsahovat oddíl VSTUPY a VÝSTUPY.

Oddíl VSTUPY označuje, že do rutiny cmdlet můžete předat pomocí kanálu objekt ServiceController nebo Stop-Service.

help Stop-Service -Full

Následující výstup se zkracuje, aby se zobrazila příslušná část nápovědy.

...
INPUTS
    System.ServiceProcess.ServiceController
        You can pipe a service object to this cmdlet.

    System.String
        You can pipe a string that contains the name of a service to this
        cmdlet.


OUTPUTS
    None
        By default, this cmdlet returns no output.

    System.ServiceProcess.ServiceController
        When you use the PassThru parameter, this cmdlet returns a
        ServiceController object representing the service.
...

Nezadá ale, které parametry přijímají tento typ vstupu. Tyto informace můžete určit kontrolou různých parametrů v plné verzi nápovědy pro rutinu Stop-Service.

help Stop-Service -Full

Opět se v následujících výsledcích zobrazí jenom relevantní nápověda. Všimněte si, že parametr DisplayName nepřijímá vstup kanálu. Parametr InputObject přijímá vstup z potrubí podle hodnoty pro objekty ServiceController. Parametr Name přijímá vstup kanálu podle hodnoty pro objekty String a podle názvu vlastnostivstup kanálu .

...
-DisplayName <System.String[]>
    Specifies the display names of the services to stop. Wildcard
    characters are permitted.

    Required?                    true
    Position?                    named
    Default value                None
    Accept pipeline input?       False
    Accept wildcard characters?  true

-InputObject <System.ServiceProcess.ServiceController[]>
    Specifies ServiceController objects that represent the services to
    stop. Enter a variable that contains the objects, or type a command
    or expression that gets the objects.

    Required?                    true
    Position?                    0
    Default value                None
    Accept pipeline input?       True (ByValue)
    Accept wildcard characters?  false

-Name <System.String[]>
    Specifies the service names of the services to stop. Wildcard
    characters are permitted.

    Required?                    true
    Position?                    0
    Default value                None
    Accept pipeline input?       True (ByPropertyName, ByValue)
    Accept wildcard characters?  true
...

Při zpracování vstupu kanálu parametr, který přijímá vstup kanálu podle názvu vlastnosti a podle hodnoty, dává přiřazení podle hodnoty přednost. Pokud tato metoda selže, pokusí se zpracovat vstup kanálu podle názvu vlastnosti. Termín podle hodnoty však může být zavádějící. Přesnější popis podle typu je .

Pokud například předáte výstup příkazu, který generuje ServiceController objekt Stop-Service, tento výstup je vázán na InputObject parametru. Pokud kanálový příkaz vytvoří objekt String, výstup je přidružen k parametru Name. Pokud výstup z příkazu neprodukuje objekt ServiceController ani String, ale obsahuje vlastnost s názvem Name, Stop-Service sváže hodnotu této vlastnosti Name s parametrem Name.

Určete, jaký typ výstupu Get-Service příkaz vytvoří.

Get-Service -Name w32time | Get-Member

Get-Service vytvoří typ objektu ServiceController.

   TypeName: System.ServiceProcess.ServiceController

Jak je znázorněno v nápovědě pro cmdlet Stop-Service, parametr InputObject přijímá objekty ServiceController prostřednictvím potrubí podle hodnoty. To znamená, že když předáte výstup z Get-Service rutiny do Stop-Service, objekty ServiceController vytvořené pomocí Get-Service se váží na parametr InputObject v Stop-Service.

Get-Service -Name w32time | Stop-Service

Teď zkuste zadat řetězec. Proveďte potrubí w32time do Get-Member, abyste potvrdili, že je to řetězec.

'w32time' | Get-Member
   TypeName: System.String

Dokumentace nápovědy k PowerShellu ukazuje, že když přesměrujete řetězec do Stop-Service, sváže se s parametrem Namepodle hodnoty. Proveďte praktický test, abyste to viděli v akci: přesměrujte řetězec w32time do Stop-Service. Tento příklad ukazuje, jak Stop-Service zpracuje řetězec w32time jako název služby, která se má zastavit. Spuštěním následujícího příkazu můžete sledovat tuto vazbu a provádění příkazů v akci.

Všimněte si, že w32time je uzavřeno do jednoduchých uvozovek. V PowerShellu je osvědčeným postupem použít jednoduché uvozovky pro statické řetězce a rezervace dvojitých uvozovek v situacích, kdy řetězec obsahuje proměnné, které vyžadují rozšíření. Jednoduché uvozovky instruují PowerShell, aby s obsahem nakládal doslovně, bez zpracování proměnných. Tento přístup nejen zajišťuje přesnost v tom, jak váš skript interpretuje řetězec, ale také zvyšuje výkon, protože PowerShell spotřebuje méně úsilí při zpracovávání řetězců pomocí jednoduchých uvozovek.

'w32time' | Stop-Service

Vytvořte vlastní objekt pro testování vstupu kanálu podle názvu vlastnosti parametru s názvem Stop-Service.

$customObject = [pscustomobject]@{
    Name = 'w32time'
}

Obsah proměnné CustomObject je typ objektu PSCustomObject a obsahuje vlastnost s názvem Name.

$customObject | Get-Member
   TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
Name        NoteProperty string Name=w32time

Při práci s proměnnými v PowerShellu, například $customObject v tomto příkladu, je důležité použít dvojité uvozovky, pokud potřebujete proměnnou uzavřít do uvozovek. Dvojité uvozovky umožňují rozšíření proměnných – PowerShell vyhodnotí proměnnou a použije její hodnotu. Pokud například uzavřete $customObject do dvojitých uvozovek a předáte ho do Get-Member, PowerShell zpracuje hodnotu $customObject. Naproti tomu použití jednoduchých uvozovek by vedlo k přesměrování literálového řetězce $customObject do Get-Member, a nikoli hodnoty proměnné. Toto rozlišení je důležité pro scénáře, ve kterých potřebujete vyhodnotit hodnotu proměnných.

Při přesměrování obsahu proměnné $customObject do rutiny Stop-Service se vazba na parametr Name provádí podle názvu vlastnosti, nikoli podle hodnoty. Důvodem je, že $customObject je objekt, který obsahuje vlastnost s názvem Name. V tomto scénáři PowerShell identifikuje vlastnost Name v rámci $customObject a použije jeho hodnotu pro parametr Stop-Service .

Vytvořte jiný vlastní objekt pomocí jiného názvu vlastnosti, například Service.

$customObject = [pscustomobject]@{
    Service = 'w32time'
}

Při pokusu o zastavení služby w32time dojde k chybě při přesměrování $customObject do Stop-Service. Vazba kanálu selže, protože $customObject nevytváří objekt ServiceController nebo objekt typu String a neobsahuje vlastnost Name.

$customObject | Stop-Service
Stop-Service : Cannot find any service with service name
'@{Service=w32time}'.
At line:1 char:17
+ $customObject | Stop-Service
+                 ~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (@{Service=w32time}:String) [
   Stop-Service], ServiceCommandException
    + FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShe
   ll.Commands.StopServiceCommand

Pokud názvy výstupních vlastností jednoho příkazu neodpovídají požadavkům na vstup kanálu jiného příkazu, můžete názvy vlastností přejmenovat pomocí Select-Object, aby se správně zarovnaly.

V následujícím příkladu použijte Select-Object k přejmenování vlastnosti Service na vlastnost s názvem Name.

Na první pohled může být syntaxe tohoto příkladu složitá. Je ale důležité pochopit, že k získání syntaxe se vyžaduje více než kopírování a vkládání kódu. Místo toho je potřeba zadat kód ručně. Tento praktický postup vám pomůže zapamatovat si syntaxi a opakovaným procvičováním se stává intuitivnější. Použití více monitorů nebo rozdělené obrazovky může také pomoct v procesu učení. Při aktivním psaní a experimentování s ním na druhé obrazovce zobrazte ukázkový kód na jedné obrazovce. Toto nastavení usnadňuje sledování a zlepšuje pochopení a uchovávání syntaxe.

$customObject |
    Select-Object -Property @{Name='Name';Expression={$_.Service}} |
    Stop-Service

Existují případy, ve kterých může být třeba použít parametr, který nepřijímá vstup skrz kanál. V takových případech můžete stále použít výstup jednoho příkazu jako vstup pro jiný. Nejprve zachyťte a uložte zobrazované názvy několika konkrétních služeb Systému Windows do textového souboru. Tento krok umožňuje použít uložená data jako vstup pro jiný příkaz.

'Background Intelligent Transfer Service', 'Windows Time' |
    Out-File -FilePath $env:TEMP\services.txt

K předání výstupu jednoho příkazu jako vstupu parametru jinému příkazu můžete použít závorky.

Stop-Service -DisplayName (Get-Content -Path $env:TEMP\services.txt)

Tento koncept se podobá pořadí operací v Algebrě. Stejně jako jsou matematické operace v závorkách vypočítány jako první, příkaz uzavřený v závorkách se spustí před vnějším příkazem.

PowerShellGet

powershellget, modul, který je součástí PowerShellu verze 5.0 a vyšší, poskytuje příkazy ke zjišťování, instalaci, aktualizaci a publikování modulů PowerShellu a dalších položek v úložišti NuGet. Pro ty, kteří používají PowerShell verze 3.0 a novější, je PowerShellGet k dispozici také jako samostatný soubor ke stažení.

Galerie prostředí PowerShell je online úložiště hostované Microsoftem, které je navržené jako centrální centrum pro sdílení modulů, skriptů a dalších prostředků PowerShellu. Microsoft sice provozuje PowerShell Gallery, ale komunita PowerShellu přispívá většinou dostupných modulů a skriptů. Vzhledem ke zdroji těchto modulů a skriptů před integrací libovolného kódu z Galerie Prostředí PowerShell do vašeho prostředí buďte opatrní. Zkontrolujte a otestujte soubory z PowerShell Gallery v izolovaném testovacím prostředí. Tento proces zajišťuje zabezpečení a spolehlivost kódu, funguje podle očekávání a chrání vaše prostředí před potenciálními problémy nebo ohroženími zabezpečení vyplývajícími z neformátovaného kódu.

Mnoho organizací se rozhodne vytvořit vlastní interní privátní úložiště NuGet. Toto úložiště slouží ke dvojímu účelu. Zaprvé funguje jako bezpečné umístění pro ukládání modulů vyvinutých v domácnosti, které jsou určeny výhradně pro interní použití. Za druhé poskytuje prověřenou kolekci modulů, které pocházejí externě, včetně modulů z veřejných úložišť. Společnosti obvykle provádějí důkladný ověřovací proces před přidáním těchto externích modulů do interního úložiště. Tento proces je důležitý pro zajištění, že moduly neobsahují škodlivý obsah a odpovídají bezpečnostním a provozním standardům společnosti.

Pomocí rutiny Find-Module, která je součástí modulu PowerShellGet, k nalezení modulu v Galerii PowerShell, který jsem napsal(a) a jmenuje se MrToolkit.

Find-Module -Name MrToolkit
NuGet provider is required to continue
PowerShellGet requires NuGet provider version '2.8.5.201' or newer to
interact with NuGet-based repositories. The NuGet provider must be available
 in 'C:\Program Files\PackageManagement\ProviderAssemblies' or
'C:\Users\mikefrobbins\AppData\Local\PackageManagement\ProviderAssemblies'.
You can also install the NuGet provider by running 'Install-PackageProvider
-Name NuGet -MinimumVersion 2.8.5.201 -Force'. Do you want PowerShellGet to
install and import the NuGet provider now?
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"):

Version    Name                      Repository        Description
-------    ----                      ----------        -----------
1.3        MrToolkit                 PSGallery         Misc PowerShell Tools

Při prvním použití jednoho z příkazů z modulu PowerShellGet se zobrazí výzva k instalaci zprostředkovatele NuGet.

Pokud chcete nainstalovat modul MrToolkit, předejte předchozí příkaz do Install-Module.

Find-Module -Name MrToolkit | Install-Module -Scope CurrentUser
Untrusted repository
You are installing the modules from an untrusted repository. If you trust
this repository, change its InstallationPolicy value by running the
Set-PSRepository cmdlet. Are you sure you want to install the modules from
'https://www.powershellgallery.com/api/v2'?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help
(default is "N"):y

Vzhledem k tomu, že PowerShell Gallery je nedůvěryhodné úložiště, vyzve vás ke schválení instalace modulu.

Snadné hledání vstupu do potrubí

Modul MrToolkit obsahuje funkci s názvem Get-MrPipelineInput. Tento cmdlet je navržen tak, aby uživatelům poskytl pohodlnou metodu pro identifikaci parametrů příkazu, který je schopen přijímat vstup potrubí. Konkrétně ukazuje tři klíčové aspekty:

  • Které parametry příkazu můžou přijímat vstup potrubí
  • Typ objektu, který každý parametr přijímá
  • Bez ohledu na to, jestli přijímají vstup kanálu podle hodnoty nebo podle názvu vlastnosti

Tato funkce výrazně zjednodušuje proces porozumění a využití možností kanálu příkazů PowerShellu.

Informace získané analýzou dokumentace nápovědy je možné určit pomocí této funkce.

Get-MrPipelineInput -Name Stop-Service | Format-List
ParameterName                   : InputObject
ParameterType                   : System.ServiceProcess.ServiceController[]
ValueFromPipeline               : True
ValueFromPipelineByPropertyName : False

ParameterName                   : Name
ParameterType                   : System.String[]
ValueFromPipeline               : True
ValueFromPipelineByPropertyName : True

Shrnutí

V této kapitole jste se dozvěděli o složitostech jednořádkových příkazů PowerShellu. Také jste se dozvěděli, že počet fyzických řádků příkazu není relevantní pro jeho klasifikaci jako jednořádkový příkaz PowerShellu. Dále jste se dozvěděli o klíčových konceptech, jako je filtrování doleva, potrubí a PowerShellGet.

Přezkoumání

  1. Co je jednorázový příkaz v PowerShellu?
  2. Jaké znaky v PowerShellu mohou způsobovat přirozené zalomení řádků?
  3. Proč byste měli filtrovat doleva?
  4. Jaké jsou dva způsoby, jak může příkaz PowerShellu přijímat vstup z kanálu?
  5. Proč byste neměli důvěřovat příkazům nalezeným v PowerShell Gallery?

Odkazy

Další kroky

V další kapitole se seznámíte s formátováním, aliasy, poskytovateli a operátory porovnání.