PowerShell
Arbetar med PowerShell-pipeline
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
- steg - kopiera den första filen (i
Copy-file
filtråd) - steg - kopiera andra filen (i
Copy-file
filtråd) och samtidigt Kryptera den första (iEncrypt-File
) - steg - kopiera tredje fil (i
Copy-file
filtråd) och kryptera samtidigt andra fil (iEncrypt-File
) och samtidigtget-Md5
av den första (iGet-Md5
)