Lua - popen 2x '&&' chained set /p - stdout 休假

Lua - popen 2x '&&' chained set /p - stdout takes a vacation

我在一个功能几乎为零的环境中工作 ui,而 lua 脚本是 运行。这对于我需要编写的脚本来说是不可接受的,它在很大程度上依赖于用户输入。我发现避免这种情况的唯一方法是使用 io.popen 和一些相当狡猾的命令。

我知道我在这里尝试做的事情很奇怪而且非常错误,而且我已经把它带到了自己身上,但我无法弄清楚这段代码中出了什么问题:

local a = 'f'
local p = io.popen(
    'echo      -~`~-,_,- Editing '..(a == 'f' and 'foreground' or 'background')..' -~`~-,_,- > con && '.. --display text to the user
    'set /p f= Find block: > con < con && '.. --user input
    'call echo %f% &&' .. --pass f back to the lua script
    'set /p r= 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. 向用户显示 'command prompt window',要求输入。
  2. 用户输入了 2 个值。
  3. 这些值在输入时回显到 lua 脚本。
  4. 从管道中读取值并存储以备后用。
  5. 命令行等待按键,然后关闭。

实际发生了什么:

  1. 向用户显示 'command prompt window',要求输入。
  2. 用户输入了 f 的值。
  3. f 回显到 lua 脚本。
  4. 用户输入 r 的值。
  5. r 回显到控制台。 (!!!)
  6. f 从管道中读取。 r 不存在。
  7. 命令行等待按键,然后关闭。

这个非常相似的代码示例工作得很好,但只有 returns 1 个变量:

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 /p a= Choose an option: > con < con && '..
    'call echo %a%', "r")
a = string.lower(p:read("*a"):gsub("\n",""))
p:close()

我做错了什么,我该如何重写它以达到我的目的? 我到底释放了什么,如何将精灵放回瓶子里?

local p = io.popen(
   -- create temporary .bat-file
   'set tmpf="%TEMP%\TMP%RANDOM%.BAT" &&'.. 
   'cmd /c"(echo @set p=^%1&echo @set /p x= ^%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()

经过谷歌搜索后,我发现了这个:

(
 echo some output
 echo more output
)>"Your logfile

Redirecting Output from within Batch file

我不知道你可以像这样包装命令,自从我第一次发现它以来,我一直在修改 Windows CLI。


local a = 'f'
local p = io.popen(
    'echo      -~`~-,_,- Editing '..(a == 'f' and 'foreground' or 'background')..' -~`~-,_,- > con && '.. --display text to the user
    '( set /p f= Find block: && '.. --user input
    'set /p r= 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 脚本,它们所属的位置。

不过,如果有人能首先告诉我为什么这是一个问题,我将非常有兴趣进行解释。