Question [Fonction]Opérateurs Linq à la PowerShell

Plus d'informations
il y a 16 ans 5 mois #5473 par Laurent Dardenne
Linq utilise le principe des pipelines dans un langage compilé, certains de ses opérateurs seraient les bienvenues dans PowerShell, en voici deux :
[code:1]
function Skip-While() {
# Jared Parsons, jaredpar's WebLog
# Skip while the condition is true
#Example Usage:
#
# 1..10 | Skip-While { $_ -lt 6 } renvoi 6 à 10
#Ignore des éléments dans une séquence tant que la condition spécifiée a la valeur true, puis retourne les éléments restants.

param ( [scriptblock]$pred = $(throw \"Need a predicate\"«») )
begin {
$skip = $true
}
process {
if ( $skip ) {
$skip = &$pred
}

if ( -not $skip ) {
$_
}
}
end {}
}

function Take-While() {
#jaredpar's WebLog
# Take elements from the pipeline while the predicate is true
#Example
#
# 1..10 | take-while {$_ -lt 6} renvoi 1..5
#Retourne des éléments d'une séquence tant que la condition spécifiée a la valeur true, puis ignore les éléments restants.

param ( [scriptblock]$pred = $(throw \"Need a predicate\"«») )
begin {
$take = $true
}
process {
if ( $take ) {
$take = &$pred
if ( $take ) {
$_
}
}
}
}
[/code:1]
Ici Skip-While permet de sélectionner le texte à afficher à partir d'une certaine ligne.
Ici on affiche la documentation, placée en fin de fichier, concernant les paramètres dynamiques des providers :
[code:1]Get-PSProvider|
Foreach {
Write-Host \"`r`nProvider: $($_.Name)\"
(get-help $_.Name -Category Provider|out-String).split(\"`r`n\",[StringSplitOptions]::RemoveEmptyEntries)|
#Ignore des éléments d'une séquence tant que la condition spécifiée a la valeur true,
#puis retourne les éléments restants.
Skip-While {$_ -notmatch \"^PARAMÈTRES DYNAMIQUES$\"}
}
[/code:1]
Take-While peut être utile pour supprimer le bloc de signature d'un script signé :
[code:1] gc Take-While.ps1|
#Retourne des éléments d'une séquence tant que la condition spécifiée a la valeur true,
#puis ignore les éléments restants.
Take-While {$_ -notmatch \"^# SIG # Begin signature block$\"}
[/code:1]
Le cmdlet Where-Object effectue un test sur chaque élément du pipeline, ici une fois la condition remplie, le test n'est plus effectué pour le reste de la collection.

[edit]
Pour récupérer un extrait de la documentation limité par deux bornes, on combinera les opérateurs Skip-While et Take-While :
[code:1]
Get-PSProvider|
Foreach {
Write-Host \"`r`nProvider: $($_.Name)\"
(get-help $_.Name -Category Provider|out-String).split(\"`r`n\",[StringSplitOptions]::RemoveEmptyEntries)|

Skip-While {$_ -notmatch \"^TÂCHES$\"}|
Take-While {$_ -notmatch \"^PARAMÈTRES DYNAMIQUES$\"}
}[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 17/10/09 18:06

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 5 mois #5476 par Laurent Dardenne
Correction du code, à l'origine l'auteur utilise $Args[0] et pas le pipeline...
[edit]
L'opérateur Sum peut être simulé à l'aide du cmdlet Measure-Object:
[code:1]
Dir *.ps1|Measure-Object -property Length -sum
[/code:1]
La propriété peut être un type string ou boolean,...
Dans ce cas le cmdlet tentera une conversion.<br><br>Message édité par: Laurent Dardenne, à: 27/10/09 16:49

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.045 secondes
Propulsé par Kunena