Lua重定向标准输出到控制台窗口

我正在尝试编写一个lua脚本,需要向用户显示消息,而主机应用程序只提供了有限的支持。

因此,我想打开一个控制台窗口并将print()重定向到它。我期望这样的代码可以工作:

io.stdout = io.popen('find /v ""', "w")
print("It works!")

但是控制台窗口立即关闭,而不是等待来自管道的输入。

在Windows 7上使用lua 5.1

编辑:我注意到find命令在管道关闭时终止。它是不是无法读取管道数据,或者管道过早关闭导致失败?

点赞
用户869951
用户869951

你必须将数据写入管道:

pipe = io.popen('find /v ""', "w")
pipe:write("It works!")

文档中没有任何迹象表明io.stdout可以重置为指向其他文件句柄。实际上,有一些帖子表明print调用fputs直接,而不是通过io.stdout。最好将print指向管道的写入方法:

old_print = print
print = function(...) pipe:write(...) end

然后,上述操作之后,对print的任何调用都将转到管道中。理想情况下,应该在脚本结束时将print还原为原来的状态:

print = old_print
2014-10-05 02:09:20
用户4109488
用户4109488

我发现了,在 Windows 上打开控制台以进行输出,可以用以下方法:

local out = io.popen('find /v "" > con', "w")
function print(s)
  out:write(s.."\r\n") --\r because windows
  out:flush()
end
print("It really works this time!")

看起来,find 命令似乎提早终止,因为它没有指定 stdout。在命令结尾添加 > con 表示将 stdout 设置为控制台,并保持控制台打开状态。

2014-10-05 22:16:51