2

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 编程中提供的所有建议 - os.execute() 在 Windows 中不起作用为什么 Program Files 中的应用程序不能在 lua 中使用 os.execute 运行? 但我的问题似乎是另一个问题,甚至可能不在语法上,而是在其他地方?

当我直接在命令提示符中键入这些命令时,它们就起作用了。我使用 Windows 7 Professional 作为管理员,使用 Lua 5.1.4 和 Eclipse。

这是我到目前为止所尝试的:

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() 已在某处提出,但据说它依赖于平台,无论如何我的当我尝试使用时 Lua 崩溃x = io.popen("R -q -e 'rnorm(10)'"))。

编辑,在第一个答案后:

您的 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,但是不能。

4

3 回答 3

1

已经有一段时间了,但最后(感谢一位同事),我发现问题不在于 Lua 代码,而实际上是从 Eclipse 执行 Lua(我使用的是 Lua Eclipse 插件)。

使用代码执行 lua 文件

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

从命令提示符或使用 Crimson 编辑器(见下文),它运行良好,并返回状态代码 0(而不是从 Eclipse 执行时的 -1)。

无论如何,非常感谢所有帮助者!那个东西

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

于 2012-11-22T17:20:02.623 回答
0

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

因此,以下对我来说很好:

os.execute([[ echo test > "C:\\Program Files\\xyz.txt" ]])
于 2012-11-07T18:18:43.443 回答
0

这段代码适用于我的 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() 调用它可能会为您提供更多信息。

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-07T15:38:06.530 回答