Come estrarre $ lastexitcode dall'esecuzione dello script PowerShell in c#
-
12-09-2019 - |
Domanda
Ho uno script in esecuzione in C# utilizzando il codice di esecuzione asincrono PowerShell sul progetto di codice qui:
Devo restituire $lastexitcode e Jean-Paul descrive come utilizzare una classe pshost personalizzata per restituirlo.Non riesco a trovare alcun metodo o proprietà in pshost che restituisca il codice di uscita.
Questo motore di cui ho bisogno deve garantire che lo script venga eseguito correttamente.
Qualsiasi aiuto sarebbe apprezzato.
Saluti Bob.
È $lastexitcode e $?variabili che devo riportare.
Ciao, alla fine ha risposto.
Ho scoperto la variabile $host.Implementa un callback nell'host, in particolare un oggetto PSHost personalizzato, che consente di restituire $lastexitcode.Ecco un collegamento a una spiegazione di $host.
http://mshforfun.blogspot.com/2006/08/do-you-know-there-is-host-variable.html
Sembra essere oscuro, scarsamente documentato, come al solito con i documenti PowerShell.Utilizzando il punto 4, la chiamata $host.SetShouldExit(1) restituisce 1 al metodo SetShouldExit di pshost, come descritto qui.
Dipende davvero dalla definizione della definizione del codice di uscita.I suffissi 0 e 1 immagino.
Saluti Bob.
Soluzione
Ecco una funzione che puoi provare:
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
}
Spero possa aiutare
Altri suggerimenti
È possibile scrivere nel codice script che controllerà il $ lastexitcode e sarà un'eccezione se l'ExitCode non è quello che eccettuato.
Le eccezioni sono più facili da catturare.
Credo che si stanno facendo una montagna da un granello di sabbia utilizzando questo progetto di codice. esecuzione asincrona è molto facile da fare in C #.
PowerShell psCmd = PowerShell.Create().AddScript({Invoke-YourScriptAndReturnLastExitCode});
IAsyncResult result = psCmd.BeginInvoke();
// wait for finish
psCmd.EndInvoke(result);
Inoltre, guardando la tua domanda su quel progetto, sembra che si sta tentando di utilizzare TFS in PowerShell. Si può considerare i seguenti pezzi di informazioni aggiuntive:
- TFS ha cmdlet
- Molte altre persone hanno lavorato TFS cmdlet, cioè PSTFS
- È sempre possibile copiare i tfs eseguibile ovunque ne abbiate bisogno, che elude almeno una parte del vostro dolore script.
Spero che questo aiuti