Question
Gestion d'une file d'attente
- Phil'z Edward
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 45
- Remerciements reçus 0
En faite le fonctionnel est comme écrit dans le script en vb, dès qu'une tâche d'un magazin x a été traité, le script renvoie un msg traité à 6h par exple, et si ce n'est pas le cas, il renvoie un msg non traité et le remet dans la file d'attente.
c'est un peu cela le principe
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 69
Pour moi, c'est une implémentation. A la charge des forumeurs de faire du reverse...En faite le fonctionnel est comme écrit dans le script en vb
PE2012 écrit:
J'ai beaucoup de mal à développer avec un peu de \"specs\"c'est un peu cela le principe
Je ne comprends pas ton traitement. Qui crée la liste d'attente d'origine ? Que se passe-t-il une fois tous les magasins traités ? etc...
Une autre approche autour d'un \"reste à faire\" . Mais ce n'est pas du code pour débutant.
Si j'ai le temps je validerais bien cette approche générique autour de ton traitement.
En même temps tu peux faire plus simple
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Phil'z Edward
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 45
- Remerciements reçus 0
en fait à la fin le script doit renvoyé les differentes informations dans un fichier csv ou txt par exemple, pour dire que tache à été traité ou pas.
Pour mieux comprendre tu peux enregistrer le script en vb que j'ai posté en .log, et tu verras une ébauche de résultat.
Merci
Connexion ou Créer un compte pour participer à la conversation.
- Phil'z Edward
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 45
- Remerciements reçus 0
en utilisant les classes system.collections.queue pour la gestion des files des attentes et Start-job pour gerer les taches en arrière plan.
Cela reste encore à peaufiner, car je bloque encore sur certains points :
-l'utisilisation de Start-job pour gérer mes différentes taches que j'aurai appeler via un autre script
-ajouter la date et l'heure de début et de fin de traitement d'une tache d'un magasin
Merci pour vos conseils
Code:
[code:1]
<#
.SYNOPSIS
Création d'une file d'attente avec gestion de tâches. A chaque tâche gérée (magasin dont la replication a été faite) le script devra renvoyer \"Action Réussie\" et le supprime de la liste d'attente
et à chaque tâche non gérée, le script devra renvoyer \"Action échouée\" et le renvoie dans la file d'attente.
Le script renseignera aussi :
- La date et l'heure de l'édition du fichier
- La date et l'heure du début et de fin de replication de chaque tâche
.PARAMETRE
System.Collection.Queue qui gère la file d'attente
Start-job pour gérer une tâche de la file d'attente en arrière plan
.AUTHOR
#>
#
#Appel du fichier contenant les infos sur les magasins (Numéro et nom du magasin)
$global:folderSource = \"I:\Travail\\"
$global:fileName = \"Test.csv\"
$global:file = \"\"
\"Magasins de départ:\"
function Filedattente {
Param([String]$NumMag, [String]$NomMag)
#Création de la file d'attente avec la classe System.Collection.Queue
#Create new queue object
$myq = new-object system.collections.queue
$myq.Enqueue(\"\"«»)
#show queue
\"{0} entries in the queue as follows:\" -f $myq.Count
$myq | % {\"Magasin $NumMag : $NomMag\"}
\"\"
$template = '
Magasin ' + $NumMag + ': ' + $NomMag + '
'
#Dequeue Magasin - retirer les magasins dont la replication a été traîtée avec succès
$dq=$myq.dequeue()
$global:file += $template
}
#Gérer les tâches de la file d'attente avec Start-job
#Création du fichier filedattente
$path = $global:foldersouce + $global:fileName
$test = Import-Csv $path -Delimiter \";\"
#Compteur
$i = 0
foreach ($tests in $test)
{
$i++
# Paramètres : NumMag, NomMag
Filedattente $tests.NumMag $tests.NomMag
}
#Affichage du resultat
$export = $global:folderSource + \"Replication-\" + (Get-date -Format dd-MM-yyyy) + \".txt\"
$global:file | Out-file $export -encoding UTF8
[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 69
PE2012 écrit:
Certains devraient suivre ton exempleHello, après beaucoup de lecture et de recherche,
PE2012 écrit:
Joli ! Heureusement que tu débutes sous Powershell...en utilisant les classes system.collections.queue pour la gestion des files des attentes et Start-job pour gerer les taches en arrière plan.
PE2012 écrit:
Tu peux consulter ce post , pour débuter, toi aussi, tu ne prends pas le plus facile-l'utisilisation de Start-job pour gérer mes différentes taches que j'aurai appeler via un autre script
Si tu utilises des tâches de fond en paralléle, ton script doit gérer les fins d'exécution, le code retour et les possibles erreurs.
Cela tombe bien, les jobs sont conçus pour répondre à ce type de besoins ! Bon, ça ne fait pas tout seul non plus.
PE2012 écrit:
Ce n'est pas le plus difficile, à mon avis le pb se situe dans ton approche de PS, il faut baser ta conception autour d'objets et ne pas utiliser PS comme un VBS++.-ajouter la date et l'heure de début et de fin de traitement d'une tache d'un magasin
[code:1]
Function New-Magasin([String]$Nom,[Int]$Numero) {
New-Object PsObject -property @{Nom=$Nom; Numero=$Numero; Debut=$null; Fin=$null}
}
$MagCourant=New-Magasin Paris 7
$Queue.Enqueue($MagCourant)
#$Queue.Enqueue((New-Magasin Paris 7))
#$DatasFromFile|Foreach-Object {$Queue.Enqueue((New-Magasin $_.ChampNom $_.ChampNuméro))}
[/code:1]
Un autre pb se présentera, la fin d'exécution d'un job n'est pas portée par l'objet Job. Une autre 'broutille'
La documentation sur MSDN contient bien la nouvelle propriété , mais pas encore l'information du numéro de version de PS à partir de laquelle elle s'applique.
Bref, un exemple pour la v2:
[code:1]
#On utilise \ comme séparateur, car la méthode ToBinary() renvoi un entier négatif
$JobName=\"MM$NomCible\$($Mode.ToString())\$([DateTime]::Now.ToBinary())\"
Start-Job -ArgumentList $NomCible,$Mode,$JobName,$($MMLog.Level) -Name $Jobname -ScriptBlock {
[/code:1]
et qq routines à adapter :
[code:1]
Function Split-MMJobName {
#Parse le nom d'un Job et renvoi un objet
param ($MMJobName)
$Nom,$Mode,$Date=$MMJobName -split \"\\\"
New-Object PSObject -Property @{NomMachine=($Nom -Replace \"^MM\",\"\"«»);
Mode=([ModeMaj]$Mode);
StartTime=([DateTime]::FromBinary($Date));
ID=$null;
State=$Null;
Name=$MMJobName #Nom du job utilisé par Stop-Job
}
}
Function Get-MMInfoJob {
param ($MMJobName)
Foreach($Job in Get-Job -Name $MMJobName)
{
$SplittedName=Split-MMJobName $Job.Name
$SplittedName.ID=$Job.Id
$SplittedName.State=$Job.State
}
$SplittedName
}
Function Get-MMJob {
#Renvoi pour chaque JOB de mise à jour :
# Son ID, son état, le nom de la machine cible, le mode de Maj, la date de création du job et le nom du Job
Foreach($Job in Get-Job|Where {$_.Name -match \"^MM\"})
{
$SplittedName=Split-MMJobName $Job.Name
$SplittedName.ID=$Job.Id
$SplittedName.State=$Job.State
$SplittedName
}
}
[/code:1]
Je te passe l'usage d'un système de log pour suivre les changements d'état des jobs et faciliter la maintenance et le debug...
Enfin la section documentation de ton exemple est à revoir, mais plus tard
En tout cas c'est une implémentation ambitieuse !
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Phil'z Edward
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 45
- Remerciements reçus 0
Je m'y remets. Cela devient de plus en plus passionnant.
cdt,
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Gestion d'une file d'attente