2009-04-19 6 views
4

ich habe eine scipt Ausführung in C# mit dem Powershell-Asynchron-Ausführungscode auf Projekt-Code zu extrahieren:

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

ich den $ lastexitcode zurückkommen müssen und Jean-Paul beschreibt, wie Sie eine benutzerdefinierte pshost-Klasse verwenden können, um sie zurückzugeben. Ich kann keine Methode oder Eigenschaft in pshost finden, die den Exit-Code zurückgibt.

Diese Engine muss ich sicherstellen, dass Skript ordnungsgemäß ausgeführt wird.

Jede Hilfe wäre willkommen.

Grüße Bob.

Es ist der $ lastexitcode und der $? Variablen, die ich zurückbringen muss.

Hallo, Endlich beantwortet.
Ich habe über die $ Host-Variable herausgefunden. Es implementiert einen Rückruf in den Host, insbesondere ein benutzerdefiniertes PSHost-Objekt, mit dem Sie den $ lastexitcode zurückgeben können. Hier ist ein Link zu einer Erklärung von $ host.

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

Es scheint mit Powershell-docs wie gewohnt dunkel, schlecht dokumentiert, zu sein. Unter Verwendung von Punkt 4 gibt der Aufruf von $ host.SetShouldExit (1) 1 an die SetShouldExit-Methode von pshost zurück, wie hier beschrieben.

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

Sein hängt wirklich Ihren eigenen Exit-Code defintion auf definieren. 0 und 1 Suffixe schätze ich.

Grüße Bob.

Antwort

4

Hier ist eine Funktion, die Sie ausprobieren können:

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 
} 

Hoffnung, die

+0

Ausgezeichnete Kumpel. Ich denke immer noch die powershell, well is shell, und nicht .net, was klar ist, das ist gelöst eines meiner beiden Hauptprobleme. Danke. –

+0

Danke Lance. –

1

Sie können in Ihren Skriptcode schreiben, der den $ lastexitcode überprüft und throw an exception, wenn der Exitcode nicht das ist, was Sie ausgenommen haben.
Ausnahmen sind einfacher zu fangen.

+0

Aw Recht ok. Ich habe mir Trap angesehen. Ich werde das überprüfen. Ich gehe davon aus, dass es in die C# -Laufzeit zurückkehrt, die durch die Fehlersammlung zurückgegeben wurde. –

+0

Hallo Shay, ist möglich, sagen wir eine Ausnahme, wenn die $? Code ist falsch. –

+0

meinst du sowas wie: if ($ lastexitcode -eq 0) werfen (new-object system.Exception ("Error") –

1

ich hilft glauben Sie, indem Sie den Code Projekt einen Berg aus einem Maulwurfshügel machen. Asynchrone Ausführung ist in C# sehr einfach.

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

Auch zu Ihrer Frage an diesem Projekt suchen, es sieht aus wie Sie versuchen, TFS in Powershell zu verwenden. Sie können die folgenden zusätzlichen Informationen berücksichtigen:

  1. TFS has cmdlets
  2. Viele andere Leute TFS Cmdlets gearbeitet haben, dh PSTFS
  3. Sie können jederzeit die tfs kopieren ausführbar, wo Sie es brauchen, die zumindest teilweise ausweicht von deinen Skripts schmerzen.

hoffe, das hilft

+0

Hallo MediaAndMicrocode, ich habe nie verwendet Lanzen Code.Ich habe eine ähnliche Methode verwendet die obige, mit Ausnahme von viel robuster, wo ich eine Producer/Consumer Queue verwendete, wobei jeder Queue-Eintrag ein pshell-Execution-Block ist, wobei die Queue Dienste von mehreren Threads ist. Ein Thread entfernt einen Ausführungsblock und wählt 1 von mehreren pshell-Ausführungsengines aus. abhängig davon, ob sie von einem Autoresetevent blockiert wurden oder nicht. Es funktioniert gut, ist per Formant und genau das, was ich gesucht habe. Danke für die Hilfe. Bob. –

+1

Ich würde jetzt die TPL und die oben genannten verwenden. –

Verwandte Themen