Как извлечь $ lastexitcode из выполнения скрипта c # powershell - PullRequest
5 голосов
/ 19 апреля 2009

У меня есть сценарий, выполняющийся в C # с использованием кода асинхронного выполнения powershell в проекте кода:

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

Мне нужно вернуть код $ lastexitcode, и Жан-Поль описывает, как вы можете использовать собственный класс pshost для его возврата. Я не могу найти ни одного метода или свойства в pshost, который возвращает код выхода.

Этот движок мне нужен, чтобы убедиться, что скрипт выполняется правильно.

Любая помощь будет оценена.

С уважением Боб.

Это $ lastexitcode и $? переменные мне нужно вернуть.

Привет, Наконец-то ответил.
Я узнал о переменной $ host. Он реализует обратный вызов в хосте, в частности, собственный объект PSHost, позволяющий вам возвратить код $ lastexitcode. Вот ссылка на объяснение $ host.

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

Это кажется неясным, плохо документированным, как обычно, с документами PowerShell. Используя точку 4, вызов $ host.SetShouldExit (1) возвращает 1 в метод SetShouldExit в pshost, как описано здесь.

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

Это действительно зависит от определения вашего собственного определения кода выхода. 0 и 1 суффиксы, я думаю.

С уважением Боб.

Ответы [ 3 ]

4 голосов
/ 23 апреля 2009

Вот функция, которую вы можете попробовать:

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
}

Надеюсь, что поможет

1 голос
/ 22 марта 2010

Я полагаю, что вы делаете гору из мухи слона, используя этот проект кода. Асинхронное выполнение очень легко сделать в C #.

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

Также, глядя на ваш вопрос об этом проекте, похоже, что вы пытаетесь использовать TFS в PowerShell. Вы можете рассмотреть следующие дополнительные части информации:

  1. TFS имеет командлеты
  2. Многие другие работали с командлетами TFS, т.е. PSTFS
  3. Вы всегда можете скопировать исполняемый файл tfs там, где вам это нужно, что обходит хотя бы часть ваших скриптов.

Надеюсь, это поможет

1 голос
/ 20 апреля 2009

Вы можете написать в своем коде сценария, который проверит код $ lastexitcode и сгенерирует исключение , если код выхода не тот, который вы исключили.
Исключения легче поймать.

...