我在一个lua脚本运行的时候,在一个functionui几乎为零的环境中工作。 这对于我需要编写的脚本来说是不可接受的,而脚本在很大程度上依赖于用户input。 我发现绕过这一切的唯一方法是使用io.popen
与一些相当狡猾的命令。
我意识到我在这里要做的事情是奇怪的,而且是非常错误的,而且我已经把自己带到了这里,但是我无法弄清楚这个代码片段中出现了什么问题:
local a = 'f' local p = io.popen( 'echo -~`~-,_,- Editing '..(a == 'f' and 'foreground' or 'background')..' -~`~-,_,- > con && '.. --display text to the user 'set /pf= Find block: > con < con && '.. --user input 'call echo %f% &&' .. --pass f back to the lua script 'set /pr= Replace with: > con < con && '.. --user input 'call echo %r% &&' .. --pass r back to the lua script 'pause < con', "r") local f = p:read("*a") --read what was passed back, later parse it back into 2 variables p:close()
f
的值。 f
被回传给lua脚本。 r
的值。 r
回显到控制台。 (!!!) f
从pipe道读取。 r
不存在。 这个非常相似的代码示例工作得很好,但只返回1个variables:
p = io.popen( 'echo What do you want to do? > con && '.. 'echo G: remove girders > con && '.. 'echo F: swap foreground > con && '.. 'echo B: swap background > con && '.. 'echo U: undo all edits > con && '.. 'echo C: cancel > con && '.. 'set /pa= Choose an option: > con < con && '.. 'call echo %a%', "r") a = string.lower(p:read("*a"):gsub("\n","")) p:close()
我做错了什么,我怎么能改写这个为我的目的工作? 我释放了世界上的什么东西,我怎么把灵魔放回瓶子里?
经过一段时间的搜索,我发现这一点:
( echo some output echo more output )>"Your logfile
从批处理文件中重定向输出
我不知道你可以封装这样的命令,自从我第一次发现它之后,我一直在修改Windows CLI。
local a = 'f' local p = io.popen( 'echo -~`~-,_,- Editing '..(a == 'f' and 'foreground' or 'background')..' -~`~-,_,- > con && '.. --display text to the user '( set /pf= Find block: && '.. --user input 'set /pr= Replace with: ) > con < con && '.. --user input 'call echo %f% &&' .. --pass f back to the lua script 'call echo %r% &&' .. --pass r back to the lua script 'pause < con > con', "r") local f = p:read("*a") --read what was passed back, later parse it back into 2 variables p:close()
如上所述包装两个set /p
语句的工作 – 我得到f
的预期输出,后面跟着一个换行符,然后r
,全部发回到他们所属的lua脚本。
不过,如果任何人都可以为我解释为什么这是一个问题,我会非常感兴趣的解释。
local p = io.popen( -- create temporary .bat-file 'set tmpf="%TEMP%\\TMP%RANDOM%.BAT" &&'.. 'cmd /c"(echo @set p=^%1&echo @set /px= ^%p:~1,-1^%^>con&echo @call echo ^%x^%)>%tmpf%" &&'.. -- Your main program 'echo. -~`~-,_,- Editing '..(a == 'f' and 'foreground' or 'background')..' -~`~-,_,- > con &&'.. --display text to the user 'call %tmpf% "Find block:" < con &&'.. -- pass f back to the lua script 'call %tmpf% "Replace with:" < con &&'..-- pass r back to the lua script -- delete temporary .bat-file 'call del %tmpf% > con &&'.. 'pause < con', "r") local f = p:read'*a' p:close()