Как извлечь $lastexitcode из выполнения скрипта C# powershell

У меня есть сценарий, выполняющийся в 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

Мне нужно вернуть код $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 ответа

Решение

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

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
}

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

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

Я полагаю, что вы делаете гору из мухи слона, используя этот проект кода. Асинхронное выполнение очень легко сделать в 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 куда угодно, что обойдёт хотя бы часть ваших скриптов.

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

Другие вопросы по тегам