Как извлечь $lastexitcode из выполнения скрипта C# powershell
У меня есть сценарий, выполняющийся в C# с использованием кода асинхронного выполнения powershell в проекте кода:
Мне нужно вернуть код $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, как описано здесь.
Это действительно зависит от определения вашего собственного определения кода выхода. 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. Вы можете рассмотреть следующие дополнительные части информации:
- TFS имеет командлеты
- Многие другие работали с командлетами TFS, т.е. PSTFS
- Вы всегда можете скопировать исполняемый файл tfs куда угодно, что обойдёт хотя бы часть ваших скриптов.
Надеюсь это поможет