Question [Fonction] Créer 1 paramètre de type ErrorVariable

Plus d'informations
il y a 7 ans 3 mois #15033 par Laurent Dardenne
L'usage d'ErrorVariable sur un cmdlet ou une fonction permet de créer une collection contenant les erreurs déclenchées par ce cmdlet et seulement celles-ci.

Pour ce type de comportement lié à un paramètre, on lui indique un nom de variable en tant que valeur de paramètre.
On peut soit recrée à chaque appel la variable, soit la compléter.

Les syntaxes utilisées sont les suivantes :
[code:1]
Get-UnTruc -ErrorVariable NomDeVariable #création
Get-UnTruc -ErrorVariable +NomDeVariable # addition
[/code:1]
Voir aussi l'aide : help about_common_parameters

Pour un traitement de validation de régles, j'ai eu besoin de connaître à partir d'une collection, les objets valides d'une part et ceux invalides d'autres part.
Seul les objets valides sont émis, si besoin, dans le pipeline, les autres sont ajoutés dans une collection dédiée et accessible dans le code de l'appelant.
Ce peut également être une espèce de \"corbeille\" contenant les objets à corriger, un reste à faire.

Voici le squelette d'une implémentation d'un paramètre de type ErrorVariable :
[code:1]
$ModuleFullName=\"C:\temp\TestDatas.psm1\"
@'
function Test-Datas {
[CmdletBinding(DefaultParameterSetName=\"Boolean\"«»)]
#Valide des régles de gestion sur un PSObject
param(
[Parameter(Mandatory=$true,ValueFromPipeline=$true)]
[ValidateNotNull()]
$Datas,
[Parameter(Position=1, Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[String] $VarName
)

begin {
$RemainingDatas=$null
$isAddition=$VarName.StartsWith(\"+\", [StringComparison]::Ordinal) #Détermine si on réutilise la collection
$isCreated=$false #On doit savoir si on insére la variable dans le code de l'appelant

Write-Debug \"isAddition=$isAddition\" #<%REMOVE%>
Write-Debug \"isCreated=$isCreated\" #<%REMOVE%>
Write-Debug \"The variable name is '$Varname'\" #<%REMOVE%>

#L'utilisateur souhaite réutiliser la variable si elle existe, sinon on la crée
if ($isAddition)
{
Write-Debug \"Addition detected. Retrieve the PSVariable\" #<%REMOVE%>
$VarName=$VarName.Substring(1)
$RemainingDatas=$PSCmdlet.SessionState.PSVariable.Get($VarName).Value
}

if ($RemainingDatas -eq $null -and ($isAddition -eq $true) )
{
Write-Debug \"Create the variable $Varname\" #<%REMOVE%>
$RemainingDatas= New-Object System.Collections.ArrayList
$isCreated=$true
}
}

process {
Write-Debug \"isAddition=$isAddition\" #<%REMOVE%>
Write-Debug \"isCreated=$isCreated\" #<%REMOVE%>

#On crée la variable dans l'état de session du code appelant
#Dans le cas d'usage : -NomDeParametre +NomDeVariable
#il n'est pas nécessaire réinjecter les données à chaque objet reçu du pipeline
#car une fois la variable $VarName crée, la référence sur $RemainingDatas reste valide.
if ($isAddition -and $isCreated)
{
Write-Debug \"Inject the new variable $Varname in the caller's runspace\" #<%REMOVE%>
$PSCmdlet.SessionState.PSVariable.Set($VarName,$RemainingDatas)
$isCreated=$false
}
#Dans le cas d'usage : -NomDeParametre NomDeVariable
#On réinitialise la variable à chaque appel
#Dans le code appelant, la variable $Varname créée reste accessible dans
#les lignes suivant l'appel de la fonction créant la variable $VarName
if ($isAddition -eq $false)
{
Write-Debug \"Recreate and inject the new variable $Varname in the caller's runspace\" #<%REMOVE%>
$RemainingDatas= New-Object System.Collections.ArrayList
$PSCmdlet.SessionState.PSVariable.Set($VarName,$RemainingDatas)
}
[void]$RemainingDatas.Add($Datas) #Soit on ajoute la donnée à la collection nommée $Varname
Write-Output $datas #soit on l'émet dans le pipeline si besoin,

}#process
} # Test-Datas
'@ > $ModuleFullName
[/code:1]
Notez que le nom de variable peut être '++Errors' ou ' + Errors', c'est à vous, comme pour -Errorvariable[/i], de vous assurer du nommage du nom de variable.
Ce code peut être placé dans un module, pour une fonction ou un script la contrainte est que le nom de variable doit être précédé du mot-clé 'global:' sinon la variable n'est pas créée dans la portée de l'appelant, le code de création ne générant pas d'erreur.

Exemples d'usage :
[code:1]
cls
import-module $ModuleFullName -force
rv myvar
#création
Test-Datas -datas \"10\" myvar
write-warning \"Count=$($myvar.count)\"
#ajoute un élément
$myvar.Add(20)
write-warning \"Count=$($myvar.count)\"

#recréation
Test-Datas -datas \"20\" myvar
write-warning \"Count=$($myvar.count)\"
#ajoute un élément
$myvar.Add(20)
write-warning \"Count=$($myvar.coun
#Compléte la collection existante
Test-Datas -datas \"10\" +myvar
write-warning \"Count=$($myvar.count)\"
#Compléte la collection existante
Test-Datas -datas \"30\" +myvar
write-warning \"Count=$($myvar.count)\"
$myvar

rv myvar
#création puis ajout dans la collection existante
#$myvar est accessible dans les instructions suivantes
1..5|Test-Datas +myvar|%{ write-host \"count=$($myvar.count)\"}
#Réutilisation d'une variable existante dans la porté de l'appelant
&{
1..15|Test-Datas +myvar
write-host \"Nouvelle portée. Count=$($myvar.count)\"
}
write-host \"count=$($myvar.count)\"

#Création d'une nouvelle variable dans la porté de ce bloc de code
&{
$myvar=$null
1..15|Test-Datas +myvar
write-host \"Nouvelle portée. Count=$($myvar.count)\"
}
#Variable $Myvar de la portée courante
write-host \"count=$($myvar.count)\"
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 4/04/16 17:34

Tutoriels PowerShell

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

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