2013-04-09 1 views
3

J'essaie de démarrer mon service avec PowerShell mais actuellement il échoue. Je ne sais pas pourquoi cela échoue, mais ce n'est pas le but ici. Lorsque je tente de démarrer l'hôte, je ne reçois pas le bon code de sortie, mon déploiement automatique échoue donc en silence.Comment puis-je obtenir topshelf pour renvoyer le code d'erreur lorsque la commande échoue?

Ce que je suis en train de faire est:

$cmd = "$folder" + "\MyService.exe" 
try 
{ 
    & $cmd stop 
    & $cmd uninstall 
    & $cmd install 
    & $cmd start 
} 
catch 
{ 
    Write-Host "Error: Update of service failed" 
    exit 1 
} 

La commande start échoue avec le messge suivant:

Topshelf.Hosts.StartHost Error: 0 : The service failed to start., System.InvalidOperationException: Cannot start service MyService on computer '.'. ---> System.ComponentModel.Win32Exception: The service cannot be started, either because it is disabled or because it has no enabled devices associated with it 
    --- End of inner exception stack trace --- 
    at System.ServiceProcess.ServiceController.Start(String[] args) 
    at System.ServiceProcess.ServiceController.Start() 
    at Topshelf.Runtime.Windows.WindowsHostEnvironment.StartService(String serviceName) 
    at Topshelf.Hosts.StartHost.Run() 

et je ne jamais entrer dans la déclaration de capture de mon script Powershell.

MISE À JOUR:

Notez que je demande comment obtenir la méthode de la déclaration de capture et non la solution à l'exception réelle. J'ai résolu l'exception réelle, mais je veux une meilleure rétroaction dans le futur si elle échoue, et c'est que l'instruction catch soit exécutée, ce qui n'est pas le cas en cas d'erreur.

Répondre

3

try/catch dans PowerShell ne fonctionne pas avec exe. Après les appels myservice.exe, vous devez vérifier la variable automatique $LastExitCode. Essayez quelque chose comme ceci:

$out = & $cmd start 
if ($LastExitCode -ne 0) # if exe returns 0 on success, if not change the condition accordingly 
{ 
    "ERROR: $out" 
    return # to exit script or do something else. 
} 
+0

J'ai essayé cela aussi, cela n'a pas fonctionné. Je ne pense pas que le dernier code de sortie est défini correctement. –

+0

mais '$ LastExitCode' a une certaine valeur après l'erreur? –

+0

La valeur de '$ LastExitCode' a été définie sur 0. –

Questions connexes