如何从c#powershell脚本执行中提取$lastexitcode

如何从c#powershell脚本执行中提取$lastexitcode,c#,powershell,scripting,exit-code,pshost,C#,Powershell,Scripting,Exit Code,Pshost,我在C#中使用powershell异步执行代码在代码项目中执行了一个scipt,如下所示: 我需要返回$lastexitcode,Jean Paul描述了如何使用自定义pshost类来返回它。我在pshost中找不到任何返回退出代码的方法或属性 我拥有的这个引擎需要确保脚本正确执行 任何帮助都将不胜感激 问候 鲍勃 它是$lastexitcode和$?我需要带回来的变量 嗨, 终于回答了。 我发现了$host变量。它实现了对主机的回调,特别是自定义PSHost对象,使您能够返回$lastexi

我在C#中使用powershell异步执行代码在代码项目中执行了一个scipt,如下所示:

我需要返回$lastexitcode,Jean Paul描述了如何使用自定义pshost类来返回它。我在pshost中找不到任何返回退出代码的方法或属性

我拥有的这个引擎需要确保脚本正确执行

任何帮助都将不胜感激

问候 鲍勃

它是$lastexitcode和$?我需要带回来的变量

嗨, 终于回答了。
我发现了$host变量。它实现了对主机的回调,特别是自定义PSHost对象,使您能够返回$lastexitcode。下面是一个指向$host解释的链接

与powershell文档一样,它似乎晦涩难懂,文档记录不完整。使用第4点,调用$host.SetShouldExit(1)会将1返回给pshost的SetShouldExit方法,如下所述

这实际上取决于定义您自己的退出代码定义。我猜是0和1的后缀

问候
Bob。

您可以在脚本代码中编写检查$lastexitcode的代码,如果exitcode不是您所期望的,则将检查该代码。

异常更容易捕获。

您可以尝试以下功能:

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
}

希望这会有所帮助

我相信您使用此代码项目是小题大做。异步执行在C#中非常容易

另外,看看您在该项目中提出的问题,您似乎正在尝试在PowerShell中使用TFS。您可以考虑以下附加信息:

  • 许多其他人也使用过TFS cmdlet,即
  • 您可以随时将tfs可执行文件复制到任何需要的地方,这至少可以避免部分脚本的痛苦

  • 希望这有帮助,好的。我已经看过陷阱了。我去看看。我假设它返回到c#运行时,通过errors集合返回?代码为false。您的意思是:if($lastexitcode-eq 0)throw(new object system.Exception(“Error”)Hi MediaAndMicrocode,我从来没有使用过lances代码。我使用了与上面类似的方法,除了更健壮的方法外,我使用了生产者/消费者队列,其中每个队列条目都是pshell执行块,队列是由多个线程提供的服务。线程将执行块出列,并选择多个pshell执行引擎中的一个,depending是否被自动重置事件阻止。它工作正常,性能良好,正是我想要的。谢谢你的帮助。鲍勃。我现在会使用TPL和上面的。
    PowerShell psCmd = PowerShell.Create().AddScript({Invoke-YourScriptAndReturnLastExitCode});
    IAsyncResult result = psCmd.BeginInvoke();
    // wait for finish
    psCmd.EndInvoke(result);