Question
saut dans foreach
- MEURY Nikolaus
- Auteur du sujet
- Hors Ligne
- Nouveau membre
Réduire
Plus d'informations
- Messages : 14
- Remerciements reçus 0
il y a 12 ans 5 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é
Mais pour le moment je ne parviens pas à l'exploiter.
Merci d'avance
Message édité par: Nicky, à: 25/04/12 17:00<br><br>Message édité par: Nicky, à: 25/04/12 17:02
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
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 12 ans 5 mois #11652
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:saut dans foreach
Salut,
utilise l'instruction \"Continue\":
[code:1]
$table_hash=@{
toto=@{
base_folder=\"toto\";
base_subfolder=\"\";
base_file=\"toto-db\"
};
Error1=@{
base_folder=\"toto\";
base_file=\"toto-db\"
};
titi=@{
base_folder=\"titi\";
base_subfolder=\"sub\";
base_file=\"titi\"
};
Error2=@{
base_folder=\"toto\";
base_subfolder=\"\";
}
}
$DebugPreference=\"Continue\"
foreach ($_ in $table_hash.keys)
{
Write-Debug \"Current Key =$_\"
if ($table_hash[$_].containskey(\"base_folder\"«») -eq $false) {echo \"Error: no param base_folder in [$_]\";Continue}
if ($table_hash[$_].containskey(\"base_subfolder\"«») -eq $false) {echo \"Error: no param base_subfolder in [$_]\";Continue}
if ($table_hash[$_].containskey(\"base_file\"«») -eq $false) {echo \"Error: no param base_file in [$_]\";Continue}
Write-Debug \"Next\"
}
foreach ($_ in $table_hash.keys)
{
Write-Debug \"Current Key =$_\"
if ($table_hash[$_].containskey(\"base_folder\"«») -eq $false) {echo \"Error: no param base_folder in [$_]\";$foreach.MoveNext()}
if ($table_hash[$_].containskey(\"base_subfolder\"«») -eq $false) {echo \"Error: no param base_subfolder in [$_]\";$foreach.MoveNext()}
if ($table_hash[$_].containskey(\"base_file\"«») -eq $false) {echo \"Error: no param base_file in [$_]\";$foreach.MoveNext()}
Write-Debug \"Next\"
}
[/code:1]
Je te laisse étudier la méthode MoveNext de l'itérateur
utilise l'instruction \"Continue\":
[code:1]
$table_hash=@{
toto=@{
base_folder=\"toto\";
base_subfolder=\"\";
base_file=\"toto-db\"
};
Error1=@{
base_folder=\"toto\";
base_file=\"toto-db\"
};
titi=@{
base_folder=\"titi\";
base_subfolder=\"sub\";
base_file=\"titi\"
};
Error2=@{
base_folder=\"toto\";
base_subfolder=\"\";
}
}
$DebugPreference=\"Continue\"
foreach ($_ in $table_hash.keys)
{
Write-Debug \"Current Key =$_\"
if ($table_hash[$_].containskey(\"base_folder\"«») -eq $false) {echo \"Error: no param base_folder in [$_]\";Continue}
if ($table_hash[$_].containskey(\"base_subfolder\"«») -eq $false) {echo \"Error: no param base_subfolder in [$_]\";Continue}
if ($table_hash[$_].containskey(\"base_file\"«») -eq $false) {echo \"Error: no param base_file in [$_]\";Continue}
Write-Debug \"Next\"
}
foreach ($_ in $table_hash.keys)
{
Write-Debug \"Current Key =$_\"
if ($table_hash[$_].containskey(\"base_folder\"«») -eq $false) {echo \"Error: no param base_folder in [$_]\";$foreach.MoveNext()}
if ($table_hash[$_].containskey(\"base_subfolder\"«») -eq $false) {echo \"Error: no param base_subfolder in [$_]\";$foreach.MoveNext()}
if ($table_hash[$_].containskey(\"base_file\"«») -eq $false) {echo \"Error: no param base_file in [$_]\";$foreach.MoveNext()}
Write-Debug \"Next\"
}
[/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.
- MEURY Nikolaus
- Auteur du sujet
- Hors Ligne
- Nouveau membre
Réduire
Plus d'informations
- Messages : 14
- Remerciements reçus 0
il y a 12 ans 5 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 ^^
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 12 ans 5 mois #11661
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:saut dans foreach
Nicky écrit:
Nicky écrit:
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:
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
Je comprend l'intention, mais je doute du terme.PoSH offre tout de même bcp de subtilité.
Nicky écrit:
C'est le reflet, je pense, de sa conception.C'est assez impressionnant ce que l'on peut faire en quelques lignes quand on connait le langage.
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, c'est déjà bien.Merci bcp Laurent ^^
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 12 ans 5 mois #11690
par Laurent Dardenne
Tutoriels PowerShell
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=\"toto\";
base_subfolder=\"\";
base_file=\"toto-db\"
}
$table_hash.Error1=@{
base_folder=\"toto\";
base_file=\"toto-db\"
}
$table_hash.Integer=10
$table_hash.titi=@{
base_folder=\"titi\";
base_subfolder=\"sub\";
base_file=\"titi\"
}
$table_hash.Error2=@{
base_folder=\"toto\";
base_subfolder=\"\";
}
$table_hash.Array=@(1,2,3)
$table_hash.EmptyHT=@{}
$table_hash.NullValue=$Null
$DebugPreference=\"Continue\"
[String[]]$ClésAControler=@(\"base_folder\",\"base_subfolder\",\"base_file\"«»)
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 \"clé=valeur clé=valeur...\"
\"$($Parameters.GetEnumerator()|% {\"$($_.key)=$($_.value)\"})\"
}#Convert-DictionnaryEntry
Write-Debug \"`tContrôle l'entrée $EntryName\"
# Si $ErrorView=\"CategoryView\" le contenu de ParameterString est affiché.
$ParameterString=\"$EntryName = @{$(Convert-DictionnaryEntry $Hashtable)}\"
$ControlKeys|
Where {$Currentkey=$_;-not $Hashtable.ContainsKey($Currentkey)}|
Foreach {
Write-Debug \"La clé $CurrentKey n'existe pas\"
$Exception=New-Object System.ArgumentException(\"The key do not exist.\",$Currentkey)
#Todo Exception personnelle contenant le nom de la clé manquante.
$ErrorRecord=New-Object System.Management.Automation.ErrorRecord($Exception,\"WellFormedKeyUnknown\",\"InvalidData\",$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 \"Hashtable à contrôler $($PSVariable.Name)\"
$PSVariable.Value.GetEnumerator()|
Where {
Write-Debug \"Teste l'entrée $($_.Key)\"
($_.Value -ne $Null) -and ($_.Value -is [System.Collections.IDictionary])
}|
Foreach {
Write-Debug \"L'entrée $($_.Key) contient une hashtable\"
Test-HashTableKeys $_.Value $ControlKeys $_.Key -Strict:$Strict
}
}#Test-HashTableStructure
Test-HashTableStructure (gv table_hash) $ClésAControler
$ErrorView=\"CategoryView\"
Test-HashTableStructure (gv table_hash) $ClésAControler
$ErrorView=\"NormalView\"
Test-HashTableStructure (gv table_hash) $ClésAControler -Strict
Test-HashTableKeys $table_hash.toto $ClésAControler \"Toto\"
if($?) {Write-Host \"Pas d'erreur\"}
Test-HashTableKeys $table_hash.Error1 $ClésAControler Error1 -strict -ev Err -ea SilentlyContinue
if (-not $?) {Write-Host \"Erreur detectée\"}
[/code:1]
Il reste un soucis avec la gestion d'erreur :[code:1]
$ErrorActionPreference = \"silentlycontinue\"
Test-HashTableKeys $table_hash.Error1 $ClésAControler Error1 -strict -ev Err
if (-not $?) {Write-Host \"Erreur detectée\"}
[/code:1]
La paramètre ErrorVariable renvoi + erreurs au lieu d'une seule...
[code:1]
$table_hash=new-object System.Collections.Specialized.OrderedDictionary
$table_hash.toto=@{
base_folder=\"toto\";
base_subfolder=\"\";
base_file=\"toto-db\"
}
$table_hash.Error1=@{
base_folder=\"toto\";
base_file=\"toto-db\"
}
$table_hash.Integer=10
$table_hash.titi=@{
base_folder=\"titi\";
base_subfolder=\"sub\";
base_file=\"titi\"
}
$table_hash.Error2=@{
base_folder=\"toto\";
base_subfolder=\"\";
}
$table_hash.Array=@(1,2,3)
$table_hash.EmptyHT=@{}
$table_hash.NullValue=$Null
$DebugPreference=\"Continue\"
[String[]]$ClésAControler=@(\"base_folder\",\"base_subfolder\",\"base_file\"«»)
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 \"clé=valeur clé=valeur...\"
\"$($Parameters.GetEnumerator()|% {\"$($_.key)=$($_.value)\"})\"
}#Convert-DictionnaryEntry
Write-Debug \"`tContrôle l'entrée $EntryName\"
# Si $ErrorView=\"CategoryView\" le contenu de ParameterString est affiché.
$ParameterString=\"$EntryName = @{$(Convert-DictionnaryEntry $Hashtable)}\"
$ControlKeys|
Where {$Currentkey=$_;-not $Hashtable.ContainsKey($Currentkey)}|
Foreach {
Write-Debug \"La clé $CurrentKey n'existe pas\"
$Exception=New-Object System.ArgumentException(\"The key do not exist.\",$Currentkey)
#Todo Exception personnelle contenant le nom de la clé manquante.
$ErrorRecord=New-Object System.Management.Automation.ErrorRecord($Exception,\"WellFormedKeyUnknown\",\"InvalidData\",$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 \"Hashtable à contrôler $($PSVariable.Name)\"
$PSVariable.Value.GetEnumerator()|
Where {
Write-Debug \"Teste l'entrée $($_.Key)\"
($_.Value -ne $Null) -and ($_.Value -is [System.Collections.IDictionary])
}|
Foreach {
Write-Debug \"L'entrée $($_.Key) contient une hashtable\"
Test-HashTableKeys $_.Value $ControlKeys $_.Key -Strict:$Strict
}
}#Test-HashTableStructure
Test-HashTableStructure (gv table_hash) $ClésAControler
$ErrorView=\"CategoryView\"
Test-HashTableStructure (gv table_hash) $ClésAControler
$ErrorView=\"NormalView\"
Test-HashTableStructure (gv table_hash) $ClésAControler -Strict
Test-HashTableKeys $table_hash.toto $ClésAControler \"Toto\"
if($?) {Write-Host \"Pas d'erreur\"}
Test-HashTableKeys $table_hash.Error1 $ClésAControler Error1 -strict -ev Err -ea SilentlyContinue
if (-not $?) {Write-Host \"Erreur detectée\"}
[/code:1]
Il reste un soucis avec la gestion d'erreur :[code:1]
$ErrorActionPreference = \"silentlycontinue\"
Test-HashTableKeys $table_hash.Error1 $ClésAControler Error1 -strict -ev Err
if (-not $?) {Write-Host \"Erreur detectée\"}
[/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.072 secondes
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les débutants
- saut dans foreach