2012-11-07 152 views
1

我遇到了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 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,但是我不能。

+0

從您嘗試的8個os.execute(...)命令的第一個列表中,實際上第2,4,5,6和7行的版本可以在我的計算機上運行!你確定你有寫權限的目錄嗎? – prapin

+0

這很有趣。當我從正常的命令提示符執行相同的命令時,它們工作。我也是管理員。所以我認爲我有寫權限。但我可以錯了嗎?當通過Lua執行命令時,寫入訪問是否會有所不同?我怎樣才能找到/改變這個?你知道嗎?那會很有幫助! – thatthing

+0

pcall()返回2個值,如果發生錯誤,則返回一個bool和一個錯誤字符串。所以如果'result'爲false,則將第二個片段更改爲'local result,error = pcall(sendMsgArgs)'和'print(error)'。這可能會告訴你什麼是錯的。 –

回答

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()調用它可能會給你更多的信息,如果你有某種窗口打開/讀入該位置的問題。

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

一個例子:

local result, error = pcall(sendMsg, "echo", "huhu", "C:\\merret\\tempworkspace\\foo") 
if result == false then 
    print(error) 
else 
    print("success!") 
end 
+0

謝謝你的快速回答! – thatthing

+0

感謝您的快速回答! 'fout = io.open(...)'起作用,但後來我將不得不運行R命令(例如'R -q -e「rbinom(1000,1,0.7)」> C:\ folder \ tempworkspace \ foo ')從命令行輸出並將結果打印到文件中,所以這對我不起作用,如果我沒有弄錯的話。你的sendMsg函數在某種程度上也不能在我的電腦上工作,或者我沒有正確地做,我會在我最初的問題下發布我的代碼(這個評論不夠大,而且它不是一個真正的答案......我'米仍然是一個Stackoverflow新手)。 – thatthing

0

如果你想要寫的路徑包含空格,則必須用雙引號括Windows下包圍;單引號會引發錯誤。

因此,以下爲我工作得很好:

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

但是,對於試圖在'\ Program Files'上寫入的默認ACLs,Win7或更高版本的大多數用戶應該會失敗。像這樣嵌套在'os.execute'中,故障可能很難診斷。 – RBerteig

+0

感謝您的建議。我曾嘗試使用不包含任何空格的文件路徑,以避免該問題... – thatthing

1

它已經有一段時間,但最終(感謝一個同事),我想通了,這個問題是不是Lua代碼,但實際執行來自Eclipse的Lua(我正在使用Lua Eclipse插件)。

執行一個LUA文件從命令提示或使用深紅編輯(見下文)的代碼

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

,它的工作完美,返回的狀態代碼0(而不是-1從Eclipse的執行時) 。

無論如何非常感謝所有幫手! 那東西

PS:對於任何有興趣的人,我使用Lua作爲TerraME環境的一部分,http://www.terrame.org/doku.php。還有一個描述如何使用Crimson編輯器。

+0

我遇到類似的問題。我在另一個IDE中運行完全相同的代碼,它工作正常。如果我在命令提示符下運行完全相同的命令行,它可以工作,但是如果我在eclipse項目中運行,它不起作用! /你有沒有取得進展? – AbstractDissonance