Question Wait-Process interminable

Plus d'informations
il y a 14 ans 2 mois #10913 par arnau
Wait-Process interminable a été créé par arnau
Bonjour à toute la communauté,

Je viens solliciter votre aide pour un petit souci pour attendre la fin d'un processus. En fait, j'ouvre un fichier excel, j'effectue une modification dessus, je sauvegarde et je quitte, puis enfin j'aimerais attendre que le processus EXCEL avant d'effectuer un nouveau traitement.

Alors je sens qu'il y en a beaucoup qui vont dire wait-process:
Si je n'utilise pas wait-process et que je surveille moi même le gestionnaire des tâches, le process EXCEL disparait bien quelques secondes après le traitement.
Si j'utilise wait-process, le process EXCEL reste présent longtemps, trèèèèèèèèèèèèès longtemps (j'ai jamais attendu la fin) et donc le script reste bloqué à cette étape.

J'utilise la méthode suivante pour fermer le process : technet.microsoft.com/fr-fr/library/ff730962%28en-us%29.aspx#

[code:1]
function Init_excel_object
{
$excel_object = @()
###Nouvel objet Excel###
$excel_object = New-Object -ComObject excel.application
$excel_object.Visible = $false
$excel_object.DisplayAlerts = $false
########################

return $excel_object
}

function Close_excel_object ($excel_object, $excel_workbook)
{
###Sauver et Quitter###
$excel_workbook.Save()
$excel_workbook.Close()
$excel_object.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel_object) | Out-Null
Remove-Variable excel_object
#######################

#Get-Process EXCEL | ForEach-Object { $_.WaitForExit() }
}

function Change_NumberFormat_to_TEXT($excel_file,$excel_worksheet)
{
#try
#{
Write-Host \"`tChangement en format texte de $excel_worksheet...\" -NoNewline

$excel_object = Init_excel_object

##Selection fichier et feuille##
$excel_workbook = $excel_object.Workbooks.Open(\"$excel_file\"«»)
$excel_worksheet = $excel_workbook.Worksheets.item(\"$excel_worksheet\"«») #Feuil1
########################

##Changement de format pour toutes les colonnes##
$excel_worksheet.columns.NumberFormat = \"@\"
########################

Close_excel_object $excel_object $excel_workbook

Write-Host \"Done!\" -ForegroundColor \"Green\"

#}
#catch
#{
# Write-Host \"Error!\" -ForegroundColor \"Red\"
# exit
#}
}

Change_NumberFormat_to_TEXT \".\test_format.xls\" \"Feuil1\"


Write-host \"Complete!\"
[/code:1]

J'ai même essayé Get-Process EXCEL | ForEach-Object { $_.WaitForExit() }

Toujours le même souci.

Moi qui pensais que le problème serait solutionné rapidement grâce à wait-process pour finalement que cette commande empire la situation...

Merci d'avance à tous :)

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

Plus d'informations
il y a 14 ans 2 mois #10914 par Laurent Dardenne
Salut,
tu as le pb tout le temps ou seulement avec ce script ?

Tutoriels PowerShell

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

Plus d'informations
il y a 14 ans 2 mois #10916 par arnau
Réponse de arnau sur le sujet Re:Wait-Process interminable
Salut Laurent,

C'est la première fois que j'utilise cette cmdlet donc : les deux :laugh:

En fait, avec le script tel que je l'ai posté, le processus EXCEL disparait quelques secondes après le traitement (ce qui est sans doute normal et relativement correct). Mais c'est seulement une partie de mon script global (d'où les fonctions), à savoir que je vais faire appel à ces fonctions au moins une fois (pour la plupart bien plus que cela, c'est pourquoi j'utilise les fonctions pour alléger mon code et le rendre plus flexible et modulaire) et si je ne controle pas le process excel (dans mon cas ici) je risque d'avoir des problèmes.

Les problèmes sont que je vais solliciter la mémoire et la CPU pour une multitude d'instance d'excel (pas top pour l'optimisation des ressources). Mais surtout, si mon script doit remanipuler un fichier ouvert plus tôt dans le script alors que le handle excel n'a pas été relâché: le script va peut être me retourner 0 pour dire que la commande est bien passée mais en vérité il n'aura pas fait le traitement sur le fichier car protégé en écriture à cause d'une instance non terminée.

Au final, le wait-process devait être la commande magique, mais lorsque je l'utilise (ou même en passant par la methode waitforexit() ) au lieu de se terminer quelques secondes après comme lorsqu'il y a aucun contrôle : il ne se termine jamais, enfin jamais...disons que j'ai attendu 20 minutes avant d'abandonner (pour terminer un processus ou une arborescence c'est loin d'être satisfaisant).

Merci à toi Laurent :)<br><br>Message édité par: maar, à: 5/01/12 21:36

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

Plus d'informations
il y a 14 ans 2 mois #10927 par Laurent Dardenne
Je ne suis pas certains d'avoir bien compris la première partie de ton explication, la fatigue peut-être.
Ceci dit, je ne pense pas que cette partie :
maar écrit:

alors que le handle excel n'a pas été relâché:

soit un des éléments du problème que tu rencontres.

S'il y a un pb de libération, comme tu utilises ici un objet COM, il est plus dans la libération explicite des références d'interface de cet objet COM.
C'est du chinois ? Ce n'est pas grave, tu dois à chaque fois, et dés que tu as terminé d'utiliser un objet liè à Excel, en réalité une interface COM, la libérer avec ReleaseComObject qui signifie compteur_Référence_COM -1

Le modèle COM utilise en interne un compteur de référence qui veut que tant qu'une interface à son compteur différent de zéro la libération ne peut se faire, l'objet reste actif, car celui-ci peut avoir plusieur clients dans des process différents. D'où le modèle de thread MTA (à confirmer). Mais revenons à nos références de moutons.

On pense à tort que, puisse que l'on est dans du code managé cette opération est prise en charge par le runtime, c'est faux. En apparté le langage Delphi lui gère le décompte automatiquement, un \&quot;vieux\&quot; langage avec de bonnes idées...

Bref, vérifie déjà ce point avant d'aller plus loin.
Exemple :
[code:1]
$excel_workbook = $excel_object.Workbooks.Open(\&quot;$excel_file\&quot;«»)
$excel_worksheet = $excel_workbook.Worksheets.item(\&quot;$excel_worksheet\&quot;«») #Feuil1
[/code:1]
Ces références ne sont pas libérées TANT que tu ne quitte pas la session PS.

Je peux me tromper et être HS, mais je te préconise déjà de vérifier ce point.
Comme tu ne croules pas sous les préconisations, je me permets d'en faire une :whistle:

Tutoriels PowerShell

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

Plus d'informations
il y a 14 ans 2 mois #10930 par arnau
Réponse de arnau sur le sujet Re:Wait-Process interminable
Salut Laurent,


Merci pour ton explication mais si tu regardes bien mon script, je fais bien une release de l'objet com :) :

[code:1]
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel_object) | Out-Null
Remove-Variable excel_object
[/code:1]

En fait, en fouinant sur internet, j'avais trouvé ce lien qui traite le problème (et qui revient donc à ce que tu viens d'expliquer):

technet.microsoft.com/fr-fr/library/ff730962%28en-us%29.aspx#

Dans cet article on voit bien comment se débarasser du process (ou plus précisement, de l'objet COM). Et normalement, en procédant comme ils le disent, une fois que powershell à executer l'instruction de release COM, l'instance disparait du gestionnaire des tâche et il n'y a plus de handle donc je peux refaire une nouvelle instance.

Et ça, ça ne marche pas pour moi, en appliquant leur méthode j'ai toujours le process EXCEL qui tourne pendant encore quelques secondes (aléatoire), et ce que je veux c'est être sur que l'instance n'existe plus avant d'en recréer une. :)

Merci beaucoup :)

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

Plus d'informations
il y a 14 ans 2 mois #10931 par Richard Lazaro
Réponse de Richard Lazaro sur le sujet Re:Wait-Process interminable
Une solution pas trés propre mais avec une boucle infinie (avec un timeout) ?

Think-MS : (Get-Life).Days | %{ Learn-More }

\\&quot;Problems cannot be solved by the same level of thinking that created them.\\&quot; - Albert Einstein

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

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