Lua – popen 2x'&&'chained set / p – stdout需要休假

我在一个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() 

我期望发生的事情:

  1. 向用户显示“命令提示符窗口”,询问input。
  2. 用户input2个值。
  3. 这些值在input时回显给lua脚本。
  4. 这些值从pipe道中读取并存储起来供以后使用。
  5. 命令行等待按键,然后closures。

究竟发生了什么:

  1. 向用户显示“命令提示符窗口”,询问input。
  2. 用户inputf的值。
  3. f被回传给lua脚本。
  4. 用户inputr的值。
  5. r回显到控制台。 (!!!)
  6. f从pipe道读取。 r不存在。
  7. 命令行等待按键,然后closures。

这个非常相似的代码示例工作得很好,但只返回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()