我正在尝试从Lua脚本执行Sox。
当我将文字作为参数传递时,它工作正常。
os.execute('"C:\\Sox\\sox.exe" -S C:\\SoX\\test.wav -r 22050 C:\\Sox\\SoX_out.wav')
或
os.execute [["C:\\Sox\\sox.exe" -S C:\\SoX\\test.wav -r 22050 C:\\Sox\\SoX_out.wav]]
然而,当我尝试这个时,我想做什么(例如):
filename = "C:\\SoX\\test.wav"
os.execute('"C:\\Sox\\sox.exe" -S filename -r 22050 C:\\Sox\\SoX_out.wav')
我明白了:
C:\ Sox \ sox.exe失败格式:无法打开输入文件`filename':没有这样的文件或目录
所以我的问题是如何正确传递字符串作为命令参数?
答案 0 :(得分:4)
在Lua中,字符串文字正是仅该字符串。字符串对变量,全局环境,局部变量等一无所知。它们只是字符串。 Lua中的字符串"filename"
将始终是一个包含8个字符的字符串。它不会出去并试图找到一个名为filename
的变量并从中提取一些东西。
你想要的是从多个字符串中构建一个字符串。字符串的一部分来自文字,部分来自变量。 Lua有几个工具。最简单的是..
连接运算符:
[["C:\Sox\sox.exe" -S ]] .. filename .. [[ -r 22050 C:\Sox\SoX_out.wav]]
这将从字符串文字构建一个新字符串,filename
变量的内容和另一个字符串文字。你在第一个文字的末尾和第二个文字的开头看到的空格是必要的,因为Lua不会在两个连接的部分之间插入空格。
对于更复杂的情况,仅构建参数表并使用table.concat
从中构建字符串非常有用:
local params =
{
[[C:\Sox\sox.exe]],
"-S",
filename,
"-r 22050",
[[C:\Sox\SoX_out.wav]]
}
os.execute(table.concat(params, " "))
请注意字符串文字中缺少空格。这是因为table.concat
的第二个参数是要在数组中的条目之间插入的字符串。所以每个数组元素之间将是一个空格;我们不需要手动添加它们。