2014-03-07 34 views
2

我正在为JavaScript项目构建环境。我们使用require.js(r.js)将不同的js模块组合成一个输出js文件。我们使用TeamCity,我希望配置Powershell构建步骤,它将调用r.js,读取它的标准输出并退出代码,并将该退出代码传递回TeamCity(通过退出Powershell并退出该代码),以便如果任务失败r.js返回退出代码1)它不会继续执行其他构建步骤。我还希望将r.js的标准输出保存在TeamCity日志中,以便开发人员快速查看导致r.js停止的错误。从PowerShell中的进程读取退出代码

这是这样我怎么能与它的参数启动r.js过程中,阅读它的退出代码,并用它从PowerShell来退出:

$process = start-process r.js.cmd -ArgumentList "-o build-dev.js" -PassThru -Wait 
exit $process.ExitCode 

如果我尝试之前阅读这样的标准输出退出:

Write-Host $process.StandardOutput.ReadToEnd(); 

我得到这个错误,这可能意味着我不能这样读StandardOutput,因为它是一个流:

You cannot call a method on a null-valued expression. At line:1 char:45 + Write-Host $process.StandardOutput.ReadToEnd <<<<(); + CategoryInfo : InvalidOperation: (ReadToEnd:String) [], Runtime Exception + FullyQualifiedErrorId : InvokeMethodOnNull

Process exited with code 1

现在我发现运行的进程,这样我可以读取标准输出的方式,但我不能够读取退出代码:

$psi = New-object System.Diagnostics.ProcessStartInfo 
$psi.UseShellExecute = $false 
$psi.RedirectStandardOutput = $true 
$psi.RedirectStandardError = $true 
#$psi.FileName = "r.js.cmd" 
$psi.FileName = "C:\Users\Administrator\AppData\Roaming\npm\r.js.cmd" 
$psi.Arguments = @("-o build-dev.js") 
#$psi.WorkingDirectory = (Get-Location).Path; 
$process = New-Object System.Diagnostics.Process 
$process.StartInfo = $psi 
$process.Start() | Out-Host 
$process.WaitForExit() 
$output = $process.StandardOutput.ReadToEnd() 
$stderr = $process.StandardError.ReadToEnd() 
sleep(10) 
$exit_code = $process.ExitCode 

write-host "========== OUTPUT ==========" 
write-host $output 
write-host "========== ERROR ==========" 
write-host $stderr 
write-host "========== EXIT CODE ==========" 
write-host $exit_code 
write-host "========== $LastExitCode ==========" 
#write-host $LastExitCode 
#Exit $exit_code 

,但这又返回控制台输出,但退出代码即使r.js返回1也是0,因为我的js脚本中有错误。

任何人都可以建议我怎么能读取开始处理标准输出或我怎么能读取新对象退出代码System.Diadnostics.ProcessStartInfo

我可以附上截图与我的TC构建步骤配置的更多细节并输出保存到构建日志,如果这将有助于回答这个问题。

+3

难道你不能只使用'$ result = r.js.cmd -o build-dev.js; $ exit_code = $ LastExitCode'? –

+0

'r.js.cmd'是CMD脚本吗?如果是这样,你确定它实际上生成退出代码?如果CMD脚本正在启动构建的其他进程,则它不仅需要报告退出代码,而且还需要将其冒泡,例如'exit%buildProcessExitCode%' – andyb

+0

如果下面的链接是r.is.cmd,那么它不会生成退出代码。需要修改才能这样做。或者在PS中重写。 https://code.google.com/p/yarse/source/browse/node_modules/.bin/r.js.cmd?spec=svn643e791a0cab8b875ab5bb643e760c31486183d1&r=643e791a0cab8b875ab5bb643e760c31486183d1 – andyb

回答

1

我通常通过使用问题中提到的启动进程命令的变体来解决这种情况。

$outputLog = "outputFile.log" 
$errLog = "errorFile.log" 
$process = Start-Process r.js.cmd -ArgumentList "-o build-dev.js" -PassThru -RedirectStandardOutput $outputLog -RedirectStandardError $errLog -Wait 
$exitCode = $process.ExitCode 

现在,日志文件$ outputLog和$ errorLog将具有标准输出和错误内容。