Recherche…


Introduction

PowerShell introduit un modèle de pipeline d'objets, qui vous permet d'envoyer des objets entiers dans le pipeline vers des commandes consommatrices ou (au moins) la sortie. Contrairement au pipeline à cordes classique, les informations contenues dans les objets canalisés ne doivent pas nécessairement se trouver sur des positions spécifiques. Les commandlets peuvent déclarer interagir avec les objets du pipeline en tant qu'entrée, tandis que les valeurs de retour sont envoyées automatiquement au pipeline.

Syntaxe

  • COMMENCER Le premier bloc. Exécuté une fois au début. L'entrée du pipeline ici est $ null, car elle n'a pas été définie.
  • PROCESS Le deuxième bloc. Exécuté pour chaque élément du pipeline. Le paramètre de pipeline est égal à l'élément actuellement traité.
  • FIN Dernier bloc. Exécuté une fois à la fin. Le paramètre de pipeline est égal au dernier élément de l'entrée, car il n'a pas été modifié depuis sa définition.

Remarques

Dans la plupart des cas, l'entrée du pipeline sera un tableau d'objets. Bien que le comportement du bloc PROCESS{} puisse sembler similaire au bloc foreach{} , ignorer un élément du tableau nécessite un processus différent.

Si, comme dans foreach{} , vous avez continue à l'intérieur du bloc PROCESS{} , cela briserait le pipeline en ignorant toutes les instructions suivantes, y compris le bloc END{} . Au lieu de cela, utilisez return - cela mettra fin uniquement au bloc PROCESS{} pour l'élément en cours et passera au suivant.

Dans certains cas, il est nécessaire de générer le résultat des fonctions avec un codage différent. Le codage de la sortie de CmdLets est contrôlé par la variable $OutputEncoding . Lorsque la sortie est destinée à être placée dans un pipeline vers des applications natives, il peut être judicieux de corriger l'encodage pour correspondre à la cible $OutputEncoding = [Console]::OutputEncoding

Références supplémentaires:

Article de blog avec plus d'informations sur $OutputEncoding https://blogs.msdn.microsoft.com/powershell/2006/12/11/outputencoding-to-the-rescue/

Fonctions d'écriture avec cycle de vie avancé

Cet exemple montre comment une fonction peut accepter des entrées en pipeline et effectuer une itération efficace.

Notez que les structures de begin et de end de la fonction sont facultatives lors du process pipeline, mais ce process est requis lors de l'utilisation de ValueFromPipeline ou 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

Sortie:

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

Prise en charge de base du pipeline dans les fonctions

Voici un exemple de fonction avec le support le plus simple possible pour le traitement en pipeline.
Toute fonction avec prise en charge de pipeline doit avoir au moins un paramètre avec l'ensemble ParameterAttribute ValueFromPipeline ou ValueFromPipelineByPropertyName , comme indiqué ci-dessous.

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

$foo = 'Hello World!'

$foo | Write-FromPipeline

Sortie:

Hello World!

Remarque: Dans PowerShell 3.0 et versions ultérieures, les valeurs par défaut pour ParameterAttributes sont prises en charge. Dans les versions antérieures, vous devez spécifier ValueFromPipeline=$true .

Concept de travail du pipeline

Dans une série de pipeline, chaque fonction est parallèle aux autres, comme les threads parallèles. Le premier objet traité est transmis au pipeline suivant et le traitement suivant est immédiatement exécuté dans un autre thread. Cela explique le gain de vitesse élevé par rapport à la norme ForEach

@( bigFile_1, bigFile_2, ..., bigFile_n) | Copy-File | Encrypt-File | Get-Md5
  1. étape - copier le premier fichier (dans le fichier de Copy-file )
  2. étape - copier le second fichier (dans Copy-file thread de Copy-file ) et simultanément chiffrer le premier (dans Encrypt-File )
  3. étape - copier un troisième fichier (dans Copy-file thread de Copy-file ) et chiffrer simultanément le second fichier (dans Encrypt-File ) et get-Md5 simultanément le get-Md5 du premier (dans Get-Md5 )


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow