about_Pipelines

Rövid leírás

Parancsok egyesítése folyamatokba a PowerShellben

Hosszú leírás

A folyamatok folyamatkezelők () (|ASCII 124) által összekapcsolt parancsok sorozatai. Minden folyamatoperátor elküldi az előző parancs eredményeit a következő parancsnak.

Az első parancs kimenete elküldhető feldolgozásra a második parancs bemeneteként. Ezt a kimenetet pedig elküldheti egy másik parancsnak. Az eredmény egy összetett parancslánc vagy folyamat , amely egyszerű parancsok sorozatából áll.

Példa:

Command-1 | Command-2 | Command-3

Ebben a példában a rendszer elküldi a kibocsátott objektumokat Command-1 a következőnek Command-2: . Command-2 feldolgozza az objektumokat, és elküldi őket a következőnek Command-3: . Command-3 feldolgozza az objektumokat, és elküldi őket a folyamatba. Mivel a folyamatban nincs több parancs, az eredmények megjelennek a konzolon.

A folyamatokban a parancsok feldolgozása balról jobbra haladva történik. A feldolgozás egyetlen műveletként van kezelve, és a kimenet a generáláskor jelenik meg.

Íme egy egyszerű példa. Az alábbi parancs lekéri a Jegyzettömb folyamatot, majd leállítja azt.

Példa:

Get-Process notepad | Stop-Process

Az első parancs a parancsmagot használja a Get-Process Jegyzettömb-folyamatot képviselő objektum lekéréséhez. Folyamatkezelő (|) használatával küldi el a folyamatobjektumot a Stop-Process parancsmagnak, amely leállítja a Jegyzettömb-folyamatot. Figyelje meg, hogy a Stop-Process parancs nem rendelkezik név- vagy azonosítóparaméterrel a folyamat megadásához, mert a megadott folyamat a folyamaton keresztül lesz elküldve.

Ez a folyamat példája lekéri az aktuális könyvtárban lévő szövegfájlokat, csak a 10 000 bájtnál hosszabb fájlokat választja ki, hossz szerint rendezi őket, és megjeleníti az egyes fájlok nevét és hosszát egy táblázatban.

Get-ChildItem -Path *.txt |
  Where-Object {$_.length -gt 10000} |
    Sort-Object -Property length |
      Format-Table -Property name, length

Ez a folyamat négy parancsból áll a megadott sorrendben. Az alábbi ábrán az egyes parancsok kimenete látható, ahogy a folyamat következő parancsának továbbítja.

Get-ChildItem -Path *.txt
| (FileInfo objects for *.txt)
V
Where-Object {$_.length -gt 10000}
| (FileInfo objects for *.txt)
| (      Length > 10000      )
V
Sort-Object -Property Length
| (FileInfo objects for *.txt)
| (      Length > 10000      )
| (     Sorted by length     )
V
Format-Table -Property name, length
| (FileInfo objects for *.txt)
| (      Length > 10000      )
| (     Sorted by length     )
| (   Formatted in a table   )
V

Name                       Length
----                       ------
tmp1.txt                    82920
tmp2.txt                   114000
tmp3.txt                   114000

Folyamatok használata

A Legtöbb PowerShell-parancsmag a folyamatok támogatására lett kialakítva. A legtöbb esetben aGet parancsmag eredményeit egy másik, azonos főnévből álló parancsmagra is átadhatja. A parancsmag kimenetét Get-Service például átadhatja a Start-Service parancsmagoknak.Stop-Service

Ez a példafolyamat elindítja a WMI szolgáltatást a számítógépen:

Get-Service wmi | Start-Service

Egy másik példában a PowerShell beállításjegyzék-szolgáltatójának kimenetét Get-Item vagy Get-ChildItem azon belül is átadhatja a New-ItemProperty parancsmagnak. Ez a példa egy új, NoOfEmployees nevű bejegyzést ad hozzá a MyCompany beállításkulcshoz, amelynek értéke 8124.

Get-Item -Path HKLM:\Software\MyCompany |
  New-ItemProperty -Name NoOfEmployees -Value 8124

Számos segédprogram-parancsmag, például Get-Member, Where-Object, Sort-Object, Group-Objectés Measure-Object szinte kizárólag folyamatokban használatos. Ezekhez a parancsmagokhoz bármilyen objektumtípust átirányíthat. Ez a példa bemutatja, hogyan rendezheti a számítógépen lévő összes folyamatot az egyes folyamatokban megnyitott fogópontok száma alapján.

Get-Process | Sort-Object -Property handles

Az objektumokat a formázási, exportálási és kimeneti parancsmagokra, például Format-List, Format-Table, Export-Clixml, Export-CSVés Out-File.

Ez a példa bemutatja, hogyan jelenítheti meg a folyamatobjektum tulajdonságainak listáját a Format-List parancsmag használatával.

Get-Process winlogon | Format-List -Property *

A natív parancsok kimenetét a PowerShell-parancsmagokba is átirányíthatja. Például:

PS> ipconfig.exe | Select-String -Pattern 'IPv4'

   IPv4 Address. . . . . . . . . . . : 172.24.80.1
   IPv4 Address. . . . . . . . . . . : 192.168.1.45
   IPv4 Address. . . . . . . . . . . : 100.64.108.37

Fontos

A Siker és hiba streamek hasonlóak más rendszerhéjak stdin- és stderr-streamjeihez. Az stdin azonban nincs csatlakoztatva a PowerShell-folyamathoz bemenetként. További információ: about_Redirection.

Némi gyakorlással azt tapasztalhatja, hogy az egyszerű parancsok folyamatokba való kombinálása időt takarít meg és gépel, és hatékonyabbá teszi a szkriptek használatát.

A folyamatok működése

Ez a szakasz azt ismerteti, hogy a bemeneti objektumok hogyan kapcsolódnak a parancsmag paramétereihez, és hogyan lesznek feldolgozva a folyamat végrehajtása során.

Folyamatbemenet elfogadása

A pipelining támogatásához a fogadó parancsmagnak rendelkeznie kell egy olyan paraméterrel, amely fogadja a folyamat bemenetét. Get-Help A teljes vagy paraméteres beállításokkal rendelkező paranccsal állapítsa meg, hogy egy parancsmag mely paraméterei fogadják el a folyamat bemenetét.

Például annak megállapításához, hogy a parancsmag mely paraméterei fogadják el a Start-Service folyamatbemenetet, írja be a következőt:

Get-Help Start-Service -Full

vagy

Get-Help Start-Service -Parameter *

A parancsmag súgója Start-Service azt mutatja, hogy csak az InputObject és a Name paraméterek fogadják el a folyamatbemenetet.

-InputObject <ServiceController[]>
Specifies ServiceController objects representing the services to be started.
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 <String[]>
Specifies the service names for the service to be started.

The parameter name is optional. You can use Name or its alias, ServiceName,
or you can omit the parameter name.

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

Amikor objektumokat küld a folyamaton Start-Servicekeresztül, a PowerShell megpróbálja társítani az objektumokat az InputObject és a Name paraméterekkel.

Folyamatbemenet elfogadásának módszerei

A parancsmagok paraméterei kétféleképpen fogadhatják el a folyamat bemenetét:

  • ByValue: A paraméter olyan értékeket fogad el, amelyek megfelelnek a várt .NET-típusnak, vagy amelyek átalakíthatók erre a típusra.

    Például a Név paraméter Start-Service érték szerint fogadja el a folyamat bemenetét. Képes sztringobjektumok vagy sztringekké konvertálható objektumok elfogadására.

  • ByPropertyName: A paraméter csak akkor fogadja el a bemenetet, ha a bemeneti objektumnak ugyanaz a tulajdonsága, mint a paraméternek.

    A Name paraméter Start-Service például elfogadhatja a Name tulajdonságú objektumokat. Egy objektum tulajdonságainak listázásához a következőre kell átirányítani: Get-Member.

Egyes paraméterek érték- vagy tulajdonságnév alapján is elfogadhatnak objektumokat, így könnyebben fogadhatók be a folyamatból.

Paraméterkötés

Amikor egy parancsból egy másik parancsba irányítja az objektumokat, a PowerShell megpróbálja társítani a piped objektumokat a fogadó parancsmag paraméterével.

A PowerShell paraméterkötési összetevője a bemeneti objektumokat a parancsmag paramétereihez társítja az alábbi feltételek szerint:

  • A paraméternek bemenetet kell fogadnia egy folyamatból.
  • A paraméternek el kell fogadnia az elküldött objektum típusát, vagy olyan típust, amely a várt típusra konvertálható.
  • A paramétert nem használták a parancsban.

A parancsmagnak például Start-Service számos paramétere van, de csak kettő, a Név és az InputObject folyamatbemenetet fogad el. A Name paraméter sztringeket, az InputObject paraméter pedig szolgáltatásobjektumokat vesz fel. Ezért sztringek, szolgáltatásobjektumok és objektumok csövezhetők sztringekké vagy szolgáltatásobjektumokká alakítható tulajdonságokkal.

A PowerShell a lehető leghatékonyabban kezeli a paraméterkötést. A PowerShell nem javasolható és nem kényszeríthető egy adott paraméterhez való kötésre. A parancs meghiúsul, ha a PowerShell nem tudja kötni a piped objektumokat.

A kötési hibák elhárításával kapcsolatos további információkért lásd a cikk későbbi, folyamathibák kivizsgálását ismertető szakaszát.

Egyszeri feldolgozás

Az objektumok parancshoz való becsatolása hasonló ahhoz, mint amikor a parancs egy paraméterével küldi el az objektumokat. Lássunk egy példafolyamatot. Ebben a példában egy folyamattal jelenítjük meg a szolgáltatásobjektumok tábláját.

Get-Service | Format-Table -Property Name, DependentServices

Funkcionálisan ez olyan, mintha az InputObject paraméterrel Format-Table küldi el az objektumgyűjteményt.

Például menthetjük a szolgáltatások gyűjteményét egy olyan változóba, amelyet az InputObject paraméterrel adunk át.

$services = Get-Service
Format-Table -InputObject $services -Property Name, DependentServices

Vagy beágyazhatjuk a parancsot az InputObject paraméterbe.

Format-Table -InputObject (Get-Service) -Property Name, DependentServices

Van azonban egy fontos különbség. Amikor több objektumot továbbít egy parancshoz, a PowerShell egyenként továbbítja az objektumokat a parancsnak. Parancsparaméter használatakor az objektumok egyetlen tömbobjektumként lesznek elküldve. Ez a kisebb különbség jelentős következményekkel jár.

Folyamat végrehajtásakor a PowerShell automatikusan számbavételt hajt végre minden olyan típuson, amely megvalósítja az IEnumerable interfészt, és egyenként küldi el a tagokat a folyamaton keresztül. Ez alól kivételt képez a [hashtable]metódus meghívása GetEnumerator() .

Az alábbi példákban egy tömböt és egy kivonattáblát a rendszer a Measure-Object parancsmagra állítva számlálja meg a folyamattól kapott objektumok számát. A tömbnek több tagja van, a kivonattábla pedig több kulcs-érték párból áll. A rendszer egyszerre csak a tömböt számba adja.

@(1,2,3) | Measure-Object
Count    : 3
Average  :
Sum      :
Maximum  :
Minimum  :
Property :
@{"One"=1;"Two"=2} | Measure-Object
Count    : 1
Average  :
Sum      :
Maximum  :
Minimum  :
Property :

Hasonlóképpen, ha több folyamatobjektumot továbbít a Get-Process parancsmagból a parancsmagba, a Get-Member PowerShell minden folyamatobjektumot egyenként küld a parancsmagnak Get-Member. Get-Member A megjeleníti a folyamatobjektumok .NET-osztályát (típusát), valamint azok tulajdonságait és metódusait.

Get-Process | Get-Member
TypeName: System.Diagnostics.Process

Name      MemberType     Definition
----      ----------     ----------
Handles   AliasProperty  Handles = Handlecount
Name      AliasProperty  Name = ProcessName
NPM       AliasProperty  NPM = NonpagedSystemMemorySize
...

Megjegyzés

Get-Member kiküszöböli az ismétlődéseket, így ha az objektumok mind azonos típusúak, csak egy objektumtípust jelenít meg.

Ha azonban az InputObject paramétert Get-Memberhasználja, akkor Get-Member a System.Diagnostics.Process objektumokat egyetlen egységként kapja meg. Megjeleníti egy objektumtömb tulajdonságait. (Jegyezze fel a tömbszimbólumot ([]) a System.Object típus neve után.)

Példa:

Get-Member -InputObject (Get-Process)
TypeName: System.Object[]

Name               MemberType    Definition
----               ----------    ----------
Count              AliasProperty Count = Length
Address            Method        System.Object& Address(Int32 )
Clone              Method        System.Object Clone()
...

Előfordulhat, hogy ez az eredmény nem a kívánt eredmény. De miután megértette, használhatja. Például minden tömbobjektum rendelkezik Count (Darabszám ) tulajdonságmal. Ezzel megszámlálhatja a számítógépen futó folyamatok számát.

Példa:

(Get-Process).count

Fontos megjegyezni, hogy a folyamaton keresztül küldött objektumok egyenként érkeznek.

Natív parancsok használata a folyamatban

A PowerShell lehetővé teszi natív külső parancsok hozzáadását a folyamatba. Fontos azonban megjegyezni, hogy a PowerShell folyamata objektumorientált, és nem támogatja a nyers bájtadatokat.

A nyers bájtadatokat kiíró natív program kimenetének pipálása vagy átirányítása .NET-sztringekké alakítja a kimenetet. Ez az átalakítás a nyers adatok kimenetének sérülését okozhatja.

Áthidaló megoldásként hívja meg a natív parancsokat a | natív rendszerhéj által biztosított és az operátorok használatával cmd.exe /c vagy sh -c> használatával.

Folyamathibák kivizsgálása

Ha a PowerShell nem tudja társítani a piped objektumokat a fogadó parancsmag paraméterével, a parancs meghiúsul.

Az alábbi példában egy beállításjegyzék-bejegyzést próbálunk áthelyezni az egyik beállításkulcsból a másikba. A Get-Item parancsmag lekéri a cél elérési útját, amely ezután a Move-ItemProperty parancsmagra lesz átirányítva. A Move-ItemProperty parancs megadja az áthelyezni kívánt beállításjegyzék-bejegyzés aktuális elérési útját és nevét.

Get-Item -Path HKLM:\Software\MyCompany\sales |
Move-ItemProperty -Path HKLM:\Software\MyCompany\design -Name product

A parancs meghiúsul, és a PowerShell a következő hibaüzenetet jeleníti meg:

Move-ItemProperty : The input object can't be bound to any parameters for
the command either because the command doesn't take pipeline input or the
input and its properties do not match any of the parameters that take
pipeline input.
At line:1 char:23
+ $a | Move-ItemProperty <<<<  -Path HKLM:\Software\MyCompany\design -Name p

A vizsgálathoz használja a Trace-Command parancsmagot a PowerShell paraméterkötési összetevőjének nyomon követéséhez. Az alábbi példa a paraméterkötést követi nyomon a folyamat végrehajtása közben. A PSHost paraméter megjeleníti a nyomkövetési eredményeket a konzolon, és a FilePath paraméter elküldi a nyomkövetési eredményeket a debug.txt fájlnak későbbi referenciaként.

Trace-Command -Name ParameterBinding -PSHost -FilePath debug.txt -Expression {
  Get-Item -Path HKLM:\Software\MyCompany\sales |
    Move-ItemProperty -Path HKLM:\Software\MyCompany\design -Name product
}

A nyomkövetés eredményei hosszadalmasak, de a parancsmaghoz Get-Item kötött értékeket, majd a névvel ellátott értékeket a Move-ItemProperty parancsmaghoz kötik.

...
BIND NAMED cmd line args [`Move-ItemProperty`]
BIND arg [HKLM:\Software\MyCompany\design] to parameter [Path]
...
BIND arg [product] to parameter [Name]
...
BIND POSITIONAL cmd line args [`Move-ItemProperty`]
...

Végül azt mutatja, hogy az elérési útnak a sikertelen célparaméterhez való kötésére Move-ItemProperty tett kísérlet sikertelen volt.

...
BIND PIPELINE object to parameters: [`Move-ItemProperty`]
PIPELINE object TYPE = [Microsoft.Win32.RegistryKey]
RESTORING pipeline parameter's original values
Parameter [Destination] PIPELINE INPUT ValueFromPipelineByPropertyName NO
COERCION
Parameter [Credential] PIPELINE INPUT ValueFromPipelineByPropertyName NO
COERCION
...

Get-Help A parancsmaggal megtekintheti a Cél paraméter attribútumait.

Get-Help Move-ItemProperty -Parameter Destination

-Destination <String>
    Specifies the path to the destination location.

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

Az eredmények azt mutatják, hogy a Cél csak "tulajdonságnév alapján" veszi fel a folyamat bemenetét. Ezért a vezetékes objektumnak rendelkeznie kell egy Destination ( Cél) nevű tulajdonságmal.

A forrásból származó Get-Itemobjektum tulajdonságainak megtekintésére használhatóGet-Member.

Get-Item -Path HKLM:\Software\MyCompany\sales | Get-Member

A kimenet azt mutatja, hogy az elem egy Microsoft.Win32.RegistryKey objektum, amely nem rendelkezik Destination tulajdonságmal. Ez megmagyarázza, hogy miért nem sikerült a parancs.

Az Elérési út paraméter név vagy érték alapján fogadja el a folyamat bemenetét.

Get-Help Move-ItemProperty -Parameter Path

-Path <String[]>
    Specifies the path to the current location of the property. Wildcard
    characters are permitted.

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

A parancs javításához meg kell adnunk a célhelyet a Move-ItemProperty parancsmagban, és Get-Item le kell kérnünk az áthelyezni kívánt elem elérési útját .

Példa:

Get-Item -Path HKLM:\Software\MyCompany\design |
Move-ItemProperty -Destination HKLM:\Software\MyCompany\sales -Name product

Belső vonal folytatása

Amint azt már említettem, a folyamat olyan parancsok sorozata, amelyeket a folyamatüzemeltetők (|általában egyetlen sorban) csatlakoztatnak. Az olvashatóság érdekében azonban a PowerShell lehetővé teszi a folyamat több sorra bontását. Ha a vonal utolsó tokenje egy csőművelet, a PowerShell-elemző az aktuális parancshoz csatlakoztatja a következő sort a folyamat felépítésének folytatásához.

Például a következő egysoros folyamat:

Command-1 | Command-2 | Command-3

a következőképpen írható:

Command-1 |
  Command-2 |
    Command-3

A következő sorok kezdő szóközei nem jelentősek. A behúzás növeli az olvashatóságot.

A PowerShell 7 támogatja a folyamatok folytatását a vonal elején lévő folyamat karakterrel. Az alábbi példák bemutatják, hogyan használhatja ezt az új funkciót.

# Wrapping with a pipe at the beginning of a line (no backtick required)
Get-Process | Where-Object CPU | Where-Object Path
    | Get-Item | Where-Object FullName -match "AppData"
    | Sort-Object FullName -Unique

# Wrapping with a pipe on a line by itself
Get-Process | Where-Object CPU | Where-Object Path
    |
    Get-Item | Where-Object FullName -match "AppData"
    |
    Sort-Object FullName -Unique

Fontos

Amikor interaktívan dolgozik a rendszerhéjban, a kódot csak a sor elején lévő folyamatokkal illessze be, amikor a Ctrl+V billentyűkombinációt használja a beillesztéshez. A jobb gombbal kattintva beilleszthető műveletek egyenként szúrják be a sorokat. Mivel a sor nem folyamat karakterrel végződik, a PowerShell befejezettnek tekinti a bemenetet, és a beírt módon hajtja végre a sort.

Lásd még