2

Lua os.execute()コマンドに問題があります。

echo 'aword' > C:\folder\tempworkspace\fooos.execute()コマンドを試すように、単語をエコーし​​てファイルに書き込みたいだけです。ディレクトリC:\ folder \ tempworkspaceが存在します。「foo」は、コマンドで作成して「aword」で埋めるファイルの名前です。後でこれが機能するときに、を使用してRを呼び出したいと思いR -q -e "rbinom(1000,1,0.7)" > C:\folder\tempworkspace\fooます。

Luaプログラミングで提供されるすべてのアドバイスをすでに試しました -os.execute()がWindowsで機能していません。また、プログラムファイルのアプリケーションがluaでos.executeを使用して実行されないのはなぜですか? しかし、私の問題は別の問題のようです。おそらく構文ではなく、どこか別の問題ですか?

これらのコマンドをコマンドプロンプトに直接入力すると、機能します。管理者としてWindows7Professionalを使用し、EclipseでLua5.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()を使用することがどこかで提案されていますが、とにかくプラットフォームに依存すると言われています。使用しようとすると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 Editor(以下を参照)を使用すると、完全に機能し、ステータスコード0(Eclipseから実行した場合は-1ではなく)が返されました。

とにかくすべてのヘルパーに感謝します!その事

PS:興味のある人のために、私はTerraME環境の一部としてLuaを使用しています。http: //www.terrame.org/doku.php 。CrimsonEditorの使用方法についての説明もあります。

于 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()を使用して呼び出すと、ある種の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-07T15:38:06.530 に答える