我在 Jenkins(确切地说是 Unity3D)中有一个耗时很长的批处理过程,它没有向控制台提供任何输出。
它只写入日志文件unityLog.txt
,并且不是向控制台本身产生任何输出。
我需要在将输出附加到控制台中的日志文件时显示它,以便用户可以通过 Jenkins Web 界面看到它。
所以我目前正在做的是(更多关于Unity 命令行参数)
E:\Unity\2019.3.3f1\Editor\Unity.exe -quit -batchmode -projectPath E:\Projects\Example -executeMethod JENKINS.AutoBuilder.PerformBuild -logFile unityLog.txt -buildFolder E:\Projects\Example\Build
type unityLog.txt
该命令实际上在项目文件夹中运行,因此它可以工作,但仅在 unity 完成后才显示文件的内容。
我已经读过很多类似的问题显示 Windows 命令提示符输出并将其重定向到文件它工作得很好,但他们总是假设命令本身会产生任何直接的控制台输出。
正如所说,这里的情况并非如此。
因此我需要的实际上是一种批量执行在 bash 中我可能会做的事情的形式(这也只是一个例子,不幸的是我也不是 bash 专家 ;))
function MyLongTakingProcess()
{
pid=$!
E:\Unity\2019.3.3f1\Editor\Unity.exe -quit -batchmode -projectPath E:\Projects\Example -executeMethod JENKINS.AutoBuilder.PerformBuild -logFile unityLog.txt -buildFolder E:\Projects\Example\Build
kill $pid
}
touch unityLog.txt
tail -f unityLog.txt & MyLongTakingProcess
永久显示添加的行,但在命令完成后立即取消。
知道如何实现这一点吗?
答案1
引用您链接的文档(重点是我的):
指定 Unity 写入编辑器或 Windows/Linux/OSX 独立日志文件的位置。要输出到控制台,请指定路径名 -。在 Windows 上,指定 - 选项以使输出转到 stdout,默认情况下它不是控制台。
比,作为这个答案指出您可以使用Tee-Object
PowerShell 将该标准输出复制到文件中,以备不时之需。
答案2
如果我理解了这个问题,你希望在 Windows 中跟踪日志。如果这是你的用例,那么请查看裸尾. 它是一个跟踪日志文件的 Windows 实用程序,用于实时日志分析。
答案3
我发现我可以实现我所寻找的目标,方法是执行以下操作
首先我创建文件(相当于touch
)
echo. 2>test.txt
然后我启动一个“后台”进程powershell -c "get-content test.txt -wait"
(相当于tail -f test.txt
)
start /b "logoutput" powershell -c "get-content test.txt -wait -ErrorAction Ignore"
附加功能-ErrorAction Ignore
会隐藏控制台中的任何错误。
然后我开始实际的耗时任务,该任务生成输出以test.txt
使用
start /b "long" /wait LONGTEST.bat
为了等待它完成
然后最后我只需使用
del test.txt
删除文件会导致 powershell 退出并出现错误。但是我使用 解决了该错误-ErrorAction Ignore
。
所以总共
echo. 2>test.txt
start /b "logoutput" powershell -c "get-content test.txt -wait -ErrorAction Ignore"
start /b "long" /wait LONGTEST.bat
del test.txt
get-content
使用这个,我现在可以在控制台中看到完整的日志,并且最终能够“杀死”(使失败退出)该进程。