2010-10-19 6 views
1

J'essaye de scripter Powerpoint avec Powershell 2.0.Powershell 2 gestion des événements

Cet site indique qu'il existe un événement "PresentationOpen". Toutefois, Get-Member n'affiche pas cet événement. Aussi, lorsque je tente de le faire:

register-objectevent $application PresentationOpen notification_event 

il est dit: « Impossible d'enregistrer pour l'événement Un événement avec le nom « PresentationOpen »n'existe pas. ».

Pourquoi cet événement n'est pas accessible depuis PowerShell? Est-ce que je le fais mal, et il y a un autre moyen?

Ce que j'essaie vraiment de faire, c'est d'attendre que la présentation soit complètement chargée avant de la sauvegarder dans un autre format. Ne pas attendre fait parfois geler PPT.

Je suis reconnaissant pour toute aide!

+0

Pourriez-vous ajouter le bloc de code que vous essayez d'utiliser? – Goyuix

+0

J'ai essayé le code que vous avez posté ci-dessous dans un Powershell 2.0. –

Répondre

0

PowerShell est assez faible dans le support COM (c'est beaucoup plus comme C# que comme VB). Dans ce cas, vous devrez déléguer l'événement. Voir les dépêches sur cette page: http://support.microsoft.com/kb/308825/EN-US/

+0

Merci pour votre réponse. Je suis assez analphabète dans PowerShell, donc je n'ai aucune idée de ce qu'il faut faire maintenant, c'est un peu trop avancé pour moi. :) –

0

Il peut y avoir d'autres (et meilleurs) façons de le faire, mais cela devrait vous aider à démarrer:

$ppa = New-Object -ComObject PowerPoint.Application 
$eventId = Register-ObjectEvent $ppa PresentationOpen -Action { "Hi" } 
$ppa.Visible = 1 
$ppa.Presentations.Open("Path\To\Presentation.ppt") 

vous voulez remplacer le bloc de script après -Action sur la deuxième ligne avec quel que soit le code ferait le traitement/sauvegarde. Si une sortie de votre événement que vous avez enregistré est sortie, vous pouvez l'utiliser via l'applet de commande Receive-Job, sinon vous pouvez simplement ajouter une boucle similaire à celle-ci juste après l'appel de la méthode Open() pour bloquer exécution de script supplémentaire jusqu'à ce que la présentation de la diapositive soit terminée:

While ((Get-Job $eventId).State -neq "Completed") { Start-Sleep -m 250 } 
Receive-Job $eventId 
+0

Merci pour la réponse. Mais quand j'essaye ceci, j'obtiens: Register-ObjectEvent: Impossible de s'inscrire à l'événement. Un événement avec le nom 'Presentat ionOpen' n'existe pas. –