Question [V2]Retrouver les paramètres utilisant le pipe

Plus d'informations
il y a 16 ans 1 mois #6104 par Laurent Dardenne
Voici 2 fonctions permettant de retrouver les paramètres d'une commande utilisant le pipeline.
[code:1]
New-Alias gppb Get-PipelineParametersBinding
function Get-PipelineParametersBinding{
#requires -Version 2.0

#Renvoi un tableau d'objets personnalisés .
#Les membres sont :
# le nom du paramètre, le nom de la commande,
# ces modes de liaison (ValueFromPipeline ou ValueFromPipelineByPropertyName),
# s'il s'agit d'un alias et dans ce cas le nom de la propriété référencée.

param (
[ValidateNotNull()]
[Parameter(ValueFromPipeline = $true,
HelpMessage=\"Commande à analyser.\"«»)]
[string]$cmd,
[Parameter(HelpMessage=\"Précise le type de la commande à rechercher.\"«»)]
[System.Management.Automation.CommandTypes] $TypeCmd=\"All\"«»)

process {
$InfoCommand=@(Get-Command -CommandType $TypeCmd $cmd)
if ($InfoCommand.Count -gt 1)
{ Throw \"Il existe plusieurs type de commande de même nom. Précisez le nom du type.\" }

if ($InfoCommand[0].CommandType -eq \"Alias\"«»)
{
$InfoCommand[0]=gcm (Get-Alias $cmd).Definition
if ($InfoCommand[0].CommandType -eq \"Application\"«»)
{ Throw \"L'alias $cmd référence une commande de type 'Application' qui ne posséde pas de paramètre.\" }
}
#Parcourt la liste des paramètres d'une commande
$Liste=@($InfoCommand[0].Parameters.GetEnumerator()|
Foreach {
$CurrentParameter=$_.Value
#Parcourt la liste des attributs d'un paramètre
$_.Value.Attributes.GetEnumerator()|
Where {$_.TypeID -eq [System.Management.Automation.ParameterAttribute]} |
Where {$_.ValueFromPipeline -or $_.ValueFromPipelineByPropertyName}|
#Renvoi les paramètres de la commande
#pouvant être utilisés avec le pipeline.
Foreach {
$Obj=New-Object PSObject -Property @{
Name=$CurrentParameter.Name
ByValue=$_.ValueFromPipeline
ByPropertyName=$_.ValueFromPipelineByPropertyName
isAlias=$False
PropertyRef=$null
CommandName=$InfoCommand[0].Name}
$Obj
#Traite les alias du paramètre courant
if ($CurrentParameter.Aliases.count -gt 0)
{
$CurrentParameter.Aliases.GetEnumerator()|
Foreach {
New-Object PSObject -Property @{
Name=$_
ByValue=$Obj.ByValue
ByPropertyName=$Obj.ByPropertyName
isAlias=$True
PropertyRef=$Obj.Name
CommandName=$InfoCommand[0].Name}
}
}
}
})
#On force l'émission d'un tableau d'objets personnalisés
#pour chaque commande reçue.
,$Liste
}
}

New-Alias cppb Compare-PipelineParameterBinding
function Compare-PipelineParameterBinding(
[ValidateNotNull()]
[Parameter(HelpMessage=\"Object ciblé par la comparaison.\"«»)]
$Object,
[ValidateNotNull()]
[Parameter(ValueFromPipeline = $true,
HelpMessage=\"Liste des paramètres à comparer.\"«»)]
$PipelineParameters) {
#requires -Version 2.0

#Renvoi un tableau d'objets personnalisés contenant
#les noms de propriétés pouvant être liées à un cmdlet
#via le pipeline. Ce tableau peut être vide.
#
process{
$PipelineParameters|
Foreach {
if ($Object.PSObject.Properties.match($_.name) -ne $null)
{$_}
}
}
}
[/code:1]
On recherche la liste des propriétés d'un objet fichier pouvant être liées automatiquement à certains paramètres de la commande Remove-Item lorqu'elle utilisée est avec le pipeline.
[code:1]
$Files=dir
$liste=Get-PipelineParametersBinding Remove-Item
Compare-PipelineParameterBinding $Files[-1] $Liste
[/code:1]
Renvoi l'objet suivant :
[code:1]
# CommandName : Remove-Item
# Name : PSPath
# isAlias : True
# ByValue : False
# PropertyRef : LiteralPath
# ByPropertyName : True
[/code:1]
La propriété PSPath du fichier sera donc utilisée lors de la liaison avec la commande Remove-Item.
D'autres exemples :
[code:1]
$liste=Get-PipelineParametersBinding Stop-Process
$Process=get-process
Compare-PipelineParameterBinding $Process[-1] $Liste
#On peut supprimer un process en utilisant les propriétés suivantes :
# Name : Name
# Name : ProcessName (alias)
# Name : Id

$Files=dir
Compare-PipelineParameterBinding $Files[-1] (gppb Remove-Item)

gcm -noun item|Foreach { cppb $Files[-1] (gppb $_) }

$Result=gcm -noun item|
gppb|
cppb $Files[-1]

$Result|Group-Object -property name,byvalue #,commandname
$Result|Out-Gridview
[/code:1]

Tutoriels PowerShell

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

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