Question Gestion d'une file d'attente

Plus d'informations
il y a 13 ans 8 mois #12601 par Phil'z Edward
Bonjour, j'ai un autre souci avec ma classe Start-job, je n'arrive pas à appeler un script qui définira les taches que devra gérer mon start-job et ensuite renverra le resultat dans un fichier texte tout en indiquant la date de debut de tache et de fin de tache.

[code:1]
#Appel du fichier contenant les infos sur les magasins (Numéro et nom du magasin)
$global:folderSource = \"D:\Projet\"
$global:fileName = \"Test.csv\"
$global:file = \"\"

Function New-Magasin([String]$NomMag,[String]$NumMag){
New-Object PsObject -property @{'Nom Magasin'=$NomMag; 'Numero Magasin'=$NumMag; 'Debut de la replication'=(Get-Date -displayhint time); 'Fin de la replication'=$null}

$template = '

Magasin ' + $NumMag + ': ' + $NomMag + '
'
$global:file += $template
}

$MagCourant=New-Magasin
$Queue = New-object system.collections.queue
$Queue.Enqueue($MagCourant)


#Création du Start-Job pour la gestion des tâches en arrière-plan

$JobName = $NomMag

Start-Job -FilePath \"\\nomduserveur\nomdudossier\script.ps1\" -ArgumentList $NomCible,$Mode,$JobName,$($MMLog.Level) -Name $NomMag -ScriptBlock {
#FilePath doit exécuter le script qui génerera les taches à traiter par start job
Function Split-MMJobName {
#Parse le nom d'un Job et renvoi un objet
param ($MMJobName)
$NomMag,$Mode,$Date=$MMJobName
New-Object PSObject -Property @{NomMachine=($NomMag -Replace \"Magasin\",'$NumMag'); #renvoie le nom du magasin et son numéro comme nom de tâche du job
Mode=([ModeMaj]$Mode);
StartTime=([DateTime]::FromBinary($Date));
ID=$null;
State=$Null;
Name=$MMJobName #Nom du job utilisé par Stop-Job
}
}
}
$path = $global:foldersouce + $global:fileName
$test = Import-Csv $path -Delimiter \";\"
#Compteur
$i = 0

foreach ($tests in $test)
{
$i++

# Paramètres : NumMag, NomMag
New-Magasin $tests.NomMag $tests.NumMag


}

#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.

Plus d'informations
il y a 13 ans 8 mois #12602 par xyz
Réponse de xyz sur le sujet Re:Gestion d'une file d'attente
PE2012 écrit:

je n'arrive pas à appeler un script qui définira les taches

Il est peut être sourd d'oreille :lol:

Comme tu ne nous communiques pas le msg d'erreur, on peut supposer qu'il s'agit d'un pb de jeux de paramètre.
Précise soit -Filepath soit -Scriptblock, mais pas les deux en même temps. Un problème de 'double bind' :whistle:

Une ébauche :
[code:1]
Function Split-MagJobName {
#Parse le nom d'un Job et renvoi un objet
param ($MagJobName)

$Nom,$Date=$MagJobName -split \"\\\"
New-Object PSObject -Property @{Magasin=($Nom -Replace \"^MAG\",\"\"«»);
StartTime=([DateTime]::FromBinary($Date));
State=$Null;
Name=$MagJobName #Nom du job utilisé par Stop-Job
}
}

Function New-Magasin {
param(
[String]$NomMag,
[String]$NumMag
)
New-Object PsObject -property @{
Nom=$NomMag;
Numero=$NumMag;
DebutReplication=$Null;
FinReplication=$null
}
}

$Path=\"C:\Temp\TraitementDunMagasin.ps1\"

@\"
Sleep (Get-Random -Maximum 3 -Minimum 1)
return (Get-Random -Maximum 2 -Minimum 0)
\"@ > $Path

$Queue = New-object system.collections.queue


$Nom='Paris'
$Magasin1=New-Magasin $Nom 9
$Magasin2=New-Magasin 'Marseille' 21
$Magasin3=New-Magasin 'Lyon' 55

$Magasin1,$Magasin2,$Magasin3 |
Foreach-Object {
#$Queue.Enqueue($_)
$MagasinCourant=$_
$StartDate=[DateTime]::Now
$MagasinCourant.DebutReplication=$StartDate
$JobName=\"MAG$($_.Nom)\$($StartDate.ToBinary())\"
Start-Job -FilePath $Path -ArgumentList $JobName -Name $JobName
}

Get-Job|Foreach {Split-MagJobName $_.Name}
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 27/08/12 21:47

Tutoriels PowerShell

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

Plus d'informations
il y a 13 ans 8 mois #12609 par xyz
Réponse de xyz sur le sujet Re:Gestion d'une file d'attente
La précédente version de l'ébauche du script, prudence,prudence, portait implicitement, on y arrive, l'usage de la 'quiou' dans ce contexte.

Une solution, utilisant cette queue, basée sur le post suivant :
[code:1]
Function Split-MagJobName {
#Parse le nom d'un Job et renvoi un objet
param ($MagJobName)

$Nom,$Date=$MagJobName -split \&quot;\\\&quot;
New-Object PSObject -Property @{Magasin=($Nom -Replace \&quot;^MAG\&quot;,\&quot;\&quot;«»);
StartTime=([DateTime]::FromBinary($Date));
State=$Null;
Name=$MagJobName #Nom du job utilisé par Stop-Job
}
}

Function New-Magasin {
param(
[String]$NomMag,
[String]$NumMag
)
New-Object PsObject -property @{
Nom=$NomMag;
Numero=$NumMag;
DebutReplication=$Null;
FinReplication=$null;
Success=$null
}
}

$Path=\&quot;C:\Temp\TraitementDunMagasin.ps1\&quot;

@'
param($Magasin)
Write-host \&quot;Traite le magasin situé à $($Magasin.Nom)\&quot; -Fore White
Sleep -Seconds (Get-Random -Maximum 3 -Minimum 1)
$result=(Get-Random -Maximum 2 -Minimum 0) -as [Boolean]
if ($result )
{Write-host \&quot;Réussite du traitement du magasin situé à $($Magasin.Nom)\&quot; -Fore Green}
else
{Write-host \&quot;Echec du traitement du magasin situé à $($Magasin.Nom)\&quot; -Fore Red}
$Magasin.FinReplication=[DateTime]::Now
$Magasin.Success=$Result
return $Magasin
'@ &gt; $Path


$Magasins=@(
(New-Magasin 'Paris' 9),
(New-Magasin 'Marseille' 21),
(New-Magasin 'Lyon' 55),
(New-Magasin 'Lille' 123),
(New-Magasin 'Bordeaux' 1985),
(New-Magasin 'Toulouse' 6),
(New-Magasin 'Brest' 1),
(New-Magasin 'Strasbourg' 33),
(New-Magasin 'Clermont' 66)
)

# How many jobs we should run simultaneously
$maxConcurrentJobs = 3;
$Queue = [System.Collections.Queue]::«»Synchronized( (New-Object System.Collections.Queue) )

foreach($Mag in $Magasins)
{ $Queue.Enqueue($Mag) }

# Function that pops input off the queue and starts a job with it
function Start-JobFromQueue
{
if( $Queue.Count -gt 0)
{
$MagasinCourant=$Queue.Dequeue()
$StartDate=[DateTime]::Now
$MagasinCourant.DebutReplication=$StartDate
$JobName=\&quot;MAG$($MagasinCourant.Nom)\$($StartDate.ToBinary())\&quot;

$CurrentJob = Start-Job -FilePath $Path -ArgumentList $MagasinCourant -Name $JobName
Register-ObjectEvent -InputObject $CurrentJob -EventName StateChanged -SourceIdentifier \&quot;Event$JobName\&quot; -Action {
Start-JobFromQueue
Unregister-Event $eventsubscriber.SourceIdentifier
Remove-Job $eventsubscriber.SourceIdentifier
} | Out-Null
}
}

# Start up to the max number of concurrent jobs
# Each job will take care of running the rest
for( $i = 0; $i -lt $maxConcurrentJobs; $i++ )
{
Start-JobFromQueue
}

sleep -Seconds (1*60)
$MagasinsResultat=Get-Job|Where-Object {$_.Name -Match \&quot;^MAG\&quot;}|Receive-Job -keep
[/code:1]
Je n'ai pas commenté, c'est à ta charge :ohmy:
En tout cas l'implémentation de ton besoin est trés instructif. Si je peux je la mettrais à profit dans une prochaine session de formation PS dispensée en interne dans mon entreprise :)
Merci.<br><br>Message édité par: Laurent Dardenne, à: 28/08/12 23:02

Tutoriels PowerShell

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

Plus d'informations
il y a 13 ans 8 mois #12610 par Phil&#039;z Edward
Merci Beaucoup!!!

Cela me sera très utile pour terminer mon script.

cdt,

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

Plus d'informations
il y a 13 ans 8 mois #12621 par xyz
Réponse de xyz sur le sujet Re:Gestion d'une file d'attente
Il reste qq soucis avec le dernier exemple.
Par exemple si un job crash.
Si, si ça arrive :P

Sans trop rentrer dans les détails, l'usage de la classe Queue, en considérant les crash, n'est peut être pas suffisant pour gérer le résultat des jobs.

Ensuite la présence de l'heure de démarrage n'a d'intérêt que si tu souhaites gérer un temps max d'exécution du job, avant sa suppression automatique( un timeout sur le job). A prioris tu n'en as pas besoin.

Bref, cela demande encore qq réflexions :dry:

Tutoriels PowerShell

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

Plus d'informations
il y a 13 ans 8 mois #12633 par Phil&#039;z Edward
...<br><br>Message édité par: PE2012, à: 6/09/12 10:41

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

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