Sök…


Introduktion

PowerShell introducerar en objektledningsmodell som låter dig skicka hela objekt ner genom pipelinjen till konsumerar kommandon eller (åtminstone) utgången. Till skillnad från klassisk strängbaserad rörledning behöver information i rörobjekt inte vara på specifika positioner. Kommandon kan förklara att de interagerar med objekt från pipeline som inmatning, medan returvärden skickas automatiskt till pipeline.

Syntax

  • BEGIN Det första blocket. Kördes en gång i början. Rörledningsingången här är $ null eftersom den inte har ställts in.
  • PROCESS Det andra blocket. Utförs för varje element i rörledningen. Pipeline-parametern är lika med det för närvarande behandlade elementet.
  • END Sista blocket. Kördes en gång i slutet. Pipeline-parametern är lika med det sista elementet i ingången, eftersom den inte har ändrats sedan den inställdes.

Anmärkningar

I de flesta fall kommer ingången till rörledningen att vara en rad objekt. Även om beteendet hos PROCESS{} -blocket kan tyckas vara lika med foreach{} -blocket, hoppar du över ett element i arrayen krävs det en annan process.

Om du, som i foreach{} , continue i blocket PROCESS{} , skulle det bryta pipeline och hoppa över alla följande påståenden inklusive blocket END{} . Använd istället return - det kommer bara att avsluta PROCESS{} -blocket för det aktuella elementet och gå till nästa.

I vissa fall finns det ett behov av att mata ut resultatet av funktioner med olika kodningar. Kodningen av utgången från CmdLets styrs av variabeln $OutputEncoding . När utgången är avsedd att läggas i en pipeline till ursprungliga applikationer kan det vara en bra idé att fixa kodningen så att den matchar målet $OutputEncoding = [Console]::OutputEncoding

Ytterligare referenser:

Bloggartikel med mer insikt om $OutputEncoding https://blogs.msdn.microsoft.com/powershell/2006/12/11/outputencoding-to-the-rescue/

Skrivfunktioner med avancerad livscykel

Detta exempel visar hur en funktion kan acceptera rörledningsinmatning och iterera effektivt.

Observera att begin och end strukturer funktionen är valfria när sluss, men att process krävs vid användning ValueFromPipeline eller ValueFromPipelineByPropertyName .

function Write-FromPipeline{
    [CmdletBinding()]
    param(
        [Parameter(ValueFromPipeline)]
        $myInput
    )
    begin {
        Write-Verbose -Message "Beginning Write-FromPipeline" 
    }
    process {
        Write-Output -InputObject $myInput
    }
    end {
        Write-Verbose -Message "Ending Write-FromPipeline"
    }
}

$foo = 'hello','world',1,2,3

$foo | Write-FromPipeline -Verbose

Produktion:

VERBOSE: Beginning Write-FromPipeline
hello
world
1
2
3
VERBOSE: Ending Write-FromPipeline

Grundläggande rörledningssupport i funktioner

Detta är ett exempel på en funktion med det enklaste möjliga stödet för rörledning.
Alla funktioner med pipeline support måste ha minst en parameter med ParameterAttribute ValueFromPipeline eller ValueFromPipelineByPropertyName uppsättning, som visas nedan.

function Write-FromPipeline {
    param(
        [Parameter(ValueFromPipeline)]  # This sets the ParameterAttribute
        [String]$Input
    )
    Write-Host $Input
}

$foo = 'Hello World!'

$foo | Write-FromPipeline

Produktion:

Hello World!

Obs: I PowerShell 3.0 och senare stöds standardvärden för ParameterAttribut. I tidigare versioner måste du ange ValueFromPipeline=$true .

Arbetsbegrepp rörledning

I en pipeline-serie går varje funktion parallellt med de andra, som parallella trådar. Det första bearbetade objektet överförs till nästa pipeline och nästa behandling utförs omedelbart i en annan tråd. Detta förklarar förstärkningen av hög hastighet jämfört med standard ForEach

@( bigFile_1, bigFile_2, ..., bigFile_n) | Copy-File | Encrypt-File | Get-Md5
  1. steg - kopiera den första filen (i Copy-file filtråd)
  2. steg - kopiera andra filen (i Copy-file filtråd) och samtidigt Kryptera den första (i Encrypt-File )
  3. steg - kopiera tredje fil (i Copy-file filtråd) och kryptera samtidigt andra fil (i Encrypt-File ) och samtidigt get-Md5 av den första (i Get-Md5 )


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow