gpt4 book ai didi

powershell - 从 PowerShell 中的进程读取退出代码

转载 作者:行者123 更新时间:2023-12-03 00:02:15 32 4
gpt4 key购买 nike

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

这是我可以使用它的参数启动 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

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

谁能建议我如何使用 start-process 读取标准输出或如何使用 New-object System.Diadnostics.ProcessStartInfo 读取退出代码

如果这有助于回答问题,我可以附上屏幕截图,其中包含我的 TC 构建步骤配置和保存到构建日志的输出的更多详细信息。

最佳答案

我通常通过使用问题中提到的 start-process 命令的变体来解决这种情况。

$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 将具有标准输出和错误内容。

关于powershell - 从 PowerShell 中的进程读取退出代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22255168/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com