- forum
- PowerShell
- Entraide pour les débutants
- Boucle Do..While qui ne fonctionne pas correctement pour ajouter des jours
Résolu
Boucle Do..While qui ne fonctionne pas correctement pour ajouter des jours
- gertrude
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 18
- Remerciements reçus 0
Aujourd'hui je viens vous voir car j'ai un cas qui me semblait en apparence simple à résoudre mais sur lequel je me casse bien les dents. Et j'ai tenté différentes choses, sans succès. Ce que je propose ici est la version la plus "aboutie", bien que non fonctionnelle.
Je suis en train de créer un planning d'affection. J'ai une boucle principale qui tourne pour parcourir chaque ligne de ma variable $planning. Cette variable $planning comporte les propriétés suivantes : Client (nom du client), Week (numéro de semaine dans le cycle de rotation, va de 1 à 10 dans le cas présent), Vague 1, Vague 2, Vague 3, Vague 4, etc. Les "Vague x" sont les dates auxquels les interventions ont lieu. Les dates sont vides au départ, puis remplies par le script au fur et à mesure.
Le script fonctionnait très bien jusqu'à ce que je veuille rajouter le fait que lorsqu'on a un jour férié, on décale d'une semaine la date (et les suivantes, on décale tout le planning. J'ai voulu faire une boucle car dans le cas du 1 et 8 mai, il faut décaler deux fois. Par ailleurs, on n'est pas à l'abri qu'un nouveau jour férié soit ajouté 7 jours après le 8 mai ou 7 jours après le 1 mai, donc autant prendre en compte tous les cas de figure !
Bref, la partie qui me pose souci se situe dans la boucle Do..While car lorsque je détecte un jour férié, je veux ajouter 7 jours. Et c'est là que ça ne fonctionne pas, car j'ai ce message d'erreur qui se répète à l'infini :
Échec lors de l’appel de la méthode, car [System.String] ne contient pas de méthode nommée « AddDays ».
Au caractère Ligne:304 : 17
+ ... $dateToTest = ($dateToTest.AddDays(7)).ToString("dd/MM/yy ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation : (: ) , RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
Je comprends bien que je ne peux pas ajouter des jours à une chaîne de caractères, mais je ne comprends pas comment résoudre cette erreur.
Voici la partie du script en question :
#définir l'URL de l'API fournissant les jours fériés en France métropolitaine
$apiHolidays = 'calendrier.api.gouv.fr/jours-feries/metropole.json'
#appeler l'API pour récupérer la liste des jours fériés
$holidays = Invoke-RestMethod -Uri $apiHolidays
# créer une boucle qui démarre de 0, s'incrémente de 1 en 1, et va jusqu'au nombre de lignes de $planning : on parcourt chaque ligne
for($l=0; $l -lt $planning.Count ;$l++){
# initialiser la variable multiplicateur à 0
[int]$multiplier = 0
# créer une boucle qui démarre de 1, s'incrémente de 1 en 1, et va jusqu'au nombre de colonnes "Vagues de $planning : on parcourt chaque colonne Vague 1, Vague 2, etc.
for($v=1; $v -le $nbWave; $v++){
#convertir la date à tester au format 'yyyy-MM-dd' pour correspondre au format de l'API
$dateToTest = Get-Date (((Get-Date $firstUpdateDate).AddDays(([int]$planning[$l].Week - 1)*7 + $numberOfWeeks*$multiplier*7 + $NoMaj*$multiplier*7)).ToString("dd/MM/yyyy")) -Format 'yyyy-MM-dd'
#si la date est un jour férié
if($holidays.$dateToTest){
#alors entrer dans une boucle Do..While
Do{
#ajouter 7 jours à la date testée
$dateToTest = ($dateToTest.AddDays(7)).ToString("dd/MM/yyyy")
}While ($holidays.$dateToTest)
}
# remplir avec la date de départ selon la formule = n°DeSemaineDépart + Week de la ligne en cours -1
$planning[$l]."Vague $v" = ((Get-Date $firstUpdateDate).AddDays(([int]$planning[$l].Week - 1)*7 + $numberOfWeeks*$multiplier*7 + $NoMaj*$multiplier*7)).ToString("dd/MM/yyyy")
# ajouter 1 au multiplicateur
$multiplier = $multiplier +1
}
}
Connexion ou Créer un compte pour participer à la conversation.
- Fabien
- Hors Ligne
- Membre premium
-
- Messages : 146
- Remerciements reçus 22
Ce que te renvoi l'erreur est un problème de format de date.
Dans la variable $dateToTest, tu as modifié le format de la date.
Quand tu utilises cette variable après, tu n'as plus la méthode "AddDays" car ta variable est au Format String et non Date.
Voici un exemple pour comprendre :
#Date au format Date
$date = Get-Date
#Affichage du format
$date.GetType()
#Ajouter 3 jours à la date du jour
$date.AddDays(3)
#Date au format String
$date2 = Get-Date -Format 'yyyy-MM-dd'
#Affichage du format
$date2.GetType()
#Ajouter 3 jours à la date du jour (Non Fonctionnel)
$date2.addDays(3)
Fabien
Connexion ou Créer un compte pour participer à la conversation.
- gertrude
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 18
- Remerciements reçus 0
Merci pour ta réponse très claire, j'ai remis ma variable dans un Get-Date, puis ensuite j'ai ajouté les jours nécessaires.
Pour répondre à ton exemple qui est parlant :
$date2 = Get-Date -Format 'yyyy-MM-dd'
#Affichage du format
$date2.GetType()
#Ajouter 3 jours à la date du jour (Fonctionnel car on retransforme la variable en date)
(Get-Date $date2).addDays(3)
Comme ça, ça fonctionne
Nous pouvons clore ce sujet.
ps : ma boucle dans le message initial, d'un point de vue logique, est à jeter à la poubelle, mais ça fera (ou pas, si je m'en sors seule) l'objet d'un nouveau sujet
Connexion ou Créer un compte pour participer à la conversation.
- forum
- PowerShell
- Entraide pour les débutants
- Boucle Do..While qui ne fonctionne pas correctement pour ajouter des jours
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Boucle Do..While qui ne fonctionne pas correctement pour ajouter des jours