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()
我期望发生的事情:
- 向用户显示 'command prompt window',要求输入。
- 用户输入了 2 个值。
- 这些值在输入时回显到 lua 脚本。
- 从管道中读取值并存储以备后用。
- 命令行等待按键,然后关闭。
实际发生了什么:
- 向用户显示 'command prompt window',要求输入。
- 用户输入了
f
的值。
f
回显到 lua 脚本。
- 用户输入
r
的值。
r
回显到控制台。 (!!!)
f
从管道中读取。 r
不存在。
- 命令行等待按键,然后关闭。
这个非常相似的代码示例工作得很好,但只有 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 脚本,它们所属的位置。
不过,如果有人能首先告诉我为什么这是一个问题,我将非常有兴趣进行解释。
我在一个功能几乎为零的环境中工作 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()
我期望发生的事情:
- 向用户显示 'command prompt window',要求输入。
- 用户输入了 2 个值。
- 这些值在输入时回显到 lua 脚本。
- 从管道中读取值并存储以备后用。
- 命令行等待按键,然后关闭。
实际发生了什么:
- 向用户显示 'command prompt window',要求输入。
- 用户输入了
f
的值。 f
回显到 lua 脚本。- 用户输入
r
的值。 r
回显到控制台。 (!!!)f
从管道中读取。r
不存在。- 命令行等待按键,然后关闭。
这个非常相似的代码示例工作得很好,但只有 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 脚本,它们所属的位置。
不过,如果有人能首先告诉我为什么这是一个问题,我将非常有兴趣进行解释。