2010-07-20 4 views
2

J'ai ce script simple:Comment continuer script Powershell après un crash exécutable et bloquer

$files = dir .\configs | ? { !$_.PSIsContainer } 

foreach($file in $files) 
{ 
    try 
    { 
     .\MyApp.exe -ErrorAction Stop $file 
    } 
    catch 
    { 
     write-host "!!!!!!!!!!!!error!!!!!!!!!!!!!!" 
     continue 
    } 
} 

Le problème est que lorsque

.\MyApp.exe -ErrorAction Stop $file 

accident, les fenêtres boîte de message sur plantage de l'application apparaissent et mon bloc de script, catch n'est pas atteint et le seul moyen de continuer est de cliquer sur le bouton Storno dans la boîte de message.

Alors, comment empêcher le blocage?

+2

Je ne pense pas que try/catch était destiné à supprimer les dialogues dr watson causés par un processus externe qui plante. Vous pouvez l'exécuter sur un travail d'arrière-plan et, s'il n'a pas terminé dans un délai raisonnable, supposer qu'il s'est écrasé et tuer le processus et le travail d'arrière-plan. –

Répondre

2

Plusieurs notes sont:

  • Cette boîte de dialogue est géré par le système d'exploitation, donc il n'y a rien PowerShell. PowerShell ne peut rien y faire. Vous pourriez utiliser un peu d'automatisation pour trouver une fenêtre et un bouton 'clic', mais c'est vraiment gênant.
  • L'application de paramètres tels que -ErrorAction n'a aucune valeur. Cela s'applique uniquement aux fonctions/cmdlets (autre chose?).
  • Les applications sont censées renvoyer 0 (succès) ou toute autre chose (échec), elles ne lancent pas d'exceptions. Dans votre cas, vous pouvez utiliser $lastexitcode qui contient le code de sortie de l'application.

Notez que l'application correctement codée doit retourner vraiment son code de sortie et peut écrire quelque chose à la console. Si cela échoue horriblement avec cette boîte de message, il n'y a aucune excuse. Au moins un gros bloc try/catch dans la fonction Main doit être utilisé.

+0

J'ai essayé d'utiliser $ lastexitcode, mais il est défini après avoir cliqué sur storno dans la boîte de message. – tomasK

+0

Édité la réponse. Je pense vraiment que vous pouvez seulement trouver une solution de contournement maladroit. – stej

+0

Mais il y a quelque temps, ça marche pour moi dans PowerShell 1.0 en utilisant le trap, sans bloquer. Mais maintenant je ne suis pas capable de le reproduire ... – tomasK

0

. \ MyApp.exe -ErrorAction Arrêter le fichier $

Sur une note de côté, -ErrorAction n'a pas de sens dans les applications existantes. C'est un paramètre de cmdlet.

Questions connexes