5

我在这里使用代码项目上的 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 后缀。

问候鲍勃。

4

3 回答 3

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
}

希望有帮助

于 2009-04-23T02:08:17.187 回答
1

您可以在脚本代码中编写将检查 $lastexitcode 并在退出代码不是您例外时抛出异常的代码。
异常更容易捕获。

于 2009-04-19T21:22:43.637 回答
1

我相信您正在通过使用此代码项目从小山中翻山越岭。在 C# 中异步执行非常容易。

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

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

  1. TFS 有 cmdlet
  2. 许多其他人使用过 TFS cmdlet,即PSTFS
  3. 您始终可以在任何需要的地方复制 tfs 可执行文件,这至少可以避免部分脚本的痛苦。

希望这可以帮助

于 2010-03-22T00:53:49.667 回答