Question saut dans foreach

Plus d'informations
il y a 11 ans 10 mois #11650 par MEURY Nikolaus
saut dans foreach a été créé par MEURY Nikolaus
Bonjour, j'ai un petit soucis dans mon scrpit.

Je parcours une table de hash pour vérifier un fichier de config

[code:1]
foreach ($_ in $table_hash.keys)
{
if ($table_hash[$_].containskey(\"base_folder\") -eq $false) {echo \"Error: no param base_folder in [$_]\";exit}
if ($table_hash[$_].containskey(\"base_subfolder\") -eq $false) {echo \"Error: no param base_subfolder in [$_]\";exit}
if ($table_hash[$_].containskey(\"base_file\") -eq $false) {echo \"Error: no param base_file in [$_]\";exit}
}
[/code:1]


Mon fichier de config contient des sections comme suit :

[code:1]
[toto]
base_foder=\"toto\"
base_subfolder=\"\"
base_file=\"toto-db\"

[titi]
base_folder=\"titi\"
base_subfolder=\"sub\"
base_file=\"titi\"
[/code:1]

Je voudrais continuer à parcourir ma table de hash même si je rencontre une erreur sur la première section et passer à la suivante.

Comment je peux faire un saut dès que je rencontre une erreur sur un de mes trois test pour reprendre à la section suivante ?

J'ai trouvé

$foreach.moveNext()


Mais pour le moment je ne parviens pas à l'exploiter.

Merci d'avance :laugh:

Message édité par: Nicky, à: 25/04/12 17:00<br><br>Message édité par: Nicky, à: 25/04/12 17:02

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

Plus d'informations
il y a 11 ans 10 mois #11652 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:saut dans foreach
Salut,
utilise l'instruction \&quot;Continue\&quot;:
[code:1]
$table_hash=@{
toto=@{
base_folder=\&quot;toto\&quot;;
base_subfolder=\&quot;\&quot;;
base_file=\&quot;toto-db\&quot;
};
Error1=@{
base_folder=\&quot;toto\&quot;;
base_file=\&quot;toto-db\&quot;
};
titi=@{
base_folder=\&quot;titi\&quot;;
base_subfolder=\&quot;sub\&quot;;
base_file=\&quot;titi\&quot;
};
Error2=@{
base_folder=\&quot;toto\&quot;;
base_subfolder=\&quot;\&quot;;
}

}

$DebugPreference=\&quot;Continue\&quot;
foreach ($_ in $table_hash.keys)
{
Write-Debug \&quot;Current Key =$_\&quot;
if ($table_hash[$_].containskey(\&quot;base_folder\&quot;«») -eq $false) {echo \&quot;Error: no param base_folder in [$_]\&quot;;Continue}
if ($table_hash[$_].containskey(\&quot;base_subfolder\&quot;«») -eq $false) {echo \&quot;Error: no param base_subfolder in [$_]\&quot;;Continue}
if ($table_hash[$_].containskey(\&quot;base_file\&quot;«») -eq $false) {echo \&quot;Error: no param base_file in [$_]\&quot;;Continue}
Write-Debug \&quot;Next\&quot;
}

foreach ($_ in $table_hash.keys)
{
Write-Debug \&quot;Current Key =$_\&quot;
if ($table_hash[$_].containskey(\&quot;base_folder\&quot;«») -eq $false) {echo \&quot;Error: no param base_folder in [$_]\&quot;;$foreach.MoveNext()}
if ($table_hash[$_].containskey(\&quot;base_subfolder\&quot;«») -eq $false) {echo \&quot;Error: no param base_subfolder in [$_]\&quot;;$foreach.MoveNext()}
if ($table_hash[$_].containskey(\&quot;base_file\&quot;«») -eq $false) {echo \&quot;Error: no param base_file in [$_]\&quot;;$foreach.MoveNext()}
Write-Debug \&quot;Next\&quot;
}
[/code:1]
Je te laisse étudier la méthode MoveNext de l'itérateur :)

Tutoriels PowerShell

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

Plus d'informations
il y a 11 ans 10 mois #11659 par MEURY Nikolaus
Réponse de MEURY Nikolaus sur le sujet Re:saut dans foreach
Nickel, PoSH offre tout de même bcp de subtilité.

C'est assez impressionnant ce que l'on peut faire en quelques lignes quand on connait le langage.


Merci bcp Laurent ^^

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

Plus d'informations
il y a 11 ans 10 mois #11661 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:saut dans foreach
Nicky écrit:

PoSH offre tout de même bcp de subtilité.

Je comprend l'intention, mais je doute du terme.
Nicky écrit:

C'est assez impressionnant ce que l'on peut faire en quelques lignes quand on connait le langage.

C'est le reflet, je pense, de sa conception.
Sa grammaire n'est pas si développée que ça, mais les opérations de haut niveau qu'il propose le rendent puissant pour du scripting.
Nicky écrit:

Merci bcp Laurent ^^

Merci, c'est déjà bien.
Mais j'utiliserais le beaucoup pour ceux (et rarement celles, on se demande pourquoi...) qui en sont avare :-)

Ensuite j'avais ce besoin de contrôle de structure d'une hashtable, notamment pour la fonction Replace-String .
J'ai laissé tombé, mais ton post a réveillé ce besoin, j'ai donc codé une fonction testant une structure d'après ton principe.
Mais je vais laisser reposer le paton avant de le poster ;-)<br><br>Message édité par: Laurent Dardenne, à: 26/04/12 22:53

Tutoriels PowerShell

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

Plus d'informations
il y a 11 ans 10 mois #11690 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:saut dans foreach
Une autre solution plus générique, on teste la présence de clés via un tableau :
[code:1]
$table_hash=new-object System.Collections.Specialized.OrderedDictionary
$table_hash.toto=@{
base_folder=\&quot;toto\&quot;;
base_subfolder=\&quot;\&quot;;
base_file=\&quot;toto-db\&quot;
}
$table_hash.Error1=@{
base_folder=\&quot;toto\&quot;;
base_file=\&quot;toto-db\&quot;
}
$table_hash.Integer=10
$table_hash.titi=@{
base_folder=\&quot;titi\&quot;;
base_subfolder=\&quot;sub\&quot;;
base_file=\&quot;titi\&quot;
}
$table_hash.Error2=@{
base_folder=\&quot;toto\&quot;;
base_subfolder=\&quot;\&quot;;
}
$table_hash.Array=@(1,2,3)
$table_hash.EmptyHT=@{}
$table_hash.NullValue=$Null

$DebugPreference=\&quot;Continue\&quot;
[String[]]$ClésAControler=@(\&quot;base_folder\&quot;,\&quot;base_subfolder\&quot;,\&quot;base_file\&quot;«»)

Function Test-HashTableKeys{
[cmdletBinding()]
param(
#hashtable à contrôler
#On autorise une hashtable vide.
[ValidateNotNull()]
[Parameter(Position=0, Mandatory=$true)]
[System.Collections.IDictionary] $Hashtable,
#liste des clés à tester
[ValidateNotNullOrEmpty()]
[Parameter(Position=1, Mandatory=$true)]
[String[]] $ControlKeys,
#Nom de la clé ou de la variable portant la hashtable
[Parameter(Position=2, Mandatory=$false)]
[String] $EntryName,
#En cas de clé manquante déclenche une erreur bloquante.
#On peut donc valider la totalité des clés ou s'arrêter à la première erreur.
[switch] $Strict
)

function Convert-DictionnaryEntry($Parameters)
{ #Converti un DictionnaryEntry en une string \&quot;clé=valeur clé=valeur...\&quot;
\&quot;$($Parameters.GetEnumerator()|% {\&quot;$($_.key)=$($_.value)\&quot;})\&quot;
}#Convert-DictionnaryEntry

Write-Debug \&quot;`tContrôle l'entrée $EntryName\&quot;
# Si $ErrorView=\&quot;CategoryView\&quot; le contenu de ParameterString est affiché.
$ParameterString=\&quot;$EntryName = @{$(Convert-DictionnaryEntry $Hashtable)}\&quot;
$ControlKeys|
Where {$Currentkey=$_;-not $Hashtable.ContainsKey($Currentkey)}|
Foreach {
Write-Debug \&quot;La clé $CurrentKey n'existe pas\&quot;
$Exception=New-Object System.ArgumentException(\&quot;The key do not exist.\&quot;,$Currentkey)
#Todo Exception personnelle contenant le nom de la clé manquante.
$ErrorRecord=New-Object System.Management.Automation.ErrorRecord($Exception,\&quot;WellFormedKeyUnknown\&quot;,\&quot;InvalidData\&quot;,$ParameterString)
if ($Strict)
{$PSCmdlet.ThrowTerminatingError($ErrorRecord) }
else
{$PSCmdlet.WriteError($ErrorRecord) }
}
}#Test-HashTableKeys


Function Test-HashTableStructure{
param(
#Porte les informations de la variable à analyser
[Parameter(Position=0, Mandatory=$true)]
[ValidateNotNull()]
[ValidateScript( { $_.Value -is [System.Collections.IDictionary] })]
[System.Management.Automation.PSVariable] $PSVariable,
#Listes des clés a rechercher, considérées comme obligatoires
[Parameter(Position=1, Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[String[]] $ControlKeys,
[switch] $Strict
)
Write-Debug \&quot;Hashtable à contrôler $($PSVariable.Name)\&quot;
$PSVariable.Value.GetEnumerator()|
Where {
Write-Debug \&quot;Teste l'entrée $($_.Key)\&quot;
($_.Value -ne $Null) -and ($_.Value -is [System.Collections.IDictionary])
}|
Foreach {
Write-Debug \&quot;L'entrée $($_.Key) contient une hashtable\&quot;
Test-HashTableKeys $_.Value $ControlKeys $_.Key -Strict:$Strict
}
}#Test-HashTableStructure
Test-HashTableStructure (gv table_hash) $ClésAControler
$ErrorView=\&quot;CategoryView\&quot;
Test-HashTableStructure (gv table_hash) $ClésAControler
$ErrorView=\&quot;NormalView\&quot;
Test-HashTableStructure (gv table_hash) $ClésAControler -Strict

Test-HashTableKeys $table_hash.toto $ClésAControler \&quot;Toto\&quot;
if($?) {Write-Host \&quot;Pas d'erreur\&quot;}
Test-HashTableKeys $table_hash.Error1 $ClésAControler Error1 -strict -ev Err -ea SilentlyContinue
if (-not $?) {Write-Host \&quot;Erreur detectée\&quot;}
[/code:1]
Il reste un soucis avec la gestion d'erreur :[code:1]
$ErrorActionPreference = \&quot;silentlycontinue\&quot;
Test-HashTableKeys $table_hash.Error1 $ClésAControler Error1 -strict -ev Err
if (-not $?) {Write-Host \&quot;Erreur detectée\&quot;}
[/code:1]
La paramètre ErrorVariable renvoi + erreurs au lieu d'une seule...

Tutoriels PowerShell

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

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