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

时间:2009-04-19 18:10:37

标签: c# powershell scripting exit-code pshost

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

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,Jean-Paul描述了如何使用自定义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返回到pshost的SetShouldExit方法,如此处所述。

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

它实际上取决于定义自己的退出代码定义。我想是0和1个后缀。

问候 鲍勃。

3 个答案:

答案 0 :(得分:4)

您可以尝试以下功能:

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 :(得分:1)

您可以在脚本代码中写入将检查$ lastexitcode的内容,如果exitcode不是您排除的内容,则会throw an exception。 例外情况更容易被发现。

答案 2 :(得分:1)

我相信你是通过使用这个代码项目从一个小山丘造山的。在C#中很容易执行异步执行。

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

此外,查看您在该项目上的问题,看起来您正在尝试在PowerShell中使用TFS。您可以考虑以下其他信息:

  1. TFS has cmdlets
  2. 许多其他人使用过TFS cmdlet,即PSTFS
  3. 您可以随时将tfs可执行文件复制到您需要的地方,这样可以避免至少部分脚本出现问题。
  4. 希望这有帮助