Lua的os.execute()无法正常工作。

我在 Lua 的 os.execute() 命令方面遇到了问题。

我只是想回显一个单词并将其写入一个文件,比如 echo 'aword' > C:\folder\tempworkspace\foo 来尝试 os.execute() 命令。目录 C:\folder\tempworkspace 存在,"foo" 是我希望该命令创建并用 "aword" 填充的文件的名称。 后来,当这个命令能够工作时,我想调用 R,使用 R -q -e "rbinom(1000,1,0.7)" > C:\folder\tempworkspace\foo

我已经尝试了在Lua programming - os.execute() is not working in WindowsWhy won't applications in Program Files run using os.execute in lua? 中提供的所有建议,但我的问题似乎是一个不同的问题,也许不是在语法上,而是在其他地方?

当我在命令提示符中直接输入这些命令时,它们是可以工作的。我使用 Windows 7 专业版作为管理员,并使用 Eclipse 中的 Lua 5.1.4。

到目前为止,这是我已经尝试过的:

os.execute("echo 'hehe' > C:\folder\tempworkspace\foo")
os.execute [["echo 'hehe' > C:\folder\tempworkspace\foo"]]
os.execute [["echo 'hehe' > 'C:\folder\tempworkspace\foo'"]]
os.execute [[echo 'hehe' > C:\folder\tempworkspace\foo]]
os.execute [[echo 'hehe' > C:\\folder\\tempworkspace\\foo]]
os.execute[[cmd.exe /c echo 'hehe' > C:\folder\tempworkspace\foo]]
os.execute("cmd.exe /c echo 'hehe' > C:\\folder\\tempworkspace\\foo")
os.execute("cmd.exe /c echo 'hehe' > 'C:\\folder\\tempworkspace\\foo'")

如果您有任何建议来改善我的代码,我将非常感激。(注意:我正在写入文件,因为我希望稍后在 lua 中使用输出。也提出了使用 io.popen() 的另一种方法,但据说这是平台相关的,无论如何,当我尝试使用 x = io.popen("R -q -e 'rnorm(10)'") 时,我的 Lua 会崩溃)。

编辑后第一次回复:

您的 sendMsg 函数在我的电脑上也无法工作,而且我没有收到任何错误,我真的很想知道问题出在哪里。 对于 pcall,我做得对吗?由于 print(err) 没有输出任何内容,我想知道我是否做得正确。

function sendMsg(cmd, msg, fpath)
  local output = cmd.. " ".. msg.. " > ".. fpath
  print(output)
  os.execute(output)
end
function sendMsgArgs()
  sendMsg("echo", "huhu", "C:\\merret\\tempworkspace\\foo");
end
err = pcall(sendMsgArgs)
if err == true then
  print("THIS WORKED")
else
  print("THIS DID NOT WORK")
  print(err)
end

编辑:这实际上是 Eclipse / 编辑器的问题。所以我想添加一些标签,比如 lua-eclipse,但我不能。

点赞
用户1208078
用户1208078

以下是可在我的Win7机器上运行的代码片段:

function sendMsg(cmd, msg, fpath)
    local output = cmd.. " ".. msg.. " > ".. fpath
    print(output)
    os.execute(output)
end

sendMsg("echo", "hehe", "C:\\path\\to\\foo");

在尝试写入文件之前需要确保文件存在。你是从lua解释器中运行该代码吗?如果写入失败,则会返回任何错误信息吗?

另一种方法是直接使用io.open()进行写入。将其封装在一个函数中并使用pcall()调用它可能会为您提供更多信息,如果您在打开/读取该位置时存在某些Windows问题。

local fout = io.open("C:\\path\\to\\foo", "w+")
fout:write("hehe")
fout:close()

使用pcall的示例:

local result, error = pcall(sendMsg, "echo", "huhu", "C:\\merret\\tempworkspace\\foo")
if result == false then
    print(error)
else
    print("success!")
end
2012-11-07 15:38:06
用户1516484
用户1516484

如果您要写入的路径包含空格,则在 Windows 下必须用双引号将其括起来;单引号会抛出错误。

因此,对于我来说,以下内容正常工作:

os.execute([[ echo test > "C:\\Program Files\\xyz.txt" ]])
2012-11-07 18:18:43
用户1806110
用户1806110

将下面翻译成中文并且保留原本的 markdown 格式

好久不见了,但最终(多亏同事)我发现问题不是Lua代码,而是从Eclipse执行Lua时(我使用的是Lua Eclipse插件)。

使用以下代码执行lua文件

x = os.execute('R -q -e rnorm(10) > C:/folder/something/foo')
print(x)

从命令提示符或使用Crimson Editor(见下文)连接后,它完美地工作了,并返回状态代码0(在从Eclipse执行时为-1)。

无论如何,非常感谢所有的帮助者! The Thing

PS:对于任何感兴趣的人,我正在使用Lua作为TerraME环境的一部分,http://www.terrame.org/doku.php。那里也有一个关于如何使用Crimson Editor的描述。

2012-11-22 17:20:02