PowerShell
Travailler avec le pipeline PowerShell
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
- étape - copier le premier fichier (dans le fichier de
Copy-file
) - étape - copier le second fichier (dans
Copy-file
thread deCopy-file
) et simultanément chiffrer le premier (dansEncrypt-File
) - étape - copier un troisième fichier (dans
Copy-file
thread deCopy-file
) et chiffrer simultanément le second fichier (dansEncrypt-File
) etget-Md5
simultanément leget-Md5
du premier (dansGet-Md5
)