2009-04-19 18 views
4

J'ai un scipt exécution en C# en utilisant le code d'exécution async Powershell sur le projet de code ici:

http://www.codeproject.com/KB/threads/AsyncPowerShell.aspx?display=PrintAll&fid=407636&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=2130851#xx2130851xx

Je dois retourner le lastexitcode et $ Jean-Paul décrit comment vous pouvez utiliser une classe pshost personnalisée pour le renvoyer. Je ne trouve aucune méthode ou propriété dans pshost qui retourne le code de sortie.

Ce moteur dont j'ai besoin doit s'assurer que le script s'exécute correctement.

Toute aide serait appréciée.

salutations Bob.

C'est le $ lastexitcode et le $? les variables que je dois ramener.

Bonjour, Enfin répondu.
J'ai découvert la variable $ host. Il implémente un rappel dans l'hôte, en particulier un objet PSHost personnalisé, vous permettant de renvoyer le $ lastexitcode. Voici un lien vers une explication de $ host.

http://mshforfun.blogspot.com/2006/08/do-you-know-there-is-host-variable.html

Il semble obscur, mal documenté, comme d'habitude avec powershell docs. À l'aide du point 4, l'appel de $ host.SetShouldExit (1) renvoie 1 à la méthode SetShouldExit de pshost, comme décrit ici.

http://msdn.microsoft.com/en-us/library/system.management.automation.host.pshost.setshouldexit(VS.85).aspx

Son dépend vraiment de la définition de votre propre code de sortie défintion. 0 et 1 suffixes je suppose.

salutations Bob.

Répondre

4

Voici une fonction que vous pouvez essayer:

function run-process ($cmd, $params) { 
$p = new-object System.Diagnostics.Process 
$p.StartInfo = new-object System.Diagnostics.ProcessStartInfo 
$exitcode = $false 
$p.StartInfo.FileName = $cmd 
$p.StartInfo.Arguments = $params 
$p.StartInfo.UseShellExecute = $shell 
$p.StartInfo.WindowStyle = 1; #hidden. Comment out this line to show output in separate console 
$null = $p.Start() 
$p.WaitForExit() 
$exitcode = $p.ExitCode 
$p.Dispose()  
return $exitcode 
} 

espoir qui aide

+0

Excellent compagnon. PowerShell, bien est shell, et pas .net, ce qui est clairement est.Thats résolu un de mes deux principaux problèmes Merci –

+0

Merci Lance –

1

Vous pouvez écrire dans votre code de script qui va vérifier le $ lastexitcode et throw an exception si le code de sortie n'est pas ce que vous avez exclu.
Les exceptions sont plus faciles à attraper.

+0

Aw droit ok. J'ai regardé Trap. Je vérifierai. Je suppose qu'il retourne dans le runtime C#, retourné par la collection d'erreurs. –

+0

Salut Shay, est-il possible de dire jeter une exception si le $? le code est faux. –

+0

vous voulez dire quelque chose comme: if ($ lastexitcode -eq 0) throw (new-object system.Exception ("Erreur") –

1

Je crois que vous faites une montagne d'une taupinière en utilisant ce projet de code. L'exécution asynchrone est très facile à faire en C#.

PowerShell psCmd = PowerShell.Create().AddScript({Invoke-YourScriptAndReturnLastExitCode}); 
IAsyncResult result = psCmd.BeginInvoke(); 
// wait for finish 
psCmd.EndInvoke(result); 

Aussi, regarder votre question sur ce projet, il semble que vous essayez d'utiliser TFS dans PowerShell. Vous pouvez prendre en compte les éléments suivants d'information:

  1. TFS has cmdlets
  2. Beaucoup d'autres personnes ont travaillé cmdlets TFS, à savoir PSTFS
  3. Vous pouvez toujours copier les TFS exécutable partout où vous en avez besoin, qui permet d'éviter au moins une partie de vos scripts douleur.

Hope this helps

+0

Bonjour MediaAndMicrocode, je n'ai jamais utilisé le code de lances. celui ci-dessus, sauf beaucoup plus robuste, où j'ai utilisé une file d'attente producteur/consommateur où chaque entrée de file d'attente est un bloc d'exécution pshell avec la file étant desservie par plusieurs threads.Un thread déqueue un bloc d'exécution et sélectionne 1 de plusieurs moteurs d'exécution pshell, en fonction de si elles ont été bloquées ou non par un Autoresetevent. formant et est exactement ce que je cherchais. Merci pour l'aide. Bob. –

+1

Je voudrais utiliser le TPL et le ci-dessus maintenant. –