Question Gestion TimeOut

Plus d'informations
il y a 12 ans 3 mois #16444 par GOGET
Gestion TimeOut a été créé par GOGET
Salut à tous,

Je travaille actuellement sur un script PS et je suis bloqué sur la gestion du TimeOut.

Dans une boucle foreach, j'utilise la cmdlet copy-item pour copier des fichiers sur plusieurs serveurs et je souhaite établir un timeout au cas où une copie prendrait trop de temps.

La solution à mon problème est-elle la mise en place d'un compteur et si oui comment cela fonctionne sur PS?

Merci d'avance pour vos réponses

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

Plus d'informations
il y a 12 ans 3 mois #16448 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Gestion TimeOut
Salut,
FLBSLB écrit:

La solution à mon problème est-elle la mise en place d'un compteur et si oui comment cela fonctionne sur PS?

Première idée un job, premier problème en V2 le job ne porte pas l'information de l'heure de démarrage :)<br><br>Message édité par: Laurent Dardenne, à: 29/11/13 16:34

Tutoriels PowerShell

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

Plus d'informations
il y a 12 ans 3 mois #16449 par GOGET
Réponse de GOGET sur le sujet Re:Gestion TimeOut
Laurent Dardenne écrit:

Salut,
FLBSLB écrit:

La solution à mon problème est-elle la mise en place d'un compteur et si oui comment cela fonctionne sur PS?

Première idée un job, premier problème en V2 le job ne porte pas l'information de l'heure de démarrage :)&lt;br&gt;&lt;br&gt;Message édité par: Laurent Dardenne, à: 29/11/13 16:34

Salut,
désolé je n'ai pas précisé la version dans laquelle je dois travailler. C'est la V2
Donc d'après ce que tu me dis je ne peux pas le faire dans un Job?

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

Plus d'informations
il y a 12 ans 3 mois #16450 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Gestion TimeOut
FLBSLB écrit:

Donc d'après ce que tu me dis je ne peux pas le faire dans un Job?

Si, mais pour que ton job puisse porter l'information de l'heure de démarrage afin de le supprimer lors du timeout, il faut que ton nom de job porte cette information. C'est possible, mais le code est de niveau avancé.
La construction du nom du job :
[code:1]
#On utilise \ comme séparateur, car la méthode ToBinary() renvoi un entier négatif
$JobName=\&quot;$NomMachine\$([DateTime]::Now.ToBinary())\&quot;
[/code:1]
L récupération de l'heure :
[code:1]
Function Split-XXJobName {
#Parse le nom d'un Job et renvoi un objet
param ($XXJobName)

$Nom,$Date=$XXJobName -split \&quot;\\\&quot;
New-Object PSObject -Property @{NomMachine=$Nom ;
StartTime=([DateTime]::FromBinary($Date));
ID=$null;
State=$Null;
Name=$JobName #Nom du job utilisé par Stop-Job
}
}
[/code:1]
La gestion du time out :
[code:1]
#Surveillance du temps d'exécution des jobs (TimeOut)
$TimeOutJob = New-Object Timers.Timer
#On s'abonne à l'événement Timer.Elapsed déclenché par $TimeOutJob
$Global:JobTimerElapsed=Register-ObjectEvent $TimeOutJob Elapsed -SourceIdentifier Timer.Elapsed –Action {
#On parcourt la liste des job XX, ou XX est un préfix normé
Get-XXJob|
#La date actuelle moins la date de démarrage du job doit être inférieure au timeout
Where { (Get-Date -$_.StartTime) -gt $XXTimeOutJobInterval }|
# On supprime le job
#Son état bascule en Stopped, son event StateChanged est déclenché
#Voir la suite du traitement dans Watch-XXJob
Remove-Job -Force
}
$TimeOutJob.Interval = $XXTimerIntervalJob.TotalMilliseconds
$TimeOutJob.Autoreset = $True
[/code:1]
Fonction de récupération des jobs normés :
[code:1]
Function Get-XXInfoJob {
param ($XXJobName)
Foreach($Job in Get-Job -Name $XXJobName)
{
$SplittedName=Split-XXJobName $Job.Name
$SplittedName.ID=$Job.Id
$SplittedName.State=$Job.State
}
$SplittedName
}

Function Get-XXMJob {
#Renvoi pour chaque JOB de mise à jour :
# Son ID, son état, le nom de la machine cible, la date de création du job et le nom du Job

Foreach($Job in Get-Job|Where {$_.Name -match \&quot;^XX\&quot;})
{
$SplittedName=Split-XXJobName $Job.Name
$SplittedName.ID=$Job.Id
$SplittedName.State=$Job.State
$SplittedName
}

}
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 29/11/13 18:53

Tutoriels PowerShell

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

Plus d'informations
il y a 12 ans 3 mois #16451 par GOGET
Réponse de GOGET sur le sujet Re:Gestion TimeOut
Laurent Dardenne écrit:

FLBSLB écrit:

Donc d'après ce que tu me dis je ne peux pas le faire dans un Job?

Si, mais pour que ton job puisse porter l'information de l'heure de démarrage afin de le supprimer lors du timeout, il faut que ton nom de job porte cette information. C'est possible, mais le code est de niveau avancé.
La construction du nom du job :
[code:1]
#On utilise \ comme séparateur, car la méthode ToBinary() renvoi un entier négatif
$JobName=\&quot;$NomMachine\$([DateTime]::Now.ToBinary())\&quot;
[/code:1]
L récupération de l'heure :
[code:1]
Function Split-XXJobName {
#Parse le nom d'un Job et renvoi un objet
param ($XXJobName)

$Nom,$Date=$XXJobName -split \&quot;\\\&quot;
New-Object PSObject -Property @{NomMachine=$Nom ;
StartTime=([DateTime]::FromBinary($Date));
ID=$null;
State=$Null;
Name=$JobName #Nom du job utilisé par Stop-Job
}
}
[/code:1]
La gestion du time out :
[code:1]
#Surveillance du temps d'exécution des jobs (TimeOut)
$TimeOutJob = New-Object Timers.Timer
#On s'abonne à l'événement Timer.Elapsed déclenché par $TimeOutJob
$Global:JobTimerElapsed=Register-ObjectEvent $TimeOutJob Elapsed -SourceIdentifier Timer.Elapsed –Action {
#On parcourt la liste des job XX, ou XX est un préfix normé
Get-XXJob|
#La date actuelle moins la date de démarrage du job doit être inférieure au timeout
Where { (Get-Date -$_.StartTime) -gt $XXTimeOutJobInterval }|
# On supprime le job
#Son état bascule en Stopped, son event StateChanged est déclenché
#Voir la suite du traitement dans Watch-XXJob
Remove-Job -Force
}
$TimeOutJob.Interval = $XXTimerIntervalJob.TotalMilliseconds
$TimeOutJob.Autoreset = $True
[/code:1]
Fonction de récupération des jobs normés :
[code:1]
Function Get-XXInfoJob {
param ($XXJobName)
Foreach($Job in Get-Job -Name $XXJobName)
{
$SplittedName=Split-XXJobName $Job.Name
$SplittedName.ID=$Job.Id
$SplittedName.State=$Job.State
}
$SplittedName
}

Function Get-XXMJob {
#Renvoi pour chaque JOB de mise à jour :
# Son ID, son état, le nom de la machine cible, la date de création du job et le nom du Job

Foreach($Job in Get-Job|Where {$_.Name -match \&quot;^XX\&quot;})
{
$SplittedName=Split-XXJobName $Job.Name
$SplittedName.ID=$Job.Id
$SplittedName.State=$Job.State
$SplittedName
}

}
[/code:1]&lt;br&gt;&lt;br&gt;Message édité par: Laurent Dardenne, à: 29/11/13 18:53

Salut,

Que dire! En premier un grand Merci.

Ensuite, ça semble énorme comme code pour la simple gestion d'un Timeout!

N'y a-t-il vraiment pas plus simple?

@+

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

Plus d'informations
il y a 12 ans 3 mois #16452 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Gestion TimeOut
FLBSLB écrit:

Ensuite, ça semble énorme comme code pour la simple gestion d'un Timeout!

Oui, la gestion du timeout est simple à énoncer, son codage déjà moins.
Mon approche était asynchrone (traitement en // de copie de fichiers vers + cibles). A l'origine basée sur Robocopy afin de bénéficier des logs et des retry (réseau WIFI).
FLBSLB écrit:

N'y a-t-il vraiment pas plus simple?

A étudier.
Dans tous les cas on doit avoir un mécanisme synchrone de copie de fichier sur lequel un autre mécanisme aura la main.
Essaie avec Wait-Job , dans ce cas tu as une copie avec timeout, mais synchrone.
Attention le code cité est une version optimiste, il suppose que tout se passe bien, tout le temps...

Tutoriels PowerShell

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

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