2014-10-04 28 views
2

我正在嘗試編寫一個需要向用戶顯示消息的lua腳本,當然宿主應用程序只提供有限的支持。Lua將stdout重定向到控制檯窗口

所以我想打開一個控制檯窗口並將print()重定向到它。我希望這樣的工作:

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

但控制檯窗口只是立即關閉,而不是等待來自管道的輸入。

在Windows 7

編輯使用Lua 5.1:我注意到,當管道被關閉find命令終止。難道它不能從管道讀取,或者管道過早關閉?

回答

2

我想通了,打開控制檯在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設置爲控制檯,並保持控制檯處於打開狀態。

+0

+1發佈解決方案,並很高興你想通了! – Schollii 2014-10-05 22:32:56

1

你必須將數據寫入到管道:

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 
+0

這很有道理,如果'io.stdout'不可寫,它可能是被垃圾收集的管道。但是,控制檯窗口仍會立即關閉。我認爲這可能是'find'是一個內部命令,所以我嘗試了'io.popen('cmd/d/c find/v「」',「w」)',但是這並沒有什麼不同。運行'echo hello | cmd/d/c find/v「」'從命令提示符工作正常,所以它不應該是沒有采取的管道。 – ParadoxGate 2014-10-05 03:15:56

+0

你爲什麼要在'pipe:write'之後控制檯保持打開狀態? – Schollii 2014-10-05 12:24:40

+0

由於我的腳本繼續運行,我需要多次寫入,並且寫入管道的文本從不出現,並且如果控制檯立即關閉,則不可讀。也許我應該澄清一點:我的腳本是一個需要幾分鐘的安裝腳本,並且,假如主機程序在我的腳本運行時凍結,我需要輸出某種信息來讓用戶確信一切正在運行,因爲它應該。 – ParadoxGate 2014-10-05 13:53:10

相關問題