Lua os.execute()不起作用

时间:2012-11-07 13:02:38

标签: eclipse lua command-prompt

我遇到Lua os.execute()命令的问题。

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

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

当我直接在命令提示符中键入这些命令时,它们可以正常工作。我使用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()已被建议在某个地方,但据说它依赖于平台,无论如何我的当我尝试使用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,但我不能。

3 个答案:

答案 0 :(得分:1)

它已经有一段时间了,但最后(感谢同事),我发现问题不是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)。

非常感谢所有助手! 那件事

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

答案 1 :(得分: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 

答案 2 :(得分:0)

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

因此,以下对我来说没问题:

os.execute([[ echo test > "C:\\Program Files\\xyz.txt" ]])